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

Posted

技术标签:

【中文标题】如何将带有空格的路径作为参数添加到 CreateProcess 批处理文件?【英文标题】:How to add a path with spaces as an arguments to CreateProcess batch file? 【发布时间】:2014-09-19 18:23:59 【问题描述】:

我正在尝试将 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;

【问题讨论】:

【参考方案1】:

问题是 /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"

【讨论】:

【参考方案2】:

想通了:

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""

【讨论】:

【参考方案3】:

这个怎么样:

std::wstring args = TEXT("/C \"C:\\setup.bat\" \"C:\\TEST\ TEST\"");

【讨论】:

"\ "(带空格)不是有效的escape sequence。 删除转义的空间,它应该可以工作。您所需要的只是路径周围的引号和空格。 std::wstring args = TEXT("/C \"C:\\setup.bat\" "C:\\TEST TEST""); ???那是行不通的。 C:\\TEST 之前的 " 结束 TEXT(" 之后的 "

以上是关于如何将带有空格的路径作为参数添加到 CreateProcess 批处理文件?的主要内容,如果未能解决你的问题,请参考以下文章

bash:以空格作为参数传递路径?

添加一个双空格作为分隔符

如何使用带有路径的“开始”和带有空格的命令在 Windows 中创建批处理文件

PowerShell 添加任务以使用参数运行 PowerShell 脚本

如何使用扫描仪在java中将输入作为带有空格的字符串

如何将 dll 配置文件添加到添加 dll 作为参考的项目中?