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

标签 windows visual-studio batch-file cmd

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

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

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

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

批处理文件的内容如下:

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

最佳答案

初步说明:

  • vcvars64.bat 简单地调用 vcvarsall.bat 并将 x64 参数传递给它,然后是它自己的(如果有的话)
  • vcvarsall.bat 主要设置 VStudio 构建所需的一些环境变量(在运行它之前设置 VSCMD_DEBUG=3,用于详细输出)工作的工具。检查[MS.Docs]: Build C/C++ code on the command line了解更多详情

为了更加清晰,我增强/简化了您的示例:

script.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%

dummy.c:

int main() {
    return 0;
}

输出:

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

发生了什么?

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

要使事情正常进行,请使用 [MS.Docs]: call 调用 vcvarsall :

call "c:\Install\x86\Microsoft\Visual Studio Community\2017\VC\Auxiliary\Build\vcvarsall.bat" x64

输出(在新的 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

关于windows - 从批处理文件启动时,Visual Studio 2017 命令行工具不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53523085/

相关文章:

angular - 无法将数据绑定(bind)添加到 Angular 6 组件

windows - %USERPROFILE% 空间错误

Windows 批处理脚本 : Pipe text into a command line application

windows - 30000 毫秒后 Protractor 超时

windows - 抛出异常:System.Core.dll中的 'System.InvalidOperationException'

c# - 使用新的 csproj 格式时如何将 C# 程序集标记为符合 CLS?

visual-studio-2010 - 程序集绑定(bind)重定向和代码分析

windows - 批处理文件将特定行从一个文本文件复制到另一个文本文件

windows - Syntastic 在 Vim windows 7 中不起作用

c++ - 模态对话框中错误的父 HWND