重命名子目录中具有相同名称和扩展名(通常为 .pdf)的文件,编号递增
Rename files with same name and extension (usually .pdf) in the sub directories with incrementing number
我的文件夹结构是这样的:
文件夹 1
- 文件1.pdf
- 文件2.pdf
- 文件3.pdf
文件夹 2
- 文件 1.pdf ---> 将其重命名为 "File 1-1.pdf"
- 文件 2.pdf ---> 将其重命名为 "File 2-1.pdf"
- 文件5.pdf
子文件夹 2.1
- 文件 2.pdf ---> 将其重命名为 "File 2-2.pdf"
- 文件4.pdf
- 文件 5.pdf ---> 将其重命名为 "File 5-1.pdf"
文件夹 3
- 文件 1.pdf ---> 将其重命名为 "File 1-2.pdf"
- 文件 2.pdf ---> 将其重命名为 "File 2-3.pdf"
- 文件 4.pdf ---> 将其重命名为 "File 4-1.pdf"
- 文件6.pdf
- 文件7.pdf
这就是我正在尝试的,但它肯定是错误的。我正在使用 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++
}
}
我刚刚通过一个非常善良的人找到了我的问题的答案。无论如何..这是对我有用的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
}
}
这是做同样事情的另一种方法。
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
可以将脚本块作为参数。将为每个管道项目调用脚本块,结果将作为新名称传递给 Rename-Item
。
我的文件夹结构是这样的:
文件夹 1
- 文件1.pdf
- 文件2.pdf
- 文件3.pdf
文件夹 2
- 文件 1.pdf ---> 将其重命名为 "File 1-1.pdf"
- 文件 2.pdf ---> 将其重命名为 "File 2-1.pdf"
- 文件5.pdf
子文件夹 2.1
- 文件 2.pdf ---> 将其重命名为 "File 2-2.pdf"
- 文件4.pdf
- 文件 5.pdf ---> 将其重命名为 "File 5-1.pdf"
文件夹 3
- 文件 1.pdf ---> 将其重命名为 "File 1-2.pdf"
- 文件 2.pdf ---> 将其重命名为 "File 2-3.pdf"
- 文件 4.pdf ---> 将其重命名为 "File 4-1.pdf"
- 文件6.pdf
- 文件7.pdf
这就是我正在尝试的,但它肯定是错误的。我正在使用 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++
}
}
我刚刚通过一个非常善良的人找到了我的问题的答案。无论如何..这是对我有用的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
}
}
这是做同样事情的另一种方法。
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
可以将脚本块作为参数。将为每个管道项目调用脚本块,结果将作为新名称传递给 Rename-Item
。