繁体   English   中英

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

[英]Cannot read output of processes launched under cmd.exe pipe

我希望你的编程进展顺利。

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

我已经使用了这个问题的代码 - CreateProcess cmd.exe read/write pipe 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 等解释? 谢谢你的帮助!

你 exec cmd.exe并通过管道向它发送命令到 exec powershell 那么一切都取决于powershell的实现

在窗口 7 上:

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

在 windows10 上:

powershell使用ReadFile获取输入。 WriteFile用于输出。 所以它从管道读取你的命令并将结果写入它。 和所有完美的工作。 您还可以注意到控制台窗口在这种情况下处于非活动状态 - 您不能向其输入任何文本(与 win7 不同)

所以用代码绝对没问题。 问题仅在于第三个程序如何读写数据。 如果它没有从您的管道中读取 - 您在这里无能为力

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM