我正在尝试将带空格的参数传递给通过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;
}发布于 2014-09-19 19:51:25
问题是,/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"")
发布于 2014-09-19 19:11:22
弄明白了:
std::wstring args = TEXT("/C");
args.append(TEXT(" \"\"C:\\setup.bat\""));
args.append(TEXT(" \"C:\\TEST TEST\""));我认为这样做的结果是: cmd.exe "C:\setup.bat "C:\ Test "“
发布于 2014-09-19 18:31:00
这个怎么样:
std::wstring args = TEXT("/C \"C:\\setup.bat\" \"C:\\TEST\ TEST\"");https://stackoverflow.com/questions/25940168
复制相似问题