调用vcvarsall.bat后执行nmake提示‘nmake未被识别’的问题
解决PowerShell调用vcvarsall.bat后nmake无法识别的问题
我一眼就看出问题所在了——你直接在PowerShell里调用vcvarsall.bat的时候,这个批处理是在单独的cmd.exe进程里运行的,它修改的环境变量只在那个临时进程里生效,根本不会传递回你的PowerShell会话。所以当你后续在PowerShell里执行nmake时,用的还是原来的环境变量,自然找不到这个命令。
下面给你几个靠谱的解决方案,按实用性排序:
方案1:把vcvarsall的环境变量导入到PowerShell会话
这个方法能让你在当前PowerShell里持续使用配置好的环境,适合需要执行多个后续命令的场景:
$VCVARSALLBAT = "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" # 调用vcvarsall并导出环境变量,再解析导入到当前PowerShell $envVars = & cmd.exe /c "`"$VCVARSALLBAT`" x86_amd64 && set" foreach ($var in $envVars) { if ($var -match "^(.*?)=(.*)$") { $name = $matches[1] $value = $matches[2] [Environment]::SetEnvironmentVariable($name, $value, "Process") } } # 现在试试nmake,应该能正常识别了 nmake /?
原理很简单:用cmd.exe /c执行批处理后,立刻用set命令输出所有环境变量,然后在PowerShell里逐行解析这些输出,把环境变量设置到当前进程的环境中。
方案2:在同一个cmd进程里连带着执行nmake
如果你的需求只是执行一次nmake,不需要保留环境变量,直接把两个命令放在同一个cmd调用里就行:
$VCVARSALLBAT = "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" # 让vcvarsall和nmake在同一个cmd进程里运行,环境变量共享 & cmd.exe /c "`"$VCVARSALLBAT`" x86_amd64 && nmake [你的具体参数]"
这种方式最简洁,不需要额外处理环境变量,一步到位。
方案3:直接用Visual Studio开发者PowerShell
其实微软早就为你考虑好了——Visual Studio自带了开发者PowerShell,它会自动加载vcvars的环境配置,根本不需要你手动调用批处理。
你可以直接从开始菜单打开"Developer PowerShell for VS 2017",或者在普通PowerShell里执行这个脚本启动:
& "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\Launch-VsDevShell.ps1"
启动后直接就能用nmake,省心又省力。
额外注意点
- 先确认你的Visual Studio安装了Visual C++ build tools组件,nmake是这个组件的一部分,没装的话哪怕环境变量对了也找不到。
- 检查
vcvarsall.bat的路径是否正确,不同版本的VS路径会有差异,比如2019/2022的路径和2017就不一样。
内容的提问来源于stack exchange,提问作者devopsfun
相关产品推荐
相关产品推荐

