Eu queria que o recurso 'toque' de clonar / duplicar as datas do arquivo de outro arquivo, nativamente, e fosse utilizável a partir de um arquivo em lotes.
Então, 'arraste e solte' o arquivo de vídeo no arquivo em lotes, o FFMPEG é executado e, em seguida, 'Data de criação' e 'Data de modificação' do arquivo de entrada são copiados para o arquivo de saída.
Isso pareceu simples no começo, até você achar que os arquivos em lotes são terríveis ao lidar com nomes de arquivos unicode, o PowerShell em linha mexe com os símbolos dos nomes dos arquivos e a fuga dupla deles é um pesadelo.
Minha solução foi transformar a parte 'touch' em um script separado do PowerShell, que chamei de '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
Aqui está um exemplo de uso no meu arquivo em 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"
Eu acho que o PowerShell é legível, então apenas explicarei o discurso do lote:
% ~ dp0 é o diretório atual do arquivo em lotes.
% ~ 1 é o caminho do arquivo solto no lote sem aspas.
CHCP 65001> nul define caracteres para UTF-8 e engole a saída.
-ExecutionPolicy ByPass permite executar o PowerShell sem a necessidade de modificar a política global, que existe para impedir que as pessoas executem scripts acidentalmente.