从 C++ CreateProcess 开始 windows 批处理有不同的行为

Start windows batch from C++ CreateProcess has different behavior

环境:windows10、VS2013.

我有一个 C++ 应用程序,使用 Poco 框架 (Poco 1.7.6),我需要启动一些批处理文件。它没有问题,但对于特定的脚本,我无法弄清楚原因。 这个特定的脚本如下(我们称之为 buildMySolution.bat):

set BUILD_DIR=%~dp0
call "C:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
msbuild /p:Platform=%~1 /p:Configuration=%~2  %BUILD_DIR%\Mysolution.sln

如您所见,批处理文件只是编译了一个 VS2013 解决方案。不用说,如果从命令行启动,这个简单的批处理工作得很好。

问题是这个批次在驱动器 D: 中(在 D:\DevRoot\build\MySolution 中),当从我的应用程序启动时(也在 D:\ 驱动器中),我得到一个 "cannot find the path"第二行.

我在批处理中尝试了几个修改:比如强制 C:cd /D C: ...它可以转到 C: 但不能更进一步,它拒绝 cd 到包含 [=38 的目录=](同样,我知道路径是正确的,因为同一个脚本可以从命令行正常执行)。但是,通过 cd /D %BUILD_DIR%.

返回初始目录没有问题

要从我的 C++ 应用启动脚本,我使用这个:

Poco::ProcessHandle handleBuild = Poco::Process::launch(path_to_script, argsBuild);
handleBuild.wait();

Poco launch 只是 CreateProcessA() 的薄包装,我在他们的代码中没有看到任何特别之处 (Poco Process.cpp)。

我也尝试将工作目录指定为包含 vcvarsall.bat 的目录,但是 CreateProcess 失败了。

我刚刚找到了一个解决方案:我更改了行(在批处理 buildMySolution.bat 中):

call "C:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"

至:

call C:\PROGRA~2\micros~1.0\vc\vcvarsall.bat

信不信由你:使用 DOS 名称并删除引号就可以了!!!

错误或功能,我不确定...