前提
タスク スケジューラで作ったタスクで、操作に「プログラムの開始」でpowershell.exe
を指定し、「引数の追加」で-Command
オプションと実行したいスクリプトを指定すれば、タスク スクリプトから任意のコマンドを実行できる。
問題
PowerShell ISE上からpowershell.exe
を実行した場合は問題なく動く内容が、タスク スケジューラからだと正しく動作しない。
たとえばpowershell.exe -Command " Start-Sleep -Seconds 5"
をタスク スケジューラから起動した場合、PowerShellのウィンドウが一瞬だけ表示されてすぐに消えてしまう。
原因
PowerShell上から起動した場合と、それ以外のシェル(cmd.exeとか、エクススプローラのアドレスバーとか)でシングルクォートの解釈が異なるため。
たとえばStart-Sleep -Seconds 5
だったら結果はこうなる。
# | コマンド | PowerShellから実行 | cmd.exeから実行 |
---|---|---|---|
1 | powershell.exe -Command 'Start-Sleep -Seconds 5' | 5秒間ウィンドウが表示される | 「Start-Sleep -Seconds 5」がエコーされる |
2 | powershell.exe -Command "Start-Sleep -Seconds 5" | 5秒間ウィンドウが表示される | 5秒間ウィンドウが表示される |
対策
-Command
オプションのパラメタに渡す文字列はダブルクォートで囲む。それに合わせて、渡すスクリプト内でダブルクォートを使っていた場合はシングルクォートで置き換えるよう処理を修正する。