我有这段代码可以批量重命名我选择的特定目录中的所有 .mkv 和 .mp4 文件:
$i = 0; Get-ChildItem "$env:Userprofile\Videos\Movie_Best_Clips" -Filter "vlc-record-2024*.mp4" -Recurse | %{Rename-Item $_.FullName -NewName ($_.Directory.Name+'_'+'_{0:D4}.mp4' -f $i++)};
$i = 0; Get-ChildItem "$env:Userprofile\Videos\Movie_Best_Clips" -Filter "vlc-record-2024*.mkv" -Recurse | %{Rename-Item $_.FullName -NewName ($_.Directory.Name+'_'+'_{0:D4}.mkv' -f $i++)};
$env:Userprofile\Videos\Movie_Best_Clips
内有多个目录,这些文件夹中都是匹配模式vlc-record-2024*.mp4
或vlc-record-2024*.mkv
的文件。
现在我想在不进行任何重大代码更改的情况下,检查给定目录中Rename-Item
行之前或内部是否存在
与迭代器创建的名称同名的文件。如果此类文件已经存在,则只需执行
continue
类似的行为并递增迭代器,然后为文件提供新名称,以避免重命名项错误。因此,例如,如果名称为“MOVIENAME 2024 ENGLISH 1080P.mkv__0002.mp4”的文件已存在(与要重命名的现有“vlc-record-2024
”文件*位于同一目录中),则只需重命名该文件即可问题是“MOVIENAME 2024 ENGLISH 1080P.mkv__0003.mp4”,并且每次迭代都会这样。 我看到了
这个答案Get-ChildItem "C:\Users\Your\Target\Dir" -Filter "vlc-record-2024*.mp4" -Recurse | ForEach-Object {
$noNewNameFound=$true
while($noNewNameFound){
$newName= $_.Directory.Name+'_'+'_{0:D4}.mkv' -f $i
if(test-path "$($_.parent)\$newname"){$i++}
else{Rename-Item $_.FullName -NewName $newName ; $noNewNameFound=$false; $i++}
}
}
Get-ChildItem
调用中完成此操作。如果您使用
延迟绑定脚本块,也不需要
ForEach-Object
循环。
$i = @{ '.mkv' = 0; '.mp4' = 0 }
$getChildItemSplat = @{
Include = 'vlc-record-2024*.mkv', 'vlc-record-2024*.mp4'
Recurse = $true
Path = "$env:Userprofile\Videos\Movie_Best_Clips"
}
Get-ChildItem @getChildItemSplat | Rename-Item -NewName {
while ($true) {
$name = '{0}_{1:D4}{2}' -f $_.Directory.Name, $i[$_.Extension]++, $_.Extension
if (-not (Test-Path (Join-Path $_.DirectoryName $name))) {
break
}
}
$name
}