2016-12-21 5 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 issue, не забывайте, что '.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, но какой синтаксис я бы использовал, чтобы вернуть последний файл? –

 Смежные вопросы

  • Нет связанных вопросов^_^