首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将带空格的路径添加到CreateProcess批处理文件中?

如何将带空格的路径添加到CreateProcess批处理文件中?
EN

Stack Overflow用户
提问于 2014-09-19 18:23:59
回答 3查看 1.6K关注 0票数 1

我正在尝试将带空格的参数传递给通过CreateProcess()运行的批处理文件。如何指定整个对象是一个参数?

代码语言:javascript
复制
std::wstring args = TEXT("/C \"C:\\setup.bat\" C:\\TEST TEST");

在上面的示例中,我的批处理文件将第一个参数读取为C:\TEST。

而且,这不起作用(批处理文件立即退出且不运行):

代码语言:javascript
复制
std::wstring args = TEXT("/C \"C:\\setup.bat\" \"C:\\TEST TEST\"");

以下是整个代码:

代码语言:javascript
复制
#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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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"")

票数 1
EN

Stack Overflow用户

发布于 2014-09-19 19:11:22

弄明白了:

代码语言:javascript
复制
std::wstring args = TEXT("/C");

args.append(TEXT(" \"\"C:\\setup.bat\""));
args.append(TEXT(" \"C:\\TEST TEST\""));

我认为这样做的结果是: cmd.exe "C:\setup.bat "C:\ Test "“

票数 0
EN

Stack Overflow用户

发布于 2014-09-19 18:31:00

这个怎么样:

代码语言:javascript
复制
std::wstring args = TEXT("/C \"C:\\setup.bat\" \"C:\\TEST\ TEST\"");
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25940168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档