从powershell调用vcvarsall.bat后运行生成脚本

从powershell调用vcvarsall.bat后运行生成脚本,c,visual-studio,powershell,cmd,build,C,Visual Studio,Powershell,Cmd,Build,我正在尝试运行Visual Studio(developer cmd prompt)环境变量设置批处理文件,然后从Powershell脚本中运行生成脚本,如下所示: # Invokes a Cmd.exe shell script and updates the environment. function Invoke-CmdScript { param( [String] $scriptName ) $cmdLine = """$scriptName"" $args &am

我正在尝试运行Visual Studio(developer cmd prompt)环境变量设置批处理文件,然后从Powershell脚本中运行生成脚本,如下所示:

# Invokes a Cmd.exe shell script and updates the environment.
function Invoke-CmdScript {
  param(
    [String] $scriptName
  )
  $cmdLine = """$scriptName"" $args & set"
  & $Env:SystemRoot\system32\cmd.exe /c $cmdLine |
  select-string '^([^=]*)=(.*)$' | foreach-object {
    $varName = $_.Matches[0].Groups[1].Value
    $varValue = $_.Matches[0].Groups[2].Value
    set-item Env:$varName $varValue
  }
}
cmd/v:on/k“(“C:\ProgramFiles(x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat”“amd64\U x86&&C:\buildscript.cmd--构建选项)”

但是,vcvarsall.bat建立的环境设置似乎不会保留在构建脚本调用中。i、 e.没有默认的编译器设置等


/k
开关组合的
/v:on
是否实际使用了相同的cmd会话并适当延迟了环境变量扩展?也许这种方法是错误的

问题在于,当您运行
cmd.exe
以运行批处理文件时,变量会在
cmd.exe
的实例中设置,但在该实例终止后它们会消失

要解决此问题,可以使用本文中的Invoke CmdScript函数:

功能如下:

# Invokes a Cmd.exe shell script and updates the environment.
function Invoke-CmdScript {
  param(
    [String] $scriptName
  )
  $cmdLine = """$scriptName"" $args & set"
  & $Env:SystemRoot\system32\cmd.exe /c $cmdLine |
  select-string '^([^=]*)=(.*)$' | foreach-object {
    $varName = $_.Matches[0].Groups[1].Value
    $varValue = $_.Matches[0].Groups[2].Value
    set-item Env:$varName $varValue
  }
}
您可以将此函数添加到PowerShell配置文件或将其用作脚本文件

定义函数后,可以运行命令:

Invoke-CmdScript "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64_x86
C:\buildscript.cmd --build-options
…或者你需要的任何东西


这篇文章还介绍了两个函数,可以让您轻松地保存和恢复环境变量。

&&
之后,
/K
开关不应该保留执行后续命令的环境吗?因为这两个命令都是在同一个
cmd
会话中调用的吗?我更愿意解决实际问题-从执行的
cmd.exe
批处理文件中导出环境变量-而不是处理
cmd.exe
命令语法的神秘特性。这很公平。将此作为解决方案-希望具有一些神秘CMD知识的人会弹出解决方案。我要补充的是,将变量导出到PowerShell意味着您可以运行其他构建步骤,而不会变得太“黑”。您也可以在运行
调用CmdScript
之前使用
获取环境
函数,然后使用
Restore Environment
函数清理变量。