首页 文章

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

提问于
浏览
-1

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

我有一个问题,我希望由于我缺乏知识而得到一个简单的答案 .

我已经从这个问题中使用了这段代码 - 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 回答

  • 1

    你exec cmd.exe并通过管道发送命令到exec powershell . 所有这些都取决于PowerShell的实现

    在window7上:

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

    在windows10上:

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

    所以用代码绝对没问题 . 问题只在于第3个程序如何读写数据 . 如果它没有从你的烟斗中读取 - 你在这里什么也做不了

相关问题