Quería que la función “tocar” de clonar / duplicar el archivo data de otro archivo, de forma nativa, y ser utilizable desde un archivo por lotes.
Así que “arrastrar y soltar” el archivo de vídeo en el 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 parecía simple al principio hasta que encuentras que los archivos batch son terribles para manejar nombres de archivos unicode, PowerShell en línea se confunde con los símbolos de nombres de archivos, y escapar de ellos es una pesadilla.
Mi solución fue hacer de la parte “tocar” un script separado de PowerShell que llamé “CLONE-FILE-DATE”. ps1’ y 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í está el ejemplo de uso dentro de mi archivo 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"
Creo que el PowerShell es legible, así que sólo explicaré el lenguaje batch:
%~dp0 es el directorio actual del archivo batch.
%~1 es la ruta del archivo lanzado en el lote sin comillas.
CHCP 65001 > nul establece los caracteres a UTF-8 y se traga la salida.
-ExecutionPolicy ByPass permite ejecutar PowerShell sin necesidad de modificar la política global, que está ahí para evitar que la gente ejecute accidentalmente los scripts.