Visual Studio 명령 프롬프트에서 PowerShell을 어떻게 사용할 수 있습니까?


119

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

답변:


223

여기에서 자유롭게 훔치기 : 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

6
이 동일한 기술이 Visual Studio 2012에서도 작동한다는 점에 유의하십시오. "Microsoft Visual Studio 10.0"을 "Microsoft Visual Studio 11.0"으로 변경하기 만하면됩니다.
Andy S

9
echo $Profileprofile.ps1의 의도 된 경로를 확인하려면 (만든 적이없는 경우)
Matt Stephenson

5
스크립트 자체가 훌륭하게 작동합니다. 그러나주의 사항 (아마도) : Visual Studio의 패키지 관리자 콘솔 자체가 PowerShell 호스트이므로이 스크립트도 여기에서 실행됩니다. PMC가 초기화 된 후 "디버깅없이 실행"또는 표준 Windows 콘솔을 실행하는 다른 기능이나 플러그인이 작동하지 않는다는 것을 알 때까지는 문제가되지 않는 것 같습니다. 이 문제를 해결하려면 "profile.ps1"에 대한이 답변에 스크립트를 저장하는 대신 "Microsoft.PowerShell_profile.ps1"에 저장하여 "적절한"PowerShell 세션에서만 실행되도록했습니다.
Chris Simmons

3
사용할 완벽한 환경 변수 (VS2015 용 VS140COMNTOOLS)가있을 때 경로를 하드 코딩하는 것은 정말 나쁜 습관입니다. 커스텀 VS 설치에서도 작동합니다.
Voo

5
환경 변수를 사용하려는 욕구에 감사하지만 이러한 변수는 변수를 추출하려는 배치 파일에 의해 초기화되는 것처럼 보입니다. 그 반대의 증거를 보게되어 기쁩니다. VsDevCmd.bat를 실행할 때까지 깨끗한 Visual Studio 2017 설치 및 VS150COMNTOOLS 환경 변수없이 Windows 10을 새로 설치했습니다.
Andy S

26

가장 간단한 옵션은 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 모듈 기반 릴리스에서 사용할 수 있습니다 .


22

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

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

%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으로 설정합니다.

스크린 샷


간단하고 매력처럼 작동합니다. 이 답변은 더 많은 찬성 투표가 필요합니다.
Mark Meuer 2015-06-25

2
내가 이것에 대해 싫어하는 유일한 점은 중복 cmd.exe 프로세스가로드 된 상태를 유지한다는 것입니다. 그 외에는 좋은 솔루션입니다.
orad

17

오래된 질문이지만 (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
}

PowerShell 2.0 호환성을 위해 param 섹션에는 다음이 필요합니다 [parameter(Mandatory=$true,.
sakra

1
좋지만 pushd / popd 없이는 더 좋을 것입니다. 그냥 같은 것을 사용cmd /c """$targetDir\vcvarsall.bat""&set"
스테인

9

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

4
PSCX 3.2.0부터 VS 2015는이 cmdlet에서 지원되지 않습니다. 나는 그것에 대한 문제 를 열었 습니다.
orad

3

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

안녕하세요 좋은 추가입니다. VS2015 / 17 버전으로 도 업데이트 하시겠습니까? 이것은 첫 번째 Google 결과이며 귀하의 추가가 사람들에게 도움이 될 것이라고 생각합니다.
Squirrelkiller

1

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


0

다음과 같이 명령을 자식 셸에 전달하고 싶습니다.

cmd /c "`"${env:VS140COMNTOOLS}vsvars32.bat`" && <someCommand>"

또는

cmd /c "`"${env:VS140COMNTOOLS}..\..\VC\vcvarsall.bat`" amd64 && <someCommand> && <someOtherCommand>"  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.