[visual-studio-2010] Visual Studio 명령 프롬프트에서 PowerShell을 어떻게 사용할 수 있습니까?

나는 한동안 베타 2를 사용해 왔으며 VS2010 명령 프롬프트를 실행할 때 cmd.exe를 실행해야한다는 사실을 깨닫게되었습니다. 저는 Visual Studio 2008을위한 멋진 vsvars2008.ps1 스크립트를 가지고있었습니다. 누구든지 vsvars2010.ps1 또는 이와 유사한 것을 가지고 있습니까?



답변

여기에서 자유롭게 훔치기 : http://allen-mack.blogspot.com/2008/03/replace-visual-studio-command-prompt.html , 나는 이것을 작동시킬 수있었습니다. 내 profile.ps1에 다음을 추가했고 모든 것이 세상과 잘 어울립니다.

pushd 'c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC'
cmd /c "vcvarsall.bat&set" |
foreach {
  if ($_ -match "=") {
    $v = $_.split("="); set-item -force -path "ENV:\$($v[0])"  -value "$($v[1])"
  }
}
popd
write-host "`nVisual Studio 2010 Command Prompt variables set." -ForegroundColor Yellow

이것은 Visual Studio 2015까지 수년 동안 잘 작동했습니다. vcvarsall.bat는 더 이상 존재하지 않습니다. 대신 Common7 \ Tools 폴더에있는 vsvars32.bat 파일을 사용할 수 있습니다.

pushd 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools'
cmd /c "vsvars32.bat&set" |
foreach {
  if ($_ -match "=") {
    $v = $_.split("="); set-item -force -path "ENV:\$($v[0])"  -value "$($v[1])"
  }
}
popd
write-host "`nVisual Studio 2015 Command Prompt variables set." -ForegroundColor Yellow

Visual Studio 2017에서 상황이 다시 변경 vsvars32.bat되었습니다 VsDevCmd.bat.. 정확한 경로는 사용중인 Visual Studio 2017 버전에 따라 다를 수 있습니다.

pushd "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools"
cmd /c "VsDevCmd.bat&set" |
foreach {
  if ($_ -match "=") {
    $v = $_.split("="); set-item -force -path "ENV:\$($v[0])"  -value "$($v[1])"
  }
}
popd
Write-Host "`nVisual Studio 2017 Command Prompt variables set." -ForegroundColor Yellow


답변

가장 간단한 옵션은 VS 2010 명령 프롬프트를 실행 한 다음 PowerShell.exe를 시작하는 것입니다. “홈”PowerShell 프롬프트에서이 작업을 수행하려는 경우 표시되는 접근 방식이 바로 갈 길입니다. 나는 Lee Holmes가 얼마 전에 쓴 스크립트를 사용합니다.

<#
.SYNOPSIS
   Invokes the specified batch file and retains any environment variable changes
   it makes.
.DESCRIPTION
   Invoke the specified batch file (and parameters), but also propagate any
   environment variable changes back to the PowerShell environment that
   called it.
.PARAMETER Path
   Path to a .bat or .cmd file.
.PARAMETER Parameters
   Parameters to pass to the batch file.
.EXAMPLE
   C:\PS> Invoke-BatchFile "$env:VS90COMNTOOLS\..\..\vc\vcvarsall.bat"
   Invokes the vcvarsall.bat file to set up a 32-bit dev environment.  All
   environment variable changes it makes will be propagated to the current
   PowerShell session.
.EXAMPLE
   C:\PS> Invoke-BatchFile "$env:VS90COMNTOOLS\..\..\vc\vcvarsall.bat" amd64
   Invokes the vcvarsall.bat file to set up a 64-bit dev environment.  All
   environment variable changes it makes will be propagated to the current
   PowerShell session.
.NOTES
   Author: Lee Holmes
#>
function Invoke-BatchFile
{
   param([string]$Path, [string]$Parameters)

   $tempFile = [IO.Path]::GetTempFileName()

   ## Store the output of cmd.exe.  We also ask cmd.exe to output   
   ## the environment table after the batch file completes  
   cmd.exe /c " `"$Path`" $Parameters && set > `"$tempFile`" "

   ## Go through the environment variables in the temp file.
   ## For each of them, set the variable in our local environment.
   Get-Content $tempFile | Foreach-Object {
       if ($_ -match "^(.*?)=(.*)$")
       {
           Set-Content "env:\$($matches[1])" $matches[2]
       }
   }

   Remove-Item $tempFile
}

참고 :이 기능은 곧 출시 될 PowerShell Community Extensions 2.0 모듈 기반 릴리스에서 사용할 수 있습니다 .


답변

여기서 간단한 방법을 찾았습니다 . 바로 가기를 수정합니다.

원래 단축키는 다음과 같습니다.

%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat""

다음 & powershell과 같이 마지막 인용문 앞에 추가하십시오 .

%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat" & powershell"

PS처럼 보이게 하려면 바로 가기 속성 의 색상 탭으로 이동 하여 빨강, 녹색 및 파랑 값을 각각 1, 36 및 86으로 설정합니다.

스크린 샷


답변

오래된 질문이지만 (a) VS2013 지원을 제공합니다. (b) 이전 두 답변 중 가장 좋은 것을 결합합니다. 및 (c) 함수 래퍼를 제공합니다.

