如何将带有空格的路径作为参数添加到 CreateProcess 批处理文件?
Posted
技术标签:
【中文标题】如何将带有空格的路径作为参数添加到 CreateProcess 批处理文件?【英文标题】:How to add a path with spaces as an arguments to CreateProcess batch file? 【发布时间】:2014-09-19 18:23:59 【问题描述】:我正在尝试将 i 中带有空格的参数传递给我通过 CreateProcess() 运行的批处理文件。如何指定整个对象是一个参数?
std::wstring args = TEXT("/C \"C:\\setup.bat\" C:\\TEST TEST");
在上面的示例中,我的批处理文件将第一个参数读取为 C:\TEST。
而且,这不起作用(批处理文件立即退出并且不运行):
std::wstring args = TEXT("/C \"C:\\setup.bat\" \"C:\\TEST TEST\"");
这是完整的代码:
#include <iostream>
#define WINDOWS_LEAN_AND_MEAN
#include <Windows.h>
#include <strsafe.h>
#include <string>
#include <UserEnv.h>
#include <vector>
#define BUFSIZE 4096
#pragma comment(lib, "userenv.lib")
std::wstring GetEnvString()
wchar_t* env = GetEnvironmentStrings();
if (!env)
abort();
const wchar_t* var = env;
size_t total_len = 0;
size_t len;
while ((len = wcslen(var)) > 0)
total_len += len + 1;
var += len + 1;
std::wstring result(env, total_len);
FreeEnvironmentStrings(env);
return result;
int main()
LPVOID env;
if (!CreateEnvironmentBlock(&env, NULL, FALSE))
std::cout << "FAILURE" << std::endl;
system("PAUSE");
abort();
PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(pi));
STARTUPINFO si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
std::wstring program = TEXT("C:\\Windows\\System32\\cmd.exe");
std::wstring args = TEXT("/C");
args.append(TEXT(" \"C:\\setup.bat\""));
args.append(TEXT(" C:\TEST TEST"));
std::vector<wchar_t> buf(args.begin(), args.end());
buf.push_back(0);
if (!CreateProcess(program.c_str(), buf.data(), NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, env, NULL, &si, &pi))
std::cout << "FAILURE" << std::endl;
system("pause");
abort();
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
DestroyEnvironmentBlock(env);
if (!CreateEnvironmentBlock(&env, NULL, FALSE))
std::cout << "FAILURE" << std::endl;
abort();
return 0;
【问题讨论】:
【参考方案1】:问题是 /C 参数需要用引号括起来的整个参数(如果它包含空格)。
所以,你需要cmd /c ""c:\setup.bat" "c:\test test""
(或至少cmd /c "c:\setup.bat "c:\test test""
)而不是cmd /c "c:\setup.bat" "c:\test test"
【讨论】:
【参考方案2】:想通了:
std::wstring args = TEXT("/C");
args.append(TEXT(" \"\"C:\\setup.bat\""));
args.append(TEXT(" \"C:\\TEST TEST\""));
我认为这最终会执行以下操作: cmd.exe "C:\setup.bat "C:\Test Test""
【讨论】:
【参考方案3】:这个怎么样:
std::wstring args = TEXT("/C \"C:\\setup.bat\" \"C:\\TEST\ TEST\"");
【讨论】:
"\ "
(带空格)不是有效的escape sequence。
删除转义的空间,它应该可以工作。您所需要的只是路径周围的引号和空格。
std::wstring args = TEXT("/C \"C:\\setup.bat\" "C:\\TEST TEST""); ???那是行不通的。 C:\\TEST 之前的 " 结束 TEXT(" 之后的 "以上是关于如何将带有空格的路径作为参数添加到 CreateProcess 批处理文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用带有路径的“开始”和带有空格的命令在 Windows 中创建批处理文件