![](/img/trans.png)
[英]How to read output from cmd.exe using CreateProcess() and CreatePipe()
[英]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使用(混合) WriteFile
和WriteConsoleW
进行输出。 一些信息通过WriteFile
输出,一些信息通过WriteConsoleW
在 windows10 上:
powershell使用ReadFile
获取输入。 和WriteFile
用于输出。 所以它从管道读取你的命令并将结果写入它。 和所有完美的工作。 您还可以注意到控制台窗口在这种情况下处于非活动状态 - 您不能向其输入任何文本(与 win7 不同)
所以用代码绝对没问题。 问题仅在于第三个程序如何读写数据。 如果它没有从您的管道中读取 - 您在这里无能为力
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.