Quería la función 'táctil' de clonar / duplicar las fechas de archivo de otro archivo, de forma nativa, y ser utilizable desde un archivo por lotes.
Entonces, 'arrastre y suelte' el archivo de video en un archivo por lotes, FFMPEG se ejecuta, luego 'Fecha de creación' y 'Fecha de modificación' del archivo de entrada se copia en el archivo de salida.
Esto pareció simple al principio hasta que descubrió que los archivos por lotes son terribles para manejar nombres de archivo Unicode, PowerShell en línea se equivoca con los símbolos de nombre de archivo, y el doble escape es una pesadilla.
Mi solución fue hacer que la parte 'táctil' fuera un script separado de PowerShell que llamé 'CLONE-FILE-DATE.ps1' y que contiene:
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
Entonces, aquí hay un ejemplo de uso dentro de mi archivo por lotes '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"
Creo que PowerShell es legible, por lo que solo explicaré el discurso por lotes:
% ~ dp0 es el directorio actual del archivo por lotes.
% ~ 1 es la ruta del archivo soltado en el lote sin comillas.
CHCP 65001> nul establece caracteres en UTF-8 y se traga la salida.
-ExecutionPolicy ByPass le permite ejecutar PowerShell sin necesidad de modificar la política global, que está allí para evitar que las personas ejecuten scripts accidentalmente.