Dateidatum in PowerShell ändern: Unix-Kommando touch nachbilden

    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 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.

    1 Kommentar

    Bild von Michael Grote
    Michael Grote sagt:
    23. September 2013 - 19:21

    Top, sowas hatte ich mir auch mal gebastelt, allerdings noch in Batch. Danke.