Eu queria que o recurso 'touch' clonasse / duplicasse as datas do arquivo de outro arquivo, nativamente, e usasse um arquivo em lotes.
Então 'arraste e solte' o arquivo de vídeo para o arquivo de lote, o FFMPEG é executado, então '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 arquivos em lote são terríveis para lidar com nomes de arquivos unicode, o PowerShell in-line bagunça com símbolos de nomes de arquivos e o duplo escape deles é um pesadelo.
A minha solução foi tornar a parte 'touch' 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
Então aqui está o uso de exemplo dentro do meu arquivo 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"
Acho que o PowerShell é legível, por isso, basta explicar o que o lote fala:
% ~ dp0 é o diretório atual do arquivo de lote.
% ~ 1 é o caminho do arquivo inserido no lote sem aspas.
CHCP 65001 > nul define caracteres para UTF-8 e engole a saída.
-ExecutionPolicy ByPass permite que você execute o PowerShell sem precisar modificar a política global, que está lá para evitar que as pessoas executem scripts acidentalmente.