启动进程后 Windows 启动 Powershell 脚本未关闭

启动进程后 Windows 启动 Powershell 脚本未关闭

我的工作计算机(XP Professional 64 位)有一个 Powershell V2.0 启动脚本,如下所示:

start "C:\Program Files (x86)\Microsoft Office\Office12\OUTLOOK.EXE" -ArgumentList "/recycle"
sleep -S 2
start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -ArgumentList "https://mail.google.com"
sleep -S 2
start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -ArgumentList "-new-window https://www.google.com/calendar"
sleep -S 2
start "C:\Program Files (x86)\Skype\Phone\Skype.exe"

休眠是为了确保窗口以正确的顺序出现在任务栏上。我从“快速启动”上的快捷方式运行此程序,目标如下:

C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe C:\scripts\initialize.ps1

(是的,这是 2.0:powershell -Version 2.0可以工作, 也可以-Version 1.0, 但不能-Version 3.0

问题是,命令窗口一直打开,直到 Firefox 窗口关闭,这不是我想要的。运行脚本时查看 Process Explorer,发生了以下情况:

  1. powershell.exe 出现在 explorer.exe 下,并且 Powershell 窗口出现(奇怪的是,背景是黑色的。但它不是 cmd.exe,因为当我调试脚本错误消息时,它会以红色显示)。
  2. outlook.exe 出现在 powershell.exe 下,并且出现 Outlook 窗口。
  3. firefox.exe 出现在 powershell.exe 下,并出现 Firefox 窗口。
  4. powershell.exe 下出现第二个 firefox.exe,并出现另一个 Firefox 窗口。然后第二个 Firefox 进程退出,正如预期的那样,因为 Firefox 只使用一个进程。
  5. powershell.exe下出现skype.exe,然后出现Skype窗口。
  6. powershell.exe 进程莫名其妙地持续存在,Powershell 窗口也是如此。

如果我关闭两个 Firefox 窗口,powershell.exe 进程就会退出并且 Powershell 窗口会关闭,并且 outlook.exe 和 skype.exe 进程会按预期出现在 explorer.exe 下。

我怀疑这与 Firefox 的标准输入、输出和错误有关:我不希望 Outlook 或 Skype 向控制台输出任何内容,但 Firefox 有命令行选项允许它这样做。我查看了我的 about:config 的用户设置值,没有发现任何可疑的东西。最后,如果我有一个已经在运行的 firefox.exe 实例(从桌面快捷方式启动),则不会发生问题(powershell.exe 进程会按应有的方式退出)。

那么这里发生了什么?接下来我将尝试将 -WindowStyle hidden 添加到快捷方式(必须关闭此 Firefox 才能测试它),但我想弄清楚这一点,哪怕只是为了提高我对 Windows 控制台工作原理的理解。

答案1

添加-WindowStyle hidden到目标非常有效;无论是在任务栏还是在进程资源管理器中,都找不到杂散的 Powershell 窗口。仍然不确定为什么会出现此问题,但至少它做了它应该做的事情。

答案2

您提到 Firefox 可能保持标准输入、输出和/或错误处于打开状态。我自己的测试无法重现您的问题(即 PowerShell 窗口无论如何都会关闭),但我确实注意到 Firefox 有相当多的调试输出。

您可以尝试使用Start-Process重定向功能将标准输出和错误重定向到NUL(本质上是丢弃输出)。

为此,只需向Start-Process命令添加以下两个参数:

-RedirectStandardOutput "C:\Program Files (x86)\Mozilla Firefox\NUL" -RedirectStandardError "C:\Program Files (x86)\Mozilla Firefox\components\NUL"

注意:虽然NUL本质上会丢弃输出,但 PowerShell 会拒绝对输出和错误使用相同的“文件”。由于NUL“文件”存在于每个目录中,因此使用不同的目录可以解决这个问题 - 我们不妨将其限制在 Firefox 目录中。

相关内容