Chciałem ‘dotykową’ funkcję klonowania / duplikowania daty pliku z innego pliku, natywnie, i być używany z pliku wsadowego.
Więc ‘przeciągnij i upuść’ plik wideo na plik wsadowy, FFMPEG działa, a następnie ‘Data utworzony’ i ‘Data zmodyfikowana’ z pliku wejściowego jest kopiowany do pliku wyjściowego.
Na początku wydawało się to proste, aż do momentu, gdy okazało się, że pliki wsadowe są okropne w obsłudze nazw plików unicode, w linii PowerShell miesza się z symbolami nazw plików, a podwójne ich wymykanie się jest koszmarem.
Moim rozwiązaniem było uczynienie części ‘touch’ osobnym skryptem PowerShella, który nazwałem ‘CLONE-FILE-DATE’. ps1" i zawiera:
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
Wtedy oto przykład użycia w moim pliku wsadowym ‘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"
Myślę, że PowerShell jest czytelny, więc wytłumaczę tylko, że wsadowy plik mówi:
%~dp0 jest aktualnym katalogiem wsadowym.
%~1 to ścieżka do pliku zrzuconego na wsad bez cudzysłowów.
CHCP 65001 > nul ustawia znaki na UTF-8 i połyka wyjście.
-ExecutionPolicy ByPass pozwala uruchomić PowerShella bez potrzeby modyfikacji globalnej polityki, która jest tam, aby zapobiec przypadkowemu uruchamianiu skryptów.