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 , aber ich habs in Powershell nicht hinbekommen.
Vielleicht kann mir ja jemand unter die Arme greifen.
Danke
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 , 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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1312592632
Url: https://administrator.de/contentid/1312592632
Ausgedruckt am: 16.11.2024 um 11:11 Uhr
4 Kommentare
Neuester Kommentar
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 .
Get-ChildItem -Recurse -Path $path -File | ?{$_.LastWriteTime -gt (Get-Date).AddHours(-1) -and (Select-String $_.Fullname -Pattern $msgtxt -SimpleMatch -Quiet)} | copy-item -Destination $path2
Moin,
hth
Erik
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
Moin,
Freut mich. Und wenn Du noch die beiden Suchstrings von mir gegen was sinnvolles ersetzt oder löschst, dann ist alles gut.
Liebe Grüße
Erik
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.
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.
Liebe Grüße
Erik