从批处理文件启动时,Visual Studio 2017 命令行工具不起作用

use*_*938 5 windows cmd batch-file visual-studio

我遇到了一个非常奇怪的行为,旧的批处理文件在 Windows XP 下运行良好。为什么hello.c在cmd窗口中通过批处理文件编译(Vs2017 + Win10)下的简单文件时不起作用?

当意识到Win10有新的安全策略时,我在微软网站上阅读了一些文章。他们建议使用开发人员命令行窗口进行命令行编译。

确实,手动操作效果很好。但是当我以超级管理员身份登录Win10并尝试通过批处理文件运行所有内容时,它不起作用,只是完成了环境配置。

手动运行批处理文件中的命令时,一切都按预期工作(成功生成可执行文件)。这有什么问题?

这是批处理文件的内容:

%comspec% /k "C:\Program Files(x86)\Microsoft Visual Studio\2017  \Community\VC\Auxiliary\Build\vcvars64.bat"
cd g:\testdir
g: 
cl TestBatFileCompile.c
Run Code Online (Sandbox Code Playgroud)

Cri*_*ati 1

初步说明

  • vcvars64.bat只是调用vcvarsall.bat并将x64参数传递给它,后跟它自己的参数(如果有)
  • vcvarsall.bat主要设置VStudio构建工具工作所需的一些环境变量(set VSCMD_DEBUG=3在运行之前,用于详细输出) 。检查[MS.Docs]:在命令行上构建 C/C++ 代码以了解更多详细信息

为了更清楚起见,我增强/简化了您的示例:

脚本.bat

@echo off

echo Running vcvars...
%comspec% /K "c:\Install\x86\Microsoft\Visual Studio Community\2017\VC\Auxiliary\Build\vcvarsall.bat" x64
echo Ran vcvars: %ERRORLEVEL%

echo Running cl...
cl /nologo dummy.c /link /NOLOGO
echo Ran cl: %ERRORLEVEL%
Run Code Online (Sandbox Code Playgroud)

虚拟.c

int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出

e:\Work\Dev\StackOverflow\q053523085>dir /b
dummy.c
script.bat

e:\Work\Dev\StackOverflow\q053523085>script.bat
Running vcvars...
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.2
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'

e:\Work\Dev\StackOverflow\q053523085>rem HMMM, SOMETHING DOESN'T SEEM QUITE RIGHT. LET'S TRY EXITING CMD...

e:\Work\Dev\StackOverflow\q053523085>exit
Ran vcvars: 0
Running cl...
'cl' is not recognized as an internal or external command,
operable program or batch file.
Ran cl: 9009
Run Code Online (Sandbox Code Playgroud)

发生了什么?

  • cmd /K( [MS.Docs]: Cmd )在现有的 cmd 实例之上 打开一个新的cmd实例(使用相同的窗口)
    • vcvarsall在这个(第二)实例中被调用,完成了它的工作并完成了,事情似乎已经悬而未决
  • 但是在输入exit后,事实证明cl确实运行了,但是在第一个cmd 实例(如果你愿意的话,在后台),并且由于变量之前不是由vcvarsall设置的,所以它失败了

为了使事情正常工作,请使用[MS.Docs]调用vcvarsall : call :

call "c:\Install\x86\Microsoft\Visual Studio Community\2017\VC\Auxiliary\Build\vcvarsall.bat" x64
Run Code Online (Sandbox Code Playgroud)

输出(在新的cmd窗口中):

e:\Work\Dev\StackOverflow\q053523085>dir /b
dummy.c
script.bat

e:\Work\Dev\StackOverflow\q053523085>script.bat
Running vcvars...
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.2
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
Ran vcvars: 0
Running cl...
dummy.c
Ran cl: 0
e:\Work\Dev\StackOverflow\q053523085>dir /b
dummy.c
dummy.exe
dummy.obj
script.bat
Run Code Online (Sandbox Code Playgroud)