我的工作计算机(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,发生了以下情况:
- powershell.exe 出现在 explorer.exe 下,并且 Powershell 窗口出现(奇怪的是,背景是黑色的。但它不是 cmd.exe,因为当我调试脚本错误消息时,它会以红色显示)。
- outlook.exe 出现在 powershell.exe 下,并且出现 Outlook 窗口。
- firefox.exe 出现在 powershell.exe 下,并出现 Firefox 窗口。
- powershell.exe 下出现第二个 firefox.exe,并出现另一个 Firefox 窗口。然后第二个 Firefox 进程退出,正如预期的那样,因为 Firefox 只使用一个进程。
- powershell.exe下出现skype.exe,然后出现Skype窗口。
- 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 目录中。