none
タスクスケジューラでの実行時にウィンドウを表示したい。 RRS feed

  • 質問

  • 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スクリプトのウィンドウを表示させる方法はありますでしょうか?
    2018年10月29日 4:33

回答

  • タスクスケジューラのセキュリティオプションで「ユーザーがログオンしているかどうかにかかわらず実行する」を選択すると、実行時にはセッション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




    2018年11月5日 1:14
    モデレータ

すべての返信

  • タスクスケジューラのセキュリティオプションで「ユーザーがログオンしているかどうかにかかわらず実行する」を選択すると、実行時にはセッション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




    2018年11月5日 1:14
    モデレータ
  • ご回答ありがとうございます。なるほどです。

    確かに、目的以外の所で大分苦労しないといけないようですね。時間が許せば挑戦してみます。

    私のやりたいことが、セッション0のプロセスになって、ウィンドウを表示できないという事がわかっただけでも前に進めました。ありがとうございました。

    2018年11月5日 4:28