考虑 powershell 命令:
cmd.exe "/c start notepad.exe"
Run Code Online (Sandbox Code Playgroud)
使用 powershell.exe(控制台),此命令在启动 cmd/notepad 进程后立即完成,不会等待 notepad/cmd 退出。如果我希望它等待完成,我必须将输出通过管道传输到 Out-Null。
使用 powershell ISE,此命令会阻止执行,直到关闭记事本/cmd。
此外,如果我使用 System.Diagnostics.Process 在 powershell.exe 中运行的脚本中创建一个新进程(powershell.exe)并重定向标准输出,则脚本现在会阻止执行,直到关闭记事本/cmd。如果我不重定向输出,它不会阻止执行。
但是,如果我使用 C# 创建具有相同设置/启动信息的新进程,并使用重定向输出运行相同的脚本,则不会阻止执行。
我在这里不知所措。显然,它与执行和输出的设置有关,可能与“cmd.exe”有关。我希望有人能够理解这些情况下幕后发生的根本不同的事情。我知道 ISE 和 cmd.exe 不受完全支持,但我不知道为什么其他 3 个不一致。
为什么脚本不以相同的行为运行(尤其是 powershell 控制台脚本)以及如何让它们以相同的行为运行?
编辑:
经过一些故障排除后,我能够让所有 powershell.exe 版本以相同的方式运行(ISE 对我来说并不重要)。阻止执行的奇怪问题cmd.exe "/c start notepad.exe"
是当在 powershell 中创建一个新进程以使用 .exe 运行 powershell.exe 时System.Diagnostics.Process
。System.Diagnostics.Process
如果输出被重定向(我首先使用的原因是,Start-Process
除了重定向到文件之外,不支持重定向),然后调用WaitForExit()
进程对象会导致发生阻塞。
只需替换WaitForExit()
为Wait-Process
(和进程 ID)即可导致在新 powershell.exe 中运行的 powershell 脚本按预期执行并在运行命令后退出。希望这些信息与 @mklement0 答案相结合对于其他有类似问题的人来说是足够的。
powershell ×1