Volevo che la funzione ‘touch’ di clonare / duplicare le date dei file da un altro file, in modo nativo, ed essere utilizzabile da un file batch.
Quindi il file video ‘trascina e rilascia’ su un file batch, FFMPEG viene eseguito, poi ‘Data creata’ e ‘Data modificata’ dal file di input viene copiato nel file di output.
Questo sembrava semplice all'inizio, finché non si è scoperto che i file batch sono terribili nel gestire i nomi dei file unicode, PowerShell in linea fa casino con i simboli dei nomi dei file, e la doppia fuga è un incubo.
La mia soluzione è stata quella di rendere la parte ‘touch’ uno script PowerShell separato che ho chiamato ‘CLONE-FILE-DATA’. ps1" e 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
``` ```
%~dp0\ffmpeg -i "%~1" ACTION "%~1-output.mp4"
CHCP 65001 > nul && PowerShell -ExecutionPolicy ByPass -File "%~dp0\CLONE-FILE-DATE.PS1" "%~1" "%~1-output.mp4"
Allora ecco un esempio di utilizzo all'interno del mio file batch ‘CONVERT.BAT’:
&001 &001
Penso che PowerShell sia leggibile, quindi spiegherà solo il discorso del batch:
%~dp0 è la directory corrente del file batch.
%~1 è il percorso del file caduto sul batch senza virgolette.
CHCP 65001 > nul imposta i caratteri su UTF-8 e ingoia l'output.
-ExecutionPolicy ByPass consente di eseguire PowerShell senza dover modificare la politica globale, che è lì per evitare che le persone eseguano accidentalmente gli script.