Eu queria a funcionalidade ‘touch’ de clonar / duplicar as datas do ficheiro a partir de outro ficheiro, nativamente, e ser utilizável a partir de um ficheiro batch.
Então ‘drag and drop’ video file on to batch file, FFMPEG runs, depois ‘Date Created’ e ‘Date Modified’ do ficheiro de entrada é copiado para o ficheiro de saída.
Isto pareceu simples no início até achar que os ficheiros em lote são terríveis a lidar com nomes de ficheiros unicode, o PowerShell em linha mexe com os símbolos dos nomes dos ficheiros e escapar-lhes duas vezes é um pesadelo.
A minha solução foi fazer da parte ‘touch’ um script PowerShell separado que eu chamei ‘CLONE-FILE-DATE’. ps1’ e contém:
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
Então aqui está o exemplo de utilização dentro do meu ficheiro de lote ‘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"
Penso que o PowerShell é legível, por isso vou apenas explicar o lote fala:
%~dp0 é o directório actual do ficheiro de lote.
%~1* é o caminho do ficheiro largado no lote sem aspas.
CHCP 65001 > nul define os caracteres para UTF-8 e engole a saída.
-ExecutionPolicy ByPass permite correr o PowerShell sem necessidade de modificar a política global, que existe para evitar que as pessoas corram scripts acidentalmente.