按顺序重命名文件,如果文件已经存在(名称冲突),则只需增加迭代器即可为文件提供新名称

问题描述 投票:0回答:2

我有这段代码可以批量重命名我选择的特定目录中的所有 .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”,并且每次迭代都会这样。 我看到了

这个答案

,但是回答者写的代码太长了,我想以尽可能短的方式完成它,但无法集中精力思考如何实现它,任何帮助都是值得赞赏的。

powershell file-rename powershell-5.0 powershell-5.1 rename-item-cmdlet
2个回答
0
投票

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++} } }



0
投票
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 }

	
© www.soinside.com 2019 - 2024. All rights reserved.