Strings suchen und ersetzen in mehreren Dateien

In mehreren Dateien soll ein bestimmter Text gesucht und falls vorhanden ersetzt werden und gerade kein Tool zur Hand? Die Powershell kann das!

Snippet:

1
Get-ChildItem *.dat | Foreach-Object {Get-Content $_ | Out-String | Foreach-Object {$_.Replace("altes Haus","neues Schloß")} | Set-Content $_}

Achtung:
Die ursprüglichen Dateien werden dabei überschrieben!

Dateien finden die in den letzten 15 Minuten bearbeitet wurden

Möchte man wissen welche Dateien in einem Verzeichnis innerhalb der letzten X Minuten bearbeitet oder erstellt wurden, so hilft das folgende Snippet:

1
Get-ChildItem -Recurse E:\ | Where-Object {$_.LastWriteTime -gt (Get-Date).AddMinutes(-15)}

Das funktioniert auch mit Stunden oder Jahren. Einfach “AddMinutes” durch “AddHours” oder “AddYears” ersetzen.

Möglich wäre auch:

1
Get-ChildItem -Recurse E:\ | Where-Object {$_ .lastwritetime –lt "2008/1/12"}

Umgebungsvariablen anzeigen bzw. verwenden

Die Windows-Umgebungsvariablen enthalten einige wichtige Informationen zum Betriebssystem, dem Benutzer, oder Verzeichnispfaden.
Eine Auflistung, welche es gibt bekommt ihr wie folgt:

1
Get-ChildItem env:

Also nutzen wir diese Informationen auch in unseren Skripten, wie z.B. hier den Computernamen:

1
$env:Computername

Nur versteckte Dateien anzeigen

Sollen innerhalb eines Verzeichnisses nur die versteckten Dateien angezeigt werden, so muss als erstes dem Get-Childitem Commandlet der Parameter “-force” mitgegeben werden, da dieses standardmäßig ausgeblendet werden.
Anschließend wird geprüft, ob das Attribut “versteckt” bzw. “hidden” gesetzt ist:

1
Get-ChildItem C:\Windows -force | Where-Object { $_.Mode -like '*h*' }

Hier noch eine Alternative Methode:

1
Get-ChildItem C:\ -force | ? { $_.Attributes –band [IO.FileAttributes]::Hidden }

Dateien löschen die älter als n Tage alt sind

Mein Beitrag vom 25.01.2008 “Dateien nach Datum löschen” zeigt beispielhaft, wie alle Dateien gelöscht werden können, die ein bestimmtes Datum überschritten haben.
Heute möchte ich zeigen, wie die Dateien gelöscht werden können, die älter als n Tage sind.

Und so geht das…

1
2
$Heute = Get-Date
Get-Childitem T:\Ablage -recurse | Where-Object {($Heute - $_.LastWriteTime).Days -gt 10} | Remove-Item

Das Beispiel erzeugt zuerst die Variable “Heute” welche das aktuelle Datum enthält. Danach Sucht es alle Dateien aus dem Verzeichnispfad “T:\Ablage” und deren Unterobjekte. Anschließend wird jedes Objekt durchlaufen und überprüft, ob das Änderungsdatum älter dem Datum minus 10 Tagen ist. Wenn ja, so wird gelöscht, wenn nicht, so wird mit dem nächsten Objekt fortgefahren.

Zusätzliches:
Mit Hilfe von “-WhatIf” hinter dem Remove-Item wird der Löschvorgang nur simuliert und nicht wirklich ausgeführt, was für Testzwecke sehr nützlich ist.
Weiter könnte hier statt dem “Remove-Item” auch etwas anderes passieren, z.B. das Verschieben oder Komprimieren der Dateien.