Я хотел, чтобы «сенсорная» функция клонирования / дублирования файлов датировалась из другого файла, изначально, и была пригодна для использования из пакетного файла.
Таким образом, «перетащите» видеофайл в пакетный файл, FFMPEG запускается, затем «Дата создания» и «Дата изменения» из входного файла копируются в выходной файл.
Сначала это казалось простым, пока вы не обнаружили, что пакетные файлы ужасны при обработке имен файлов в Юникоде, встроенный PowerShell портится с символами имен файлов, и двойное экранирование - это кошмар.
Моим решением было сделать «сенсорную» часть отдельным скриптом PowerShell, который я назвал «CLONE-FILE-DATE.ps1», и он содержит:
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
Тогда вот пример использования в моем пакетном файле '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"
Я думаю, что PowerShell читабельна, поэтому я просто объясню, что такое пакетная речь:
% ~ dp0 - текущий каталог командного файла.
% ~ 1 - путь к файлу, помещенному в пакет без кавычек.
CHCP 65001> nul устанавливает символы в UTF-8 и глотает вывод.
-ExecutionPolicy ByPass позволяет запускать PowerShell без необходимости изменять глобальную политику, которая предотвращает случайное выполнение сценариев людьми.