Мені хотілося, щоб функція "touch" була клонованою / дублюючою датою файлу в іншому файлі, споконвічно, і використовувати його можна з пакетного файлу.
Тож "перетягування" відеофайлу на пакетний файл, FFMPEG запускається, потім "Дата створення" і "Дата зміни" з вхідного файлу копіюється у вихідний файл.
Спочатку це здавалося простим, поки ви не знайдете пакетні файли, які страшні при роботі з іменами файлів Unicode, вбудована PowerShell псується з символами імен файлів, а подвійне уникнення їх - це кошмар.
Моїм рішенням було зробити частину "touch" окремим сценарієм 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 без необхідності змінювати глобальну політику, яка існує для того, щоб люди не випадково запускали сценарії.