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-ID: 1312592632

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

Ausgedruckt am: 16.11.2024 um 11:11 Uhr

149569
149569 27.09.2021 aktualisiert um 16:44:54 Uhr
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 
erikro
Lösung erikro 27.09.2021 um 15:50:17 Uhr
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
noob-x
noob-x 28.09.2021 um 08:47:33 Uhr
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
erikro
erikro 28.09.2021 um 08:56:25 Uhr
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