我希望你的编程进展顺利 .
我有一个问题,我希望由于我缺乏知识而得到一个简单的答案 .
我已经从这个问题中使用了这段代码 - 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 回答
你exec cmd.exe并通过管道发送命令到exec powershell . 所有这些都取决于PowerShell的实现
在window7上:
powershell使用
ReadConsoleW
获取输入 . 所以它不使用你命名管道 - 不读取它 . 并且您可以注意到在执行PowerShell之后控制台窗口变为交互式 . 所以powershell不接受你写给管道的东西(它根本就不是从它上面读取)而是从屏幕读取用户输入 . 然而,在手动输入一些命令到控制台并按下回车后 - 你可以得到管道输出 - powershell使用(混合)两者 -WriteFile
和WriteConsoleW
输出 . 一些信息通过WriteFile
输出,一些通过WriteConsoleW
输出在windows10上:
powershell使用
ReadFile
获取输入 . 和WriteFile
输出 . 所以它从管道读取命令并将结果写入它 . 一切都很完美 . 你也可以注意到在这种情况下控制台窗口处于非活动状态 - 你不能输入任何文本(与win7不同)所以用代码绝对没问题 . 问题只在于第3个程序如何读写数据 . 如果它没有从你的烟斗中读取 - 你在这里什么也做不了