2015-06-05 40 views
1

我現在在我的代碼中運行下面的foreach循環,它工作的很好。但是,如果滿足條件,我寧願讓它在腳本末尾發送一封電子郵件,而不是發現每個問題的電子郵件。我怎樣才能做到這一點?如何在使用Powershell的foreach循環中使用變量編寫if語句?

foreach ($server in $servers) { 
    $DT = Get-WmiObject -Class Win32_LocalTime -ComputerName $server 
    $DateTime = (Get-Date -Day $DT.Day -Month $DT.Month -Year $DT.Year -Minute $DT.Minute -Hour $DT.Hour -Second $DT.Second) 
    $SUTC = $DateTime.ToUniversalTime() 
    $now = Get-Date 
    $NUTC = $now.ToUniversalTime() 
    $Difference = (New-TimeSpan -Start ($NUTC) -End ($SUTC)) 
    Write-Host "Time at $server is $SUTC. Time difference of $Difference." 
    if ($Difference -ge '00:03:00') { 
    Send-MailMessage -Subject "Time Report -$(get-date -Format "MM-dd-yyy")" -Body "Time difference of more then 3 minutes detected." -SmtpServer "SMTPSERVER" -From "[email protected]" -To "[email protected]" -UseSsl 
    } 
} 

回答

2

在foreach之前聲明一個數組並添加消息。然後在你的foreach之後調用Send-MailMessage。例如:

$errors = @() 

foreach ($server in $servers) { 
    $DT = Get-WmiObject -Class Win32_LocalTime -ComputerName $server 
    $DateTime = (Get-Date -Day $DT.Day -Month $DT.Month -Year $DT.Year -Minute $DT.Minute -Hour $DT.Hour -Second $DT.Second) 
    $SUTC = $DateTime.ToUniversalTime() 
    $now = Get-Date 
    $NUTC = $now.ToUniversalTime() 
    $Difference = (New-TimeSpan -Start ($NUTC) -End ($SUTC)) 
    Write-Host "Time at $server is $SUTC. Time difference of $Difference." 
    if ($Difference -ge '00:03:00') { 
    $errors += "Time difference of more then 3 minutes detected." 
    } 
} 

if($errors.Count -gt 0) { 
    Send-MailMessage -Subject "Time Report -$(get-date -Format "MM-dd-yyy")" -Body ($errors -join "`n") -SmtpServer "SMTPSERVER" -From "[email protected]" -To "[email protected]" -UseSsl 
} 
+4

不要這樣做。追加到循環中的數組一定會執行得很差,因爲每次數組都被重新創建,其大小爲+ 1,並且所有現有元素都被複制到新實例中。相反,只需在循環內部回顯並將循環輸出分配給一個變量('$ var = foreach($ servers in $ servers){...}')。 –

+0

imo,追加到數組將只是一個大數據的問題。但是這並不否認你的警告。 – wallybh

+2

沒錯,對於少量的數據來說,它通常是不明顯的,但是你也沒有得到任何東西。 –