2016-12-21 85 views
0

我正在研究一個腳本,它將檢查一個文件夾並返回上次文件日期修改時間戳。然後,它會比較當前系統時間並找出兩者之間的差異,如果時間超過20分鐘,將發送電子郵件通知。Powershell腳本疑難解答

在調試/運行它,我得到以下錯誤:

New-TimeSpan : A positional parameter cannot be found that accepts argument '$null'. At C:\Users\jalden\Desktop\CalderaMonitoring-Part1.ps1:7 char:14 + $dtdiff = New-TimeSpan ($_.LastWriteTime) $(Get-Date) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [New-TimeSpan], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewTimeSpanCommand

這裏是我的腳本:

$src="c:\test\" 
$sendmail=$false 

Get-Item -path $src | Foreach {$_.LastWriteTime} 
Foreach-Object 
{ 
    #write-host $_.fullname 
    $dtdiff = New-TimeSpan ($_.LastWriteTime) $(Get-Date) 

    if ($dtdiff.minutes -gt 20) 
    { 
     $strbody=$strbody +$_.fullname+ " - Created Time: " +$_.LastWriteTime +"`r`n" 
     $sendmail=$true 
    }  
} 

#$strbody 

if($sendmail -eq $true) 
{ 
    # Email components 
    $strFromAddress = "[email protected]" 
    $strToAddress = "[email protected]" 
    $strMessageSubject = "Files not uploaded in the last 20 minutes" 
    $strMessageBody = $strbody 
    $strSendingServer = "smtp.gmail.com" 
    $SMTPPort = "587" 
    $emailSmtpUser = "[email protected]" 
    $emailSmtpPass = "testasfasdfa" 

    # Email objects 
    $objSMTPMessage = New-Object System.Net.Mail.MailMessage   $strFromAddress, $strToAddress, $strMessageSubject, $strMessageBody 
    $objSMTPClient = New-Object System.Net.Mail.SMTPClient($strSendingServer, $SMTPPort) 
    $objSMTPClient.EnableSsl = $true 
    $objSMTPClient.Credentials = New-Object System.Net.NetworkCredential($emailSmtpUser , $emailSmtpPass); 
    $objSMTPClient.Send($objSMTPMessage) 
} 

有什麼建議?

+2

雖然這不是你的e rror問題,不要忘記'.Minutes.'可以是0,其中'.TotalMinutes'會告訴你幾天前的事情。 – gravity

+0

我也不認爲你需要'Foreach {$ _。LastWriteTime}'。在我的盒子裏進行基本的測試 - 在任何情況下都不需要繼續下去......不知道你在那裏試圖做什麼。 – gravity

回答

5

一個下面的第二行,你不提供任何輸入ForEach-Object,所以$_$null

Get-Item -path $src | Foreach {$_.LastWriteTime} 
    Foreach-Object { 
    #write-host $_.fullname 
    $dtdiff = New-TimeSpan ($_.LastWriteTime) $(Get-Date) 

    if ($dtdiff.minutes -gt 20){ 
    $strbody=$strbody +$_.fullname+ " - Created Time: " +$_.LastWriteTime +"`r`n" 
    $sendmail=$true 
    }  
} 

將其更改爲:

Get-Item -path $src | ForEach-Object { 
    #write-host $_.fullname 
    $dtdiff = New-TimeSpan ($_.LastWriteTime) $(Get-Date) 

    if ($dtdiff.TotalMinutes -gt 20){ 
    $strbody=$strbody +$_.fullname+ " - Created Time: " +$_.LastWriteTime +"`r`n" 
    $sendmail=$true 
    }  
} 

由於@gravity notes,你應該使用$dtdiff.TotalMinutes而比$dtdiff.Minutes如果if聲明

+0

非常感謝! –

+0

最後一個問題。如果我想只返回最新文件的結果,我知道我需要使用Get-ChildItem,但是我將使用什麼語法來返回最新文件? –