Ich wollte die ‘Touch’-Funktion des Klonens / Duplizierens der Dateidaten aus einer anderen Datei, nativ, und von einer Batch-Datei aus nutzbar sein.
Also ‘Drag and Drop’ der Videodatei auf die Batch-Datei, FFMPEG läuft, dann wird ‘Date Created’ und ‘Date Modified’ von der Eingabedatei in die Ausgabedatei kopiert.
Das schien anfangs einfach, bis man feststellte, dass Batch-Dateien im Umgang mit Unicode-Dateinamen schrecklich sind, dass PowerShell inline mit Dateinamenssymbolen durcheinanderkommt und dass ein doppeltes Entkommen von ihnen ein Alptraum ist.
Meine Lösung war, den ‘touch’-Teil in ein separates PowerShell-Skript zu verwandeln, das ich ‘CLONE-FILE-DATE’ nannte. ps1’ und es enthält:
param
(
[Parameter(Mandatory=$true)][string]$SourcePath,
[Parameter(Mandatory=$true)][string]$TargetPath
)
(GI -LiteralPath $TargetPath).CreationTime = (GI -LiteralPath $SourcePath).CreationTime
(GI -LiteralPath $TargetPath).LastWriteTime = (GI -LiteralPath $SourcePath).LastWriteTime
Dann ist hier eine Beispielverwendung innerhalb meiner ‘CONVERT.BAT’-Batch-Datei:
%~dp0\ffmpeg -i "%~1" ACTION "%~1-output.mp4"
CHCP 65001 > nul && PowerShell -ExecutionPolicy ByPass -File "%~dp0\CLONE-FILE-DATE.PS1" "%~1" "%~1-output.mp4"
Ich denke, die PowerShell ist lesbar, also werde ich einfach die Batch-Sprache erklären:
%~dp0 ist das aktuelle Verzeichnis der Batch-Datei.
%~1 ist der Pfad der Datei, die ohne Anführungszeichen auf den Stapel abgelegt wurde.
CHCP 65001 > nul setzt Zeichen auf UTF-8 und verschluckt die Ausgabe.
-ExecutionPolicy ByPass ermöglicht es Ihnen, PowerShell auszuführen, ohne die globale Richtlinie ändern zu müssen, die dazu da ist, zu verhindern, dass Leute versehentlich Skripte ausführen.