如何将带有空格作为参数的路径添加到CreateProcess批处理文件中

How to add a path with spaces as an arguments to CreateProcess batch file?

本文关键字:添加 路径 CreateProcess 批处理文件 参数 空格      更新时间:2023-10-16

我正试图将一个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"");