如何在PowerShell会话中应用EWDK的SetupBuildEnv.cmd?
问题描述
我正在使用EWDK和msbuild构建驱动程序,现有一个可正常运行的build.cmd脚本,内容如下:
call <EWDK root>/BuildEnv\SetupBuildEnv.cmd cd <working directory> msbuild /t:build /p:...
在PowerShell中通过& build.cmd调用该脚本可以正常完成构建。但我想完全用PowerShell编写脚本,避免混合脚本语言,于是尝试直接在PowerShell中执行以下命令:
& <EWDK root>/BuildEnv\SetupBuildEnv.cmd & msbuild /t:build /p:...
结果构建失败了,原因是SetupBuildEnv.cmd中设置的环境变量没有保留在当前PowerShell会话中。由于该脚本是SDK自带的,我无法修改它,请问有没有办法直接在PowerShell中调用msbuild完成构建?
解决方案
方法1:让命令在同一个cmd进程中执行
利用cmd进程内环境变量可继承的特性,把整个构建流程放到同一个cmd调用里,PowerShell中写法如下:
cmd /c "call <EWDK root>\BuildEnv\SetupBuildEnv.cmd && cd <working directory> && msbuild /t:build /p:..."
这样SetupBuildEnv.cmd设置的环境变量会直接被后续的msbuild命令使用,不需要额外处理。
方法2:把cmd脚本的环境变量导入PowerShell会话
如果需要在PowerShell会话中保留这些环境变量供后续命令使用,可以通过读取cmd脚本执行后的环境变量输出,再导入到PowerShell中:
# 执行cmd脚本并输出所有环境变量 $envOutput = cmd /c "call <EWDK root>\BuildEnv\SetupBuildEnv.cmd && set" # 解析输出并设置到PowerShell进程环境中 foreach ($line in $envOutput) { if ($line -match '^([^=]+)=(.*)$') { $envName = $matches[1] $envValue = $matches[2] [Environment]::SetEnvironmentVariable($envName, $envValue, 'Process') } } # 切换工作目录并执行msbuild Set-Location <working directory> & msbuild /t:build /p:...
这个方法会把SetupBuildEnv.cmd设置的所有环境变量同步到当前PowerShell进程中,之后的命令都能正常使用这些变量。
方法3:使用EWDK自带的PowerShell初始化脚本
部分新版本的EWDK提供了PowerShell版本的环境初始化脚本(通常名为SetupBuildEnv.ps1),如果你的EWDK包中有这个脚本,可以直接执行它:
& "<EWDK root>\BuildEnv\SetupBuildEnv.ps1" Set-Location <working directory> & msbuild /t:build /p:...
这种方式不需要处理跨脚本环境变量的问题,是最简洁的方案。
内容的提问来源于stack exchange,提问作者Jack G
相关产品推荐
相关产品推荐

