You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:01:18