重命名子目录中具有相同名称和扩展名(通常为 .pdf)的文件,编号递增

Rename files with same name and extension (usually .pdf) in the sub directories with incrementing number

我的文件夹结构是这样的:

文件夹 1

文件夹 2

子文件夹 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++ 
   }
 }

我刚刚通过一个非常善良的人找到了我的问题的答案。无论如何..这是对我有用的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