Tags: Datei-Management, PowerShell, Datum
Das Unix-Dienstprogramm touch erfüllt zwei Aufgaben: Wendet man es auf existierende Dateien an, dann ändert es deren Zeitstempel. Sind die als Parameter angegeben Dateien nicht vorhanden, dann legt es sie mit einer Größe von 0 Byte an. PowerShell kennt kein Cmdlet mit exakt dieser Funktion, aber man kann sie relativ einfach nachbilden.
Die eigentliche Aufgabe von touch besteht darin, das Datum von Dateien zu ändern. Das kann man in PowerShell ebenfalls bewerkstelligen, indem man der Eigenschaft LastWriteTime von Dateiobjekten einen neuen Wert zuweist.
Dies funktioniert natürlich nur mit existierenden Dateien, so dass sich der Nebeneffekt von touch nicht erzielen lässt, nämlich Dateien anzulegen.
Fallunterscheidung für die 2 Kernfunktionen
Aus diesem Grund muss man eine PowerShell-Funktion erstellen, die zuerst mit Test-Path abfragt, ob die Datei(en) existieren. Ist das der Fall, ändert man ihr Datum, wenn nicht, dann bemüht man Set-Content, um eine neue Datei mit der Größe von 0 Bytes anzulegen:
function global:touch([string] $fname, [string] $datum){
if(Test-Path $fname){
if($datum -eq ""){
Get-ChildItem $fname | foreach{$_.LastWriteTime = get-date}
}
else{
Get-ChildItem $fname | foreach{$_.LastWriteTime = get-date $datum}
}
}
else{
Set-Content $fname $null
}
}
Der Unix-Befehl touch bietet die Möglichkeit, entweder über den Parameter -t ein Datum und eine Uhrzeit explizit anzugeben, oder diese wegzulassen, so dass er automatisch die Systemzeit nimmt.
Wenn man dieses Verhalten auf eine PowerShell-Funktion übertragen möchte, dann muss man prüfen, ob der Wert der Datumsangabe die leere Zeichenkette ist. Sie provoziert nämlich einen Fehler, wenn man sie an Get-Date übergibt.
Beispielaufruf
Die oben vorgestellte Funktion touch verzichtet auf benannte Parameter, man gibt ein Datum bei Bedarf einfach an zweiter Position an:
touch *.docx "2.2.1980 21:33:00"
Dieser Aufruf ändert den Zeitstempel aller Dateien mit der Endung .docx im aktuellen Verzeichnis auf den 2.2.1980. Die Uhrzeit, in diesem Beispiel 21:33:00, ist optional. Lässt man sie weg, dann wird sie auf 00:00:00 gestellt.
Wie üblich steht die Funktion touch als eigenes Kommando zur Verfügung, nachdem man ihre Definition eingegeben hat. Das klappt für mehrzeiligen Code auch auf der Kommandozeile, bequemer ist jedoch die PowerShell_ISE. Möchte man den Befehl in jeder Sitzung zur Verfügung haben, dann muss man die function in das Profil aufnehmen.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
Weitere Links
1 Kommentar
Top, sowas hatte ich mir auch mal gebastelt, allerdings noch in Batch. Danke.