c++ - 如何添加带有空格的路径作为 CreateProcess 批处理文件的参数?

标签 c++ batch-file arguments createprocess

我试图将一个在 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/

相关文章:

c++ - 将静态库封装在动态链接库 (DLL) 中

windows - 需要关机脚本 : Check date if Wednesday run batch script

batch-file - 批处理 : Copy list of files to another folder

python - 函数恰好需要 2 个参数(给定 4 个)

java - 我无法弄清楚为什么我的程序的一部分在继续执行下一个语句之前循环了 4 次

c++ - 概念可以与模板模板参数一起使用吗?

c++ - 在 C++ 语言版本和标准库依赖项方面 boost 要求

c - 如果函数接受大量参数或单个结构,性能方面是否存在差异?

c++ - 在 QuickFIX/C++ 中混合类型

batch-file - 使用批处理文件在 Windows 中生成 GUID