2014-09-19 38 views
0

我想通过一个空间在我的参数传递给我通过CreateProcess()运行的批处理文件。我如何指定整个对象是一个参数?如何使用空格将路径添加为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; 
} 

回答

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

-1

如何:

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

不,不工作:( – user2970916 2014-09-19 18:33:04

+0

' “\”'(中间有空格)不是一个有效的[转义序列(HTTP:/ /en.cppreference.com/w/cpp/language/escape) – 2014-09-19 18:33:54

+0

删除转义空格,它应该可以工作,所有你需要的是带空格的路径引号。 – 2014-09-19 18:39:23

0

想通了:

std::wstring args = TEXT("/C"); 

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

我想这最终做这样的事情:cmd.exe的“C:\ SETUP.BAT‘C:\ Test测试’,”

相关问题