トップ回答者
タスクスケジューラでの実行時にウィンドウを表示したい。

質問
-
OS起動時にタスクスケジューラーにてAdministratorアカウントでPowershellスクリプトを実行しています。
定期的にPINGを飛ばし、PINGに異常があったら処理を行うスクリプトです。
スクリプトの動作に問題はありませんが、Administratorでログインした時に、そのPowershellスクリプトのウィンドウが表示されず、簡単に目視でスクリプトの実行状況を確認できません。バックグラウンドで実行されています。
ウィンドウが表示されれば、
PING Check SUCCESS : YYYY年MM月DD日 対象ホスト名A
PING Check SUCCESS : YYYY年MM月DD日 対象ホスト名B
PING Check SUCCESS : YYYY年MM月DD日 対象ホスト名C
PING Check ERROR : YYYY年MM月DD日 対象ホスト名A
などと表示され、状況が確認できるのと、スクリプトがちゃんと動いていると誰でもわかりやすいです。
PowershellスクリプトをOS起動時に実行した時に表示する方法、または、バックグラウンドで実行中のPowershellスクリプトのウィンドウを表示させる方法はありますでしょうか?
回答
-
タスクスケジューラのセキュリティオプションで「ユーザーがログオンしているかどうかにかかわらず実行する」を選択すると、実行時にはセッション0と呼ばれる、ログオン中のユーザーが利用しているセッションとは分離された、別のセッションでプロセスが実行されます。
しかし、セッション0のプロセスについては、ウィンドウを表示させることはできないので、別のアプローチを取る必要があります。
タスクスケジューラで実行するスクリプトとは別に、ログ表示用のスクリプトを別途用意し、何らかのプロセス間通信を行ってログをリアルタイムに渡す方法が考えられると思います。
一例として…。
タスクスケジューラで実行するスクリプトでは、まずNew-PSSessionコマンドレットでループバックセッションを作成し、Invoke-CommandコマンドレットでスクリプトをRemoteJobとして実行する。実行後にはDisconnect-PSSessionコマンドレットでループバックセッションを切断する。
$session = New-PSSession -ComputerName . -Name Task Invoke-Command -Session $session -ScriptBlock { ここに処理を書く } -AsJob Disconnect-PSSession $session
ログ表示用スクリプトでは、Connect-PSSessionコマンドレットでループバックセッションに接続する。続いてReceive-PSSessionコマンドレットを用いてRemoteJobの結果を取得する。
Connect-PSSession -ComputerName . -name Task Receive-PSSession -Name Task
という方法があるにはあると思いますが、元のスクリプトに大分手を入れる必要があるのであまり良くはなさそうです…。
(PSSessionのタイムアウトの処理も必要で、ちょっと目的以外のところでの苦労が多すぎるかもしれません。参考資料としてはこちら:about_Remote_Disconnected_Sessions | Microsoft Docs)
- 編集済み 牟田口大介Moderator 2018年11月5日 1:31
- 回答としてマーク miyazaki-ph 2018年11月5日 4:28
すべての返信
-
タスクスケジューラのセキュリティオプションで「ユーザーがログオンしているかどうかにかかわらず実行する」を選択すると、実行時にはセッション0と呼ばれる、ログオン中のユーザーが利用しているセッションとは分離された、別のセッションでプロセスが実行されます。
しかし、セッション0のプロセスについては、ウィンドウを表示させることはできないので、別のアプローチを取る必要があります。
タスクスケジューラで実行するスクリプトとは別に、ログ表示用のスクリプトを別途用意し、何らかのプロセス間通信を行ってログをリアルタイムに渡す方法が考えられると思います。
一例として…。
タスクスケジューラで実行するスクリプトでは、まずNew-PSSessionコマンドレットでループバックセッションを作成し、Invoke-CommandコマンドレットでスクリプトをRemoteJobとして実行する。実行後にはDisconnect-PSSessionコマンドレットでループバックセッションを切断する。
$session = New-PSSession -ComputerName . -Name Task Invoke-Command -Session $session -ScriptBlock { ここに処理を書く } -AsJob Disconnect-PSSession $session
ログ表示用スクリプトでは、Connect-PSSessionコマンドレットでループバックセッションに接続する。続いてReceive-PSSessionコマンドレットを用いてRemoteJobの結果を取得する。
Connect-PSSession -ComputerName . -name Task Receive-PSSession -Name Task
という方法があるにはあると思いますが、元のスクリプトに大分手を入れる必要があるのであまり良くはなさそうです…。
(PSSessionのタイムアウトの処理も必要で、ちょっと目的以外のところでの苦労が多すぎるかもしれません。参考資料としてはこちら:about_Remote_Disconnected_Sessions | Microsoft Docs)
- 編集済み 牟田口大介Moderator 2018年11月5日 1:31
- 回答としてマーク miyazaki-ph 2018年11月5日 4:28