cmd.exe 在使用 CreateProcess 调用后立即关闭

Posted

技术标签:

【中文标题】cmd.exe 在使用 CreateProcess 调用后立即关闭【英文标题】:cmd.exe immediately closes after calling with CreateProcess 【发布时间】:2018-02-24 15:55:32 【问题描述】:

我正在尝试使用 CreateProcess 函数执行批处理文件,但是 cmd.exe 立即关闭,而没有打开正在执行的批处理文件。

还传递了一个参数(目录的路径)。

c++代码是:

int main()

    std::wstring cmdPath;
    std::wstring batchFile;
    batchFile = L"\"B:\\code\\Batch\\all_files.bat\"";
    std::wstring args = L"\"B:\\code\\Batch\"";

    
        wchar_t cmdP[500] = L"  ";
        GetEnvironmentVariable(L"COMSPEC", cmdP, 500);
        cmdPath = cmdP;
    

    std::wstring CmdLine = L"/c " + batchFile + L" " + args;

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
    if (!
        CreateProcess
        (
            cmdPath.c_str(),
            const_cast<LPWSTR>(CmdLine.c_str()),
            NULL, NULL, FALSE,
            CREATE_NEW_CONSOLE,
            NULL, NULL,
            &si,
            &pi
        )
        )
    
        std::cout << "bad";
        std::cin.get();
        return 1;
    
    std::cout << "yay......\n";
    std::cin.get();
    return 0;

批处理文件是

echo hello.

set directory=%~1

cd %directory%

dir > files.txt

pause

exit 0

输出

yay......

得到了但是文件files.txt也得到了echo hello.的输出。

【问题讨论】:

使用 /k 而不是 /c,这样你就可以看到出了什么问题。 @HansPassant 谢谢我看看有什么问题 【参考方案1】:

答案似乎是需要用引号将整个命令行(\c 除外)括起来。

因此程序变为:

int main()

    std::wstring cmdPath;
    std::wstring batchFile;
    batchFile = L"\"B:\\Harith Source code\\Batch\\all_files.bat\"";
    std::wstring args = L"\"B:\\Harith Source code\\Batch\"";

    
        wchar_t cmdP[500] = L"  ";
        GetEnvironmentVariable(L"COMSPEC", cmdP, 500);
        cmdPath = cmdP;
    

    std::wstring CmdLine = L"/c " + std::wstring(L"\"") + batchFile + L" " + args + L"\"";

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
    if (!
        CreateProcess
        (
            cmdPath.c_str(),
            const_cast<LPWSTR>(CmdLine.c_str()),
            NULL, NULL, FALSE,
            CREATE_NEW_CONSOLE,
            NULL, NULL,
            &si,
            &pi
        )
        )
    
        std::cout << "bad";
        std::cin.get();
        return 1;
    
    std::cout << "yay......\n";
    std::cin.get();
    return 0;

编辑:对于最终代码,我将 /k 改回 /c

【讨论】:

以上是关于cmd.exe 在使用 CreateProcess 调用后立即关闭的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CreateProcess 中的 cmd.exe 的行为与 DOS 提示符不同?

CreateProcess cmd.exe 读/写管道死锁

CreateProcess() API 函数有啥用?

如何使用 CreateProcess 函数正确调用“telnet”?

使用 CreateProcess 运行带空格的 bat

使用 createProcess() 运行批处理文件