我试图将一个在 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;
}
最佳答案
问题是/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""
)
关于c++ - 如何添加带有空格的路径作为 CreateProcess 批处理文件的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25940168/