无法读取cmd.exe管道下启动的进程的输出

时间:2017-10-13 14:44:53

标签: c++ winapi visual-c++ cmd

我希望你的节目进展顺利。

我有一个问题,我希望由于我缺乏知识而提出一个简单的答案。

我已使用此问题的代码 - CreateProcess cmd.exe read/write pipes deadlock

一切都运作良好。

问题是当我从cmd.exe shell运行需要交互性的其他命令时,例如python或powershell,我得到初始输出,然后没有任何内容写入管道。

所以这就是我的输入/输出:

static PCSTR commands[] = { "powershell\r\n", "dir\r\n", "help\r\n"};
ULONG n = RTL_NUMBER_OF(commands);
PCSTR* psz = commands;
do 
{
    if (MessageBoxW(0,0, L"force close ?", MB_YESNO) == IDYES)
    {
        DisconnectNamedPipe(hFile);
        break;
    }
    if (p = new U_IRP(&obj))
    {
        PCSTR command = *psz++;
        p->Write(command, (ULONG)strlen(command) * sizeof(CHAR));
        p->Release();
    }
} while (--n)

当代码运行时,我得到了最初的powershell.exe提示

PS C:\Users>

但之后没有任何东西写入管道。

代码正在使用CreateProcess(...“cmd.exe”...)我尝试将其从“cmd.exe”更改为“cmd.exe / c”和“cmd.exe / k”,两者都不起作用。

也许你会知道我需要做什么来读取/写入输出到解释,如来自CreateProcess()诱导管道的python或powershell?谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

你执行 cmd.exe 并通过管道发送命令给exec powershell 。所有这些都取决于 powershell 实现

在window7上

powershell 使用ReadConsoleW获取输入。所以它不使用你命名管道 - 不读取它。并且您可以注意到在执行 powershell 之后控制台窗口变为交互式。所以 powershell 不接受你写给管道的内容(它根本就没有读取它),而是从屏幕上读取用户输入。但是在手动输入一些命令到控制台并按回车键后 - 你可以得到管道输出 - powershell 使用(混合) - WriteFileWriteConsoleW输出。一些信息通过WriteFile输出,一些通过WriteConsoleW

输出 在windows10上

powershell 使用ReadFile获取输入。和WriteFile输出。所以它从管道读取命令并将结果写入它。一切都很完美。您也可以注意到,在这种情况下控制台窗口处于非活动状态 - 您无法输入任何文本(与win7不同)

所以使用代码绝对可以。问题只在于第3个程序如何读写数据。如果它没有从您的烟斗中读取 - 您无能为力