我的目标是在不显示控制台窗口的情况下运行命令行批处理脚本(从 .bat
文件),并等待它完成运行后再继续。我正在使用 example from here .所以我想出了以下代码:
//NOTE: Error checks are omitted for brevity
//Get path to cmd.exe
WCHAR buffCmd[1024];
::GetEnvironmentVariable(L"ComSpec", buffCmd, 1024);
std::wstring runPath = buffCmd;
runPath = runPath + L" /C \"path-to\\test.bat\"";
LPWCH pEnvStrs = ::GetEnvironmentStrings();
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(si);
::CreateProcess(NULL, &runPath[0], NULL, NULL, FALSE,
/*CREATE_NO_WINDOW | */ //Will uncomment it when I make it work
CREATE_UNICODE_ENVIRONMENT,
pEnvStrs, NULL, &si, &pi);
HANDLE hProc = pi.hProcess;
::WaitForSingleObject(hProc, INFINITE);
DWORD dwProcExitCode = 0xCCCCCCCC;
::GetExitCodeProcess(hProc, &dwProcExitCode);
//Clean up
::FreeEnvironmentStrings(pEnvStrs);
::CloseHandle(pi.hThread);
::CloseHandle(pi.hProcess);
批处理test.bat
文件是这样的:
notepad
但是当我运行它并使用 /K
选项而不是 /C
来保持控制台打开时,我在控制台窗口中收到以下错误 CreateProcess
打开:
The filename, directory name, or volume label syntax is incorrect.
和cmd.exe
返回错误代码1
。
那么我在这里缺少什么?
编辑:抱歉,忘了说,我是从 GUI 进程调用它的。
最佳答案
伙计们,我想我明白了。这也太蠢了。答案与 C++
、CreateProcess
或 cmd.exe
无关。它是 Windows 10。我最近刚从笔记本电脑上的 Windows 7 切换到它。所以这是一个“非学习曲线”
。
我将它发布在这里以防其他人遇到他们添加到 Windows 资源管理器中的这个愚蠢的东西(我不确定它是在 Windows 10 还是 8.1 中)这样你就不会浪费一天的时间来尝试修复如此愚蠢的东西!
无论如何,我在 Windows 7 中获取文件路径的方式是在 Windows 资源管理器中右键单击它,然后转到 Properties
,然后是 Security
并从 Object Name
字段复制它:
嗯,你猜怎么着?现在有一个 LEFT-TO-RIGHT EMBEDDING Unicode character 202A)坐在开头,那个 Explorer 非常愿意与路径的其余部分一起复制。此外,当您将它粘贴到您的源文件中时,它会变得不可见。到那时,祝你好运,找出为什么你的代码不起作用。
这是字符串的十六进制 View (在我将它保存在 Unicode 文本文件中之后,所以第一个 FEFF
是 BOM 标记):
我也是found this文章中 Raymond Chen
一如既往地证明了它的使用。
所以最重要的是,不要从 Windows 10(或 8.1)的“属性”选项卡中复制路径!
所以 Christopher Oicles在对我的 OP 的评论中一直都是正确的。
附言。有趣的是,如果您只从 General
选项卡中复制文件夹路径,它的开头并没有那个 Unicode 字符。算了,微软!
关于c++ - 从 GUI 应用程序运行带有 CreateProcess 的 .bat 脚本会导致 "The filename, directory name, or volume label syntax is incorrect."错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42034200/