2

Web サーバーで IIS サービスの状態を 15 分ごとにチェックするスクリプトを作成しました。このスクリプトを Windows タスク スケジューラでスケジュールしました。

サーバーにログオンし、正しく機能する場合はスクリプトを手動で実行します。サーバーにログオンしておらず、バッチ スクリプトでこれを実行すると、IIS が実際に稼働していても、Get-Serviceクエリが返されず、サービスが再起動されます。Running

サーバーに物理的にログオンしている場合と、バックグラウンドでスケジュールされたタスクとして実行している場合で、このスクリプトの実行が異なるのはなぜですか?

スクリプトは次のように呼び出されます。C:\Scripts\powershell.exe -File verify_status.ps1 [Service param]

##############################
# Get service status
##############################
if($args[0] -ne $NULL){

    $serviceName = $args[0]
    $serverName = hostname

    $status = (Get-Service $serviceName).Status

    if ($status -ne "Running"){
        sendMail "$serviceName" "$serverName"
        Restart-Service $ServiceName
    }else{
            # Service is running, do nothing;
    }
}

=====================================

編集NULL-誰もログオンしていない状態でスクリプトが実行されると、Get-Service は a を返します。それがまったく役立つ場合。

4

1 に答える 1

0

2 つのことがこの問題を解決しました。.bat主なものは、powershell スクリプトを呼び出すスクリプトを変更したことだと思います。

私はから行きました:

C:\Scripts\powershell.exe -File verify_status.ps1 [Service param]

C:\Scripts\powershell.exe -File verify_status.ps1 "[Service param]"

パラメーターを正しく powershell スクリプトに渡すには、二重引用符が必要でした。

また、powershell スクリプト自体で以下を変更しました。これが必要かどうかはわかりませんが、2つの組み合わせでこの作業が行われました:

$status = (Get-Service $serviceName).Status

$status = (Get-WmiObject -ComputerName SERVERNAME -Class Win32_Service -Filter "Name='$serviceName'").State

は、このWindows Task Schedulerスクリプトをエラーなしで正しく実行するようになりました。

于 2012-09-26T21:38:21.940 に答える