noob-x
Goto Top

Powershell: Dateien auf Alter + Inhalt überprüfen und ggf. kopieren

Hallo liebe Community,

ich habe mir hier einen Script aus dem Netz geholt um ursprüglich Dateien
in einem Ordner auf Ihr Alter zu überprüfen und ggf. eine Meldung zu machen.

Das möchte nun für einen anderen Zweck verwenden und zwar sollen Dateien
in dem Protokoll Ordner + Unterordner auf Dateien nicht älter als eine Stunde
überprüft werden ( das habe ich hinbekommen ).
Jetzt sollen diese gefundenen Dateien aber auf 2 oder 3 verschiedene Strings
durchsucht werden und falls einer davon vorhanden ist soll die Datei nach path2
kopiert werden.
In der Ausgabe von f_names habe ich alle gefundenen Dateien in einer TextDatei,
da hole ich mir aktuell die Pfade+Dateien mit einem Batch script und suche nach den Strings.

Das geht doch sicher einfacher face-smile, aber ich habs in Powershell nicht hinbekommen.

Vielleicht kann mir ja jemand unter die Arme greifen.

$path = "D:\TDB\protokoll"  
$path2 = "C:\batchs\test\DBerror"  
$msg = ''  
$msgtxt = " nicht wichtig"  

$days = 0
$hours = 0
$mins = 60

$files = @(Get-ChildItem -Recurse -Path $path -Include '*' | ?{ $_.LastWriteTime -gt (Get-Date).AddDays(-$days).AddHours(-$hours).AddMinutes(-$mins) -and $_.psIsContainer -eq $false})  

if ($files -ne $null) {

  $f_names = [System.String]::Join('|',$files)  

  $f_names = $f_names.Replace("|","`r`n")  
  $stats = "Achtung !! Es sind " + $files.Count + $msgtxt  

} else {

  $msg = 'Message: 0 files exceed defined age'  

}

if ($stats -ne 0) {

$f_names | Out-File -FilePath C:\batchs\DBLog\msg.txt
#$stats | Out-File -FilePath D:\check\conn.txt
}

Danke

Content-Key: 1312592632

Url: https://administrator.de/contentid/1312592632

Printed on: April 23, 2024 at 21:04 o'clock

Mitglied: 149569
149569 Sep 27, 2021 updated at 14:44:54 (UTC)
Goto Top
Beschäftige dich mal mit Select-String und das ganze mit dem Parameter -Quiet in ein Where-Object verpackt, dann sollte es bei dir auch Klick machen face-smile.
Get-ChildItem -Recurse -Path $path -File | ?{$_.LastWriteTime -gt (Get-Date).AddHours(-1) -and (Select-String $_.Fullname -Pattern $msgtxt -SimpleMatch -Quiet)} | copy-item -Destination $path2 
Member: erikro
Solution erikro Sep 27, 2021 at 13:50:17 (UTC)
Goto Top
Moin,

Zitat von @noob-x:
> 
> $path = "D:\TDB\protokoll"  
> $path2 = "C:\batchs\test\DBerror"  
> $msg = ''  
> $msgtxt = " nicht wichtig"  

$destination = x:\wo\auch\immer\das\hin\soll

> 
> $days = 0
> $hours = 0
> $mins = 60
> 
> $files = @(Get-ChildItem -Recurse -Path $path -Include '*' | ?{ $_.LastWriteTime -gt (Get-Date).AddDays(-$days).AddHours(-$hours).AddMinutes(-$mins) -and $_.psIsContainer -eq $false})  

# Das geht deutlich einfacher:
$files = get-childitem -file -recurse -path $path | ?{$_.LastWriteTime -gt (Get-Date).AddMinutes(-$mins) |select fullname,LastWriteTime

# Von hier bis 
> if ($files -ne $null) {
> 
>   $f_names = [System.String]::Join('|',$files)  
> 
>   $f_names = $f_names.Replace("|","`r`n")  
>   $stats = "Achtung !! Es sind " + $files.Count + $msgtxt  
> 
> } else {
> 
>   $msg = 'Message: 0 files exceed defined age'  
> 
> }
# hier ist das einigermaßen unsinnig. Warum machst Du das? Warum schreibst Du das Objekt nicht einfach in ein csv?

$files | export-csv files.csv -delimiter ";" -NoTypeInformation   

# Und dann zum eigentlichen Problem:

foreach($file in $files) {

    $content = get-content $file.fullname
    if($content -match ".*Suchstring1.*|.*Suchstring2.*|.*Suchstring3.*") {  

        copy-item $file $destination

    }

}

> 

hth

Erik
Member: noob-x
noob-x Sep 28, 2021 at 06:47:33 (UTC)
Goto Top
Hallo,

Danke an Erik und hacktor (hat leider nicht richtig klick gemacht), ich hab es jetzt so gemacht und
das tut genau das was ich will.

$path = "D:\TDB\protokoll"  
$path2 = "C:\batchs\test\DBerror"  

$days = 0
$hours = 1
$mins = 60

$files = @(Get-ChildItem -Recurse -Path $path -Include '*' | ?{ $_.LastWriteTime -gt (Get-Date).AddDays(-$days).AddHours(-$hours).AddMinutes(-$mins) -and $_.psIsContainer -eq $false})  

foreach($file in $files) {

    $content = get-content $file.fullname
    if($content -match ".*Fehler in.*|.*Suchstring2.*|.*Suchstring3.*") {  

        copy-item $file $path2

    }
}

Die ganzen unsinnigen Sachen waren, wie ich Anfangs schon erwähnt habe für einen anderen Zweck.

Vielen Dank nochmal

noob
Member: erikro
erikro Sep 28, 2021 at 06:56:25 (UTC)
Goto Top
Moin,

Zitat von @noob-x:
Danke an Erik und hacktor (hat leider nicht richtig klick gemacht), ich hab es jetzt so gemacht und
das tut genau das was ich will.

Freut mich. Und wenn Du noch die beiden Suchstrings von mir gegen was sinnvolles ersetzt oder löschst, dann ist alles gut. face-wink

Liebe Grüße

Erik