c++ - 从 GUI 应用程序运行带有 CreateProcess 的 .bat 脚本会导致 "The filename, directory name, or volume label syntax is incorrect."错误

标签 c++ windows batch-file winapi cmd

我的目标是在不显示控制台窗口的情况下运行命令行批处理脚本(从 .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.

enter image description here

cmd.exe 返回错误代码1

那么我在这里缺少什么?

编辑:抱歉,忘了说,我是从 GUI 进程调用它的。

最佳答案

伙计们,我想我明白了。这也太蠢了。答案与 C++CreateProcesscmd.exe 无关。它是 Windows 10。我最近刚从笔记本电脑上的 Windows 7 切换到它。所以这是一个“非学习曲线”

我将它发布在这里以防其他人遇到他们添加到 Windows 资源管理器中的这个愚蠢的东西(我不确定它是在 Windows 10 还是 8.1 中)这样你就不会浪费一天的时间来尝试修复如此愚蠢的东西!

无论如何,我在 Windows 7 中获取文件路径的方式是在 Windows 资源管理器中右键单击它,然后转到 Properties,然后是 Security 并从 Object Name 字段复制它:

enter image description here

嗯,你猜怎么着?现在有一个 LEFT-TO-RIGHT EMBEDDING Unicode character 202A)坐在开头,那个 Explorer 非常愿意与路径的其余部分一起复制。此外,当您将它粘贴到您的源文件中时,它会变得不可见。到那时,祝你好运,找出为什么你的代码不起作用。

这是字符串的十六进制 View (在我将它保存在 Unicode 文本文件中之后,所以第一个 FEFF 是 BOM 标记):

enter image description here

我也是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/

相关文章:

javascript - 使用 CSV 批量上传到 Azure 存储

c++ - 如何将 C++ 模型的实验版本与黄金引用进行比较?

c++ - 如何在 doxygen 中记录生成的构造函数

windows - 你如何在 windows git bash 中设置 java 版本?

windows - 为什么 "start firefox"命令在 Windows 命令提示符下有效?

windows - 为什么使用 echo 替换 .txt 文件中的旧文本?

c++ - WaitForSingleObject 中的 Windows C++ 应用程序错误

c++ - 'winbase.h'中的编译错误

python - 在 Python 中,如何获取文件的正确大小写路径?

windows - windbg 转储命令失败,出现错误 0x8007012b