次のように、仕事用コンピューター(XP Professional 64ビット)用のPowershellV2.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ウィンドウが閉じられるまでコマンドウィンドウが開いたままになることです。これは私が望んでいることではありません。スクリプトを実行するときにProcessExplorerを見ると、次のようになります。
両方のFirefoxウィンドウを閉じると、powershell.exeプロセスが終了し、Powershellウィンドウが閉じ、Outlook.exeプロセスとskype.exeプロセスが期待どおりExplorer.exeの下に表示されます。
これはFirefoxの標準入力、出力、エラーと関係があると思います。OutlookやSkypeがコンソールに何かを出力することはないと思いますが、Firefoxにはそれを可能にするコマンドラインオプションがあります。 about:configのユーザー設定値を調べましたが、疑わしいものは見つかりませんでした。最後に、firefox.exeインスタンスがすでに実行されている場合(デスクトップショートカットから開始)、問題は発生しません(powershell.exeプロセスは正常に終了します)。
では、ここで何が起こっているのでしょうか。次にショートカットに-WindowStylehiddenを追加してみます(このFirefoxを閉じてテストする必要があります)が、Windowsコンソールの動作についての理解を深めるためだけに、この下部に到達したいと思います。
ターゲットに-WindowStyle hidden
を追加することは魅力のように機能しました。迷子のPowershellウィンドウは、タスクバーでもProcessExplorerでも見つかりません。そもそもなぜこの問題が発生したのかはまだわかりませんが、少なくとも想定どおりの動作をします。
Firefoxが標準入力、出力、エラーを開いたままにしている可能性があるとのことですが。私自身のテストでは問題を再現できませんでした(つまり、PowerShellウィンドウは関係なく閉じます)が、Firefoxには非常に多くのデバッグ出力があることに気付きました。
Start-Process
のリダイレクト機能を試して、標準出力とエラーをNUL
にリダイレクトすることができます(基本的に、出力を破棄します)。
これを行うには、次の2つの引数をStart-Process
コマンドに追加するだけです。
-RedirectStandardOutput "C:\Program Files (x86)\Mozilla Firefox\NUL" -RedirectStandardError "C:\Program Files (x86)\Mozilla Firefox\components\NUL"
注意:NUL
は基本的に出力を破棄しますが、PowerShellは出力とエラーの両方に同じ「ファイル」を使用することを拒否します。 NUL
'はすべてのディレクトリに存在するので、異なるディレクトリを使用するとそれを回避できます。Firefoxのディレクトリに限定したほうがよいでしょう。