이것은 @Andy의 기술 (Andy가 지시 한대로 Allen Mack의 기술을 기반으로합니다. Allen이 지시 한대로 Robert Anderson의 기술을 기반으로합니다.이 기술은 모두이 페이지에 “me- – “, 그래서 그것을 고려했습니다))).

여기에 내 마지막 코드가 있습니다. 정규식에서 탐욕이없는 한정자를 사용하여 값에 포함 된 모든 가능한 같음을 처리합니다. 이는 코드를 단순화하기 위해 발생합니다. 일치 대신 단일 일치가 Andy의 예에서와 같이 분할되거나 “me–“의 예에서와 같이 indexof 및 하위 문자열이 일치합니다.

function Set-VsCmd
{
    param(
        [parameter(Mandatory, HelpMessage="Enter VS version as 2010, 2012, or 2013")]
        [ValidateSet(2010,2012,2013)]
        [int]$version
    )
    $VS_VERSION = @{ 2010 = "10.0"; 2012 = "11.0"; 2013 = "12.0" }
    $targetDir = "c:\Program Files (x86)\Microsoft Visual Studio $($VS_VERSION[$version])\VC"
    if (!(Test-Path (Join-Path $targetDir "vcvarsall.bat"))) {
        "Error: Visual Studio $version not installed"
        return
    }
    pushd $targetDir
    cmd /c "vcvarsall.bat&set" |
    foreach {
      if ($_ -match "(.*?)=(.*)") {
        Set-Item -force -path "ENV:\$($matches[1])" -value "$($matches[2])"
      }
    }
    popd
    write-host "`nVisual Studio $version Command Prompt variables set." -ForegroundColor Yellow
}


답변

Keith는 이미 Invoke-BatchFile다음 명령 과 함께 PSCX (PowerShell Community Extensions)를 언급했습니다 .

Invoke-BatchFile "${env:ProgramFiles(x86)}\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"

또한 PSCX에도 Import-VisualStudioVars기능 이 있음을 알았습니다 .

Import-VisualStudioVars -VisualStudioVersion 2013


답변

Andy S에게 그의 대답에 대한 찬사. 한동안 그의 솔루션을 사용해 왔지만 오늘 문제가 발생했습니다. 등호가있는 값은 등호에서 잘립니다. 예를 들어 다음과 같습니다.

JAVA_TOOL_OPTIONS=-Duser.home=C:\Users\Me

하지만 내 PS 세션은 다음과 같이보고했습니다.

PS C:\> $env:JAVA_TOOL_OPTIONS
-Duser.home

프로필 스크립트를 다음과 같이 수정하여이 문제를 해결했습니다.

pushd 'c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC'
cmd /c "vcvarsall.bat&set" |
foreach {
  if ($_ -match "=") {
    $i = $_.indexof("=")
    $k = $_.substring(0, $i)
    $v = $_.substring($i + 1)
    set-item -force -path "ENV:\$k"  -value "$v"
  }
}
popd


답변

2020 및 Visual Studio Code 1.41.1에서 여전히 어려움을 겪고있는 사람을 위해 여기에서 약간 벗어난 주제입니다.

위의 코드와 인터넷 (예 : https://help.appveyor.com/discussions/questions/18777-how-to-use-vcvars64bat-from-powershell) 의 모든 다른 부분을 사용 하고 단계별 접근 방식으로 관리했습니다. 아래 스크립트가 작동합니다.

VSCode “settings.json”에 저장되고 Code Runner 확장이 설치되어 있습니다.

Visual Studio 2015 / 14.0의 Microsoft (R) C / C ++ 최적화 컴파일러 버전 “cl.exe”사용 :

"code-runner.runInTerminal": true,
"code-runner.executorMap": {
  "cpp": "cd $dir; pushd \"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\"; cmd.exe /c \"call vcvarsall.bat x86_amd64 & set > %temp%\\vcvars.txt\"; Get-Content \"$env:temp\\vcvars.txt\" | Foreach-Object { if ($_ -match \"^(.*?)=(.*)$\") {   Set-Content \"env:\\$($matches[1])\" $matches[2]  }}; popd; cls; cl *.cpp; .\\\"$fileNameWithoutExt.exe\"; Write-Host -NoNewLine 'Press any key to continue...';  $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); del \"$fileNameWithoutExt.exe\"; del \"$fileNameWithoutExt.obj\""}

Visual Studio 2019 / 16.4.3의 Microsoft (R) C / C ++ 최적화 컴파일러 버전 “cl.exe”사용 :

"code-runner.runInTerminal": true,
"code-runner.executorMap": {
  "cpp": "cd $dir; pushd \"c:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Auxiliary\\Build\"; cmd.exe /c \"call vcvarsall.bat x86_amd64 & set > %temp%\\vcvars.txt\"; Get-Content \"$env:temp\\vcvars.txt\" | Foreach-Object { if ($_ -match \"^(.*?)=(.*)$\") {   Set-Content \"env:\\$($matches[1])\" $matches[2]  }}; popd; cls; cl *.cpp; .\\\"$fileNameWithoutExt.exe\"; Write-Host -NoNewLine 'Press any key to continue...';  $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); del \"$fileNameWithoutExt.exe\"; del \"$fileNameWithoutExt.obj\""}

HTH