任务是在进程退出之前关闭stdout句柄。使用WinAPI函数,就是这样:
CloseHandle(GetStdHandle(STD_OUTPUT_HANDLE))
我知道我可以DllImport
with Add-Type
,但是我相信必须有更好的方法。
使用PowerShell完成相同操作的最简单方法是什么?
更广泛的任务是测试一个Python库的一部分,该库可以启动并与Windows上的本地(通过subprocess
和_winapi
模块)或远程(通过WinRM)进程灵活地交互。测试之一是运行一个程序,该程序在退出前关闭stdout和stderr管道的末端。 (在Linux上也有类似的问题。)因此,脚本必须关闭stdout和stderr,以便操作系统发出的调用信号通知它们已关闭。我发现的唯一方法是在stdout和stderr句柄上调用CloseHandle
。在流对象上调用.Close
或.Dispose
并没有帮助:它们似乎仅在内部被调用的进程关闭。该脚本应使用某种“本机”语言,不需要其他编译器和解释器。因此,它可以是cmd,VBScript或PowerShell。只有最后一个能够调用WinAPI函数。 (在此更新的时候,我已经在Python上编写了脚本,该脚本可以完美运行但需要安装解释器,而Powershell可以在不进行任何其他安装的情况下编写脚本,但是有点麻烦且非常慢。)