如何将PowerShell与Visual Studio命令提示符一起使用?

时间:2010-01-23 21:11:45

标签: visual-studio-2010 visual-studio powershell

我已经使用Beta 2了一段时间了,这让我疯狂,因为在运行VS2010命令提示符时我必须向cmd.exe发挥作用。我以前有一个很好的vsvars2008.ps1脚本用于Visual Studio 2008.任何人都有vsvars2010.ps1或类似的东西?

10 个答案:

答案 0 :(得分:205)

从这里自由地偷窃: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不再存在。相反,您可以使用vsvars32.bat文件,该文件位于Common7 \ Tools文件夹中。

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

答案 1 :(得分:25)

最简单的选项是运行VS 2010命令提示符,然后启动PowerShell.exe。如果你真的想从你的“home”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模块的版本中提供。

答案 2 :(得分:17)

我找到了一个简单的方法here:修改快捷方式。

原始快捷方式是这样的:

%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。

  

screenshot

答案 3 :(得分:16)

一个古老的问题,但值得另一个答案(a)提供VS2013支持; (b)结合前两个答案中的最佳答案; (c)提供功能包装。

这建立在@ Andy的技术基础之上(基于Allen Mack的技术,正如Andy指出的那样(反过来建立在Robert Anderson的技术上,正如Allen指出的那样(所有这些技术都有一个轻微的故障,如本页所示,用户只知道为“我 - ”,所以我也考虑到了这一点)))。

这是我的最终代码 - 注意在正则表达式中使用非贪婪量词来处理值中任何可能的嵌入等于。这也恰好简化了代码:单个匹配而不是匹配然后在Andy的示例中进行拆分,或者匹配,然后是indexof和substrings,如“我 - ”的示例中所示。)

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
}

答案 4 :(得分:8)

Keith已经提到了PowerShell社区扩展(PSCX)及其Invoke-BatchFile命令:

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

我还注意到PSCX还有一个Import-VisualStudioVars函数:

Import-VisualStudioVars -VisualStudioVersion 2013

答案 5 :(得分: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

答案 6 :(得分: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

答案 7 :(得分:0)

我喜欢将命令传递给子shell,如下所示:

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

或者

cmd /c "`"${env:VS140COMNTOOLS}..\..\VC\vcvarsall.bat`" amd64 && <someCommand> && <someOtherCommand>"  

答案 8 :(得分:0)

作为对Andy S的回答的扩展,它已针对VS 2019社区进行了更新。但是,我还需要64位,因此对于需要它们的任何人,它也包含-arch=amd64-host_arch=amd64标志。

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

答案 9 :(得分:0)

以下命令对我有用(Windows 10 | MS Build Tools 16.9.5 | PowerShell 5.1.19041,7.1.3)。从 PS 运行:

Import-Module 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\Common7\Tools\Microsoft.VisualStudio.DevShell.dll'; Enter-VsDevShell 1652063a -DevCmdArguments '-arch=x64'

或者您可以使用以下 target 创建快捷方式:

<path to your powershell.exe> -noe -c "&{Import-Module """C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"""; Enter-VsDevShell 1652063a -DevCmdArguments '-arch=x64'}"

显然,如果您需要 x86 工具集,请删除 -arch=x64