我的文件夹结构如下:
文件夹1
文件夹2
SubFolder 2.1
文件夹3
这就是我的尝试,但肯定是错的。我正在使用Powershell 2.0版。
$i = 1
$folder = Get-ChildItem "C:\Users\xyz\testfolder\pdf_files\"
foreach ($file in $folder){
if (($file.BaseName + $file.extension) -match ($file.BaseName +
$file.extension)){
Rename-Item -Path $file.FullName -NewName "$($file.BaseName +
$i)$($file.extension)" -Verbose -WhatIf
$i++
}
}
答案 0 :(得分:1)
我刚通过一个善良的人找到了我的问题的答案。无论如何...... PS脚本对我有用..
$Files = Get-ChildItem -LiteralPath 'C:\Foo\Bar\Files\' -Recurse | Where-
Object { -not $_.PSIsContainer }
$FileNameCounts = @{}
ForEach ($File In $Files) {
$BaseName = $File.BaseName
If ($FileNameCounts.Keys -contains $BaseName) {
$NewName = '{0}-{1}{2}' -f $BaseName, $FileNameCounts[$BaseName],
$File.Extension
$File | Rename-Item -NewName $NewName -WhatIf
$FileNameCounts[$BaseName]++
} Else {
$FileNameCounts[$BaseName] = 1
}
}
答案 1 :(得分:1)
这是另一种做同样事情的方法。
Get-ChildItem -Recurse -file | Group-Object Name | foreach-object {
$script:i = 1
$_.Group | Select-Object -Skip 1 |
Rename-Item -newname { "{0}-{1}{2}" -f $_.basename, $script:i++, $_.extension }
}
Group-Object
为我们提供了所有具有相同名称的文件,对于每组名称,将跳过第一个文件,其余文件将被重命名。
它还利用专为此用例设计的功能,-NewName
可以将scriptblock作为参数。将为每个管道项调用scriptblock,结果将作为新名称传递给Rename-Item
。