有人能帮我把这句话说对吗?
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),通常是 LastModifiedDate,而不是 CreationDate。我需要 powershell 将新文件的创建日期设置为与旧文件的创建日期相同。我对 [oldfile].CreationTimeUTC 进行了一些实验,但无济于事。
非常感谢您的帮助。
答案1
获取文件创建日期的 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
包含旧文件的路径/名称。:)
答案2
我已成功创建了一个 Powershell 脚本,该脚本可在两个文件夹之间将所有视频的创建日期覆盖为原始视频中的新视频!文件名必须与原始文件匹配。
$originalVideosDirectory = "original directory path"
$encodedVideosDirectory = "encoded directory path"
# Get filenames and modification dates of original videos
$originalVideos = Get-ChildItem -Path $originalVideosDirectory -File | ForEach-Object {
[PSCustomObject]@{
Name = $_.Name
ModificationDate = $_.LastWriteTime
}
}
# Get the filenames of newly created videos
$encodedVideos = Get-ChildItem -Path $encodedVideosDirectory -File
# Identify the newly created videos that match the original videos
foreach ($encodedVideo in $encodedVideos) {
$originalVideo = $originalVideos | Where-Object { $_.Name -eq $encodedVideo.Name }
if ($originalVideo) {
$modificationDate = $originalVideo.ModificationDate
# Set the creation date of the new video
$encodedVideo.CreationTime = $modificationDate
$encodedVideo.LastWriteTime = $modificationDate
# Check date setting
$encodedVideo.Refresh()
Write-Host "$($encodedVideo.Name) creation date changed to: $($encodedVideo.CreationTime)"
}
}