2016-12-27 5 views
2

Ich habe ein Powershell-Skript, das ich geschrieben habe, um den Inhalt eines Ordners zu überprüfen und ob es eine Datei mit einer LastWriteTime älter als 20 Minuten gibt, um mich zu benachrichtigen. Das Problem, das ich habe, ist, wenn ich die Ergebnisse bekomme, dass es alle Dateien im E-Mail-Körper einschließt. Wie würde ich dies schreiben, um nur den neuesten Dateinamen im E-Mail-Text zu erhalten?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

was meinst du mit neuesten Dateinamen sagen? – 4c74356b41

Antwort

1

Um nur die aktuellste Datei zu erhalten: Edited Fehler

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

Es sieht so aus, als würde dies nur für die älteste Datei und nicht für die neueste Datei mit -20 Tagen gelten. – lit

+0

@lit danke für den Hinweis, ich habe verschiedene Ergebnisse mit 'Sort $ _. LastWriteTime' und' Sort LastWriteTime' in einem Ordner mit nur zwei Dateien. Ich schätze, der erste wird in eine Zeichenkette umgewandelt. – LotPings

+0

Ich kann die OP-Frage falsch lesen, aber ich denke, er möchte die neueste Datei, die -20 Tage ist. Möglicherweise befinden sich mehrere Dateien im Verzeichnis, die jünger als -20 Tage sind. Es sieht so aus, als würde dieser Code nur nach der letzten Datei suchen, die -20 Tage lang ist. – lit

0

Sie Anfügen jeden Dateinamen und die damit verbundene Zeitstempel $strbody in dieser Schleife zu entfernen. Es macht genau das, was Sie angegeben haben.

Wenn Sie nur die letzte Datei, die in den letzten 20 Minuten angelegt wurde, ändern Sie Ihre get-childitem/foreach Schleife dazu:

$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 
}