Je voulais que la fonction "tactile" de clonage/duplication des dates de fichiers à partir d'un autre fichier soit native et utilisable à partir d'un fichier batch.
Il suffit de glisser-déposer le fichier vidéo dans le fichier de traitement par lots, FFMPEG s'exécute, puis la " date de création " et la " date de modification " du fichier d'entrée sont copiées dans le fichier de sortie.
Cela semblait simple au début, jusqu'à ce que vous découvriez que les fichiers batch ne savent pas gérer les noms de fichiers unicode, que PowerShell se trompe avec les symboles de noms de fichiers et que le double échappement est un cauchemar.
Ma solution a été de faire de la partie 'touch' un script PowerShell séparé que j'ai appelé 'CLONE-FILE-DATE.ps1' et il contient :
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
Voici ensuite un exemple d'utilisation dans mon fichier batch 'CONVERT.BAT' :
%~dp0\ffmpeg -i "%~1" ACTION "%~1-output.mp4"
CHCP 65001 > nul && PowerShell -ExecutionPolicy ByPass -File "%~dp0\CLONE-FILE-DATE.PS1" "%~1" "%~1-output.mp4"
Je pense que le PowerShell est lisible, donc je vais juste expliquer le batch speak :
%~dp0 est le répertoire actuel du fichier batch.
%~1 est le chemin du fichier déposé dans le lot sans guillemets.
CHCP 65001 > nul définit les caractères en UTF-8 et avale la sortie.
-ExecutionPolicy ByPass vous permet d'exécuter PowerShell sans avoir à modifier la politique globale, qui est là pour empêcher les gens d'exécuter accidentellement des scripts.