Get-ChildItem -LiteralPath . -Filter *.pdf | ForEach-Object -Begin {$c = 0} -Proces {Rename-Item -LiteralPath $_.FullName (Join-Path $_.DirectoryName ($_.Name -replace '^(.{1,8}).*?(\.[^\.]+)?$', ('$1' + "_$c" + '$2'))); $c++}join-path 是多余的,不需要给完整的目标用完整路径只是为了避开一个bug,不过为此 -LiteralPath .也应该要改成 -LiteralPath $PWD.Path$suffix=''; while(Test-path -LiteralPath ($newPath =Join-Path $_.DirectoryName ($baseName+$suffix+$extension))){$suffix = "_$c" -f c++}; Rename-Item $_ $newPath产生新路径的地方大概改成这样,至于把档名拆成basename与副档名的方法可以参考我上面用的正规表示法,因为5.1的split-path不支援分拆出basename
https://i.imgur.com/DkCaj7k.jpeg你可以参考这个函式这里借用了.net 的 IO.Path 物件还有按照你的需求,不同档案要重新计数,你不应该把初始值写在 -Begin {} 中,因为它管道中只会执行一次,也就是只有第一个档案之前会执行到应该在 -Process { } 中最上方