如何将带有空格作为参数的路径添加到CreateProcess批处理文件中
How to add a path with spaces as an arguments to CreateProcess batch file?
我正试图将一个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""
)
想好了:
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"
这个怎么样:
std::wstring args = TEXT("/C "C:\setup.bat" "C:\TEST TEST"");
相关文章:
- 如何将更多文件夹添加到c++include路径
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 如何在内核中添加包含库的路径?
- 添加 #include 的搜索路径
- 如何永久地向 g++ 编译器添加路径?
- 在 Android Studio 中添加 C/C++ 的包含路径
- 如何在Qt pro文件中添加导出路径
- 为什么不按默认构造路径划分路径只是在 Visual Studio 中添加尾随分隔符?
- "-I" 和 "-L" 在添加到路径前面时是什么意思?
- 添加一个节点,并在通用树中的两个给定节点之间找到路径成本,其中c 中的儿童列表
- 如何在忍者上添加包含路径,并为VS 2019添加叮当
- gradle cmake在连接路径时添加意外的引号
- Visual Studio添加真正"global"默认包含路径
- 使用连接器 c++ 访问 MYSQL 数据库(如何将路径添加到我的标准搜索目录)
- 如何将我想在C 中使用的C库的库路径添加到环境中
- 如何添加相对于当前文件的头文件路径
- Ubuntu 16.04:无法将路径添加到ld_library_path
- QFileSystemWatcher:无法添加路径 C:(无法监视 Windows 驱动器)
- 安装GCC-4.9没有根添加路径和二进制文件和额外的
- 在DLL搜索路径中添加路径以帮助执行依赖于DLL的EXE