web-dev-qa-db-ja.com

Windowsの起動PowershellスクリプトがStart-Process後に閉じない

次のように、仕事用コンピューター(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を見ると、次のようになります。

  1. powershell.exeがExplorer.exeの下に表示され、Powershellウィンドウが表示されます(奇妙なことに、背景が黒で表示されます。ただし、デバッグ中にスクリプトのエラーメッセージが赤で表示されるため、cmd.exeではありません)。
  2. Outlook.exeがpowershell.exeの下に表示され、Outlookウィンドウが表示されます。
  3. powershell.exeの下にfirefox.exeが表示され、Firefoxウィンドウが表示されます。
  4. 2番目のfirefox.exeがpowershell.exeの下に表示され、別のFirefoxウィンドウが表示されます。 Firefoxは1つのプロセスしか使用しないため、2番目のFirefoxプロセスは予想どおりに終了します。
  5. skype.exeがpowershell.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プロセスは正常に終了します)。

では、ここで何が起こっているのでしょうか。次にショートカットに-WindowStylehiddenを追加してみます(このFirefoxを閉じてテストする必要があります)が、Windowsコンソールの動作についての理解を深めるためだけに、この下部に到達したいと思います。

5
Vanessa Phipps

ターゲットに-WindowStyle hiddenを追加することは魅力のように機能しました。迷子のPowershellウィンドウは、タスクバーでもProcessExplorerでも見つかりません。そもそもなぜこの問題が発生したのかはまだわかりませんが、少なくとも想定どおりの動作をします。

3
Vanessa Phipps

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のディレクトリに限定したほうがよいでしょう。

1
Bob