web-dev-qa-db-ja.com

Powershellを使用して、ファイルの作成日を別のファイルの作成日に設定します

誰かが私がこの線を正しくするのを手伝ってくれる?

powershell Set-ItemProperty -LiteralPath '[NewVideo]' -Name CreationTimeUtc -Value ('[CreationTimeOfOldVideo]' -as [Datetime])

元のファイルの作成日を保持したまま、ビデオファイルを90度回転させようとしています。 ffmpegを使用してローテーションを行う方法を見つけましたが、作成日を新しいファイルにコピーしようとして立ち往生しています。検索の結果、PowerShellで可能になるはずだと結論付けました(私はほとんど何も知りません)

これは私がこれまでに持っているものです:

FOR /r %%I in (*.avi, *.mp4) DO CALL :loopbody "%%~fI" "%%~dpnI_%%~xI" "%%~tI"
GOTO :EOF
:loopbody
ffmpeg -i %1 -c:v libx264 -crf 18 -maxrate 4000k -bufsize 4000k -c:a libvo_aacenc -q:a 100 -map_metadata 0 -preset veryslow -tune film -movflags +faststart %2
powershell Set-ItemProperty -LiteralPath '%2' -Name CreationTimeUtc -Value ('%3' -as [Datetime])

ありがたいことに、このフォーラムの別のユーザーからコピーされました。問題は最後の行にあります。 %3変数は、古いファイルのcmd日付($ 〜tI)であり、通常はCreationDateではなくLastModifiedDateです。新しいファイルの作成日を古いファイルの作成日と同じに設定するには、PowerShellが必要です。 [oldfile] .CreationTimeUTCを試してみましたが、役に立ちませんでした。

ヘルプは大歓迎です。

3
Joost

ファイルの作成日を取得するPowershellコマンドの例:

_(Get-ChildItem c:\path\yourFile.txt).CreationTime
_

ファイルの作成日を設定するPowershellコマンドの例:

_(Get-ChildItem c:\path\yourFile.txt).CreationTime = '01/01/1900 12:42AM'
_

したがって、(最後の行ではなく)既存のスクリプトでそのまま使用されるワンライナーとして、次のようにしてみてください。

powershell (Get-ChildItem '%2').CreationTime = (Get-ChildItem '%1').CreationTime

これにより、新しいファイルの作成時間(%2)が古いファイルの作成時間(%1)に設定されます。

これは、_%2_に新しいファイルのパス/名前が含まれ、_%1_に古いファイルのパス/名前が含まれていることを前提としています。 :)

3