0

以下は稼働時間をチェックします。私が考えていなかった条件の 1 つ (今のところを除く) は、サーバーに ping を実行できるが、アップタイムを取得できない場合です。その場合、エラーを発生させるには以下のスクリプトが必要です。これを行う方法が思いつきません - アイデアはありますか?

コード:

#clear
$Computers = Get-Content "E:\DATA\PS_Jobs\Patching_Uptime\Saturday_Servers.txt"

Foreach($computer in $Computers) 
{

    if (Test-Connection -ComputerName $computer -Quiet)
    {

    $LastBoot = (Get-WmiObject -Class Win32_OperatingSystem -computername $computer).LastBootUpTime
    $sysuptime = (Get-Date) – [System.Management.ManagementDateTimeconverter]::ToDateTime($LastBoot)

    $days = $sysuptime.Days
    $DaystoHours = ($sysuptime.Days)*24
    $hours = $sysuptime.hours
    $TotalHours = $DaystoHours + $hours

        if($TotalHours -gt '12')
        {
            Write-EventLog -LogName WinLondonUptime -Source Uptime -EntryType Error -EventId 5 -Message "$computer - FAILED - Servers Uptime is GREATER then 12 hours or not contactable - Uptime is $days Days and $hours Hours - This is the Saturday patching run"
        }
        else
        {
            Write-EventLog -LogName WinLondonUptime -Source Uptime -EntryType Information -EventId 4 -Message "$computer - SUCCESS - Servers uptime is less than 12 hours - Uptime is $days Days and $hours Hours - This is the Saturday patching run"
        }
    }
    else
        {
            Write-EventLog -LogName WinLondonUptime -Source Uptime -EntryType Error -EventId 5 -Message "$computer - FAILED - Server is not contactable - This is the Saturday patching run"
        }
}
4

6 に答える 6

1

コードを try/catch にカプセル化し、timespan オブジェクトを使用できます。このようなもの(テストされていませんが、アイデアが得られます):

    try
    {
        Test-Connection -ComputerName $computer -Count 1 -ErrorAction Stop

        $wmi = Get-WmiObject Win32_OperatingSystem -computer $computer
        $time = $wmi.ConvertToDateTime($wmi.Lastbootuptime) 
        [TimeSpan] $uptime = New-TimeSpan $time $(get-date)

        if ($uptime.Hours -gt 12)
        {
            Write-EventLog -LogName WinLondonUptime -Source Uptime -EntryType Error -EventId 5 -Message "$computer - FAILED - Servers Uptime is GREATER then 12 hours or not contactable - Uptime is $days Days and $hours Hours - This is the Saturday patching run"
        }
        else
        {
            Write-EventLog -LogName WinLondonUptime -Source Uptime -EntryType Information -EventId 4 -Message "$computer - SUCCESS - Servers uptime is less than 12 hours - Uptime is $($uptime.Days) Days and $($uptime.Hours) Hours - This is the Saturday patching run"
        }
    }

    catch [System.Management.Automation.ActionPreferenceStopException]
    {
        Write-EventLog -LogName WinLondonUptime -Source Uptime -EntryType Error -EventId 5 -Message "$computer - FAILED - Server is not contactable - This is the Saturday patching run"
    }
于 2013-05-31T14:58:06.917 に答える
1

WMI を使用して、コンピューターの最終起動時刻を取得することもできます。

$wmi = [WMI] ""
$operatingSystem = get-wmiobject Win32_OperatingSystem -computername "."
$wmi.ConvertToDateTime($operatingSystem.LastBootUpTime)

明細書

于 2013-05-31T14:11:54.787 に答える
1

この人物は、WMI にタイムアウト機能がないという同じ問題を抱えています。WMI にクエリを実行して LBUT を取得するジョブを作成することをお試しください。次に、ジョブにタイマーを設定します。ただし、エラー処理だけを行いたい場合はtry{}、andcatch{}ブロックを使用する必要があります。

try{
    $lbut = (Get-WmiObject -Class Win32_OperatingSystem -computername $computer).LastBootUpTime
}
catch{
    "FAILED"
    continue
}

WMI の代わりに CIM の使用を検討することをお勧めします

于 2013-05-31T15:03:44.077 に答える
0

エラー出力は、通常、ゼロ以外の終了コードを返すこととして定義されます。これは、次の方法で実行できます。

Exit 1

また

Exit -1

または、お好きな番号で。

特定のエラーメッセージと本当に厄介なエラーを送信したい場合は、例外をスローすることもできます。ここに答えがあります.

于 2013-05-31T14:13:36.783 に答える