2016-12-27 2 views
2

私はフォルダの内容を確認するために書いたpowershellスクリプトを持っています。また、20分以上経過したLastWriteTimeのファイルがあれば通知します。私が抱えている問題は、電子メール本文のすべてのファイルを含む結果が得られたときです。電子メールの本文に最新のファイル名だけを取得するにはどうすればよいでしょうか?Powershell Get-ChildItem

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

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

if ($dtdiff.TotalMinutes -gt 20){ 
$strbody=$strbody +$_.fullname+ " Last File Modified at " +$_.LastWriteTime +"`r`n" 
$sendmail=$true 
}  
} 


#$strbody 
if($sendmail -eq $true){ 
# Email components 
$strFromAddress = "[email protected]" 
$strToAddress = "[email protected]" 
$strMessageSubject = "REPORT" 
$strMessageBody = $strbody 
$strSendingServer = "smtp.com" 
$SMTPPort = "587" 
$emailSmtpUser = "[email protected]" 
$emailSmtpPass = "test123" 
# 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) 
} 
+1

あなたは、最新のファイル名を言って何を意味するのですか? – 4c74356b41

答えて

1

のみ最も実際のファイルを取得するには、次の編集欠陥

Get-ChildItem -path $src | 
    Sort LastWriteTime | 
    Select -last 1 | 
     ForEach-Object { 
     #write-host $_.fullname 
     $dtdiff = New-TimeSpan ($_.LastWriteTime) $(Get-Date) 
     if ($dtdiff.TotalMinutes -gt 20){ 
      $strbody=$strbody +$_.fullname+ " Last File Modified at " +$_.LastWriteTime +"`r`n" 
      $sendmail=$true 
     }  
} 
+0

これは、最も古いファイルでのみ動作し、最新のファイルでは-20日ではないようです。 – lit

+0

@litヒントのおかげで、2つのファイルしかないフォルダで 'Sort $ _。LastWriteTime'と' Sort LastWriteTime'を使って別の結果が得られました。私は最初の文字列に変換されると思います。 – LotPings

+0

私はOPの質問を間違って読んでいるかもしれませんが、私は彼が最も最近のファイルを望んでいると思います。ディレクトリには、-20日より新しいファイルがいくつか存在する可能性があります。このコードは、最も最近のファイルが-20日であるかどうかをチェックするように見えます。 – lit

0

を削除するには、そのループに$strbodyに各ファイル名とそれに関連付けられたタイムスタンプを付加しています。あなたが指定したものを正確に実行しています。

あなたはだけ最後の20分で作成された最新のファイルをしたい場合は、これにあなたのget-childitem/foreachループを変更:

$mostrecentfile = get-childitem -path $src | 
    where-object {$_.lastwritetime -gt (get-date).addminutes(-20)} | 
    sort-object -property lastwritetime -descending | select-object -first 1 
} 

if ($mostrecentfile -ne $null) { 
$strbody=$_.fullname+ " Last File Modified at " +$_.LastWriteTime; 
$sendmail = $true; 
} 
0
get-childitem "c:\temp" -file | where LastWriteTime -le (Get-Date).AddMinutes(-20) | 
    Sort lastwritetime -descending | 
% { 

$strFromAddress = "[email protected]" 
$strToAddress = "[email protected]" 
$strMessageSubject = "REPORT" 
$strMessageBody = "Last file modifed '{0}' at {1}" -f $_.fullname, $_.LastWriteTime 
$strSendingServer = "smtp.com" 
$SMTPPort = "587" 
$emailSmtpUser = "[email protected]" 
$emailSmtpPass = "test123" 
# 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) 
$objSMTPClient.Dispose() 
break 
}