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

时间:2018-04-29 06:47:14

标签: powershell-v2.0

我的文件夹结构如下:

文件夹1

  • 文件1.pdf
  • 文件2.pdf
  • 文件3.pdf

文件夹2

  • 文件1.pdf --->将其重命名为"文件1-1.pdf"
  • 文件2.pdf --->将其重命名为"文件2-1.pdf"
  • 文件5.pdf

SubFolder 2.1

  • 文件2.pdf --->将其重命名为"文件2-2.pdf"
  • 文件4.pdf
  • 文件5.pdf --->将其重命名为"文件5-1.pdf"

文件夹3

  • 文件1.pdf --->将其重命名为"文件1-2.pdf"
  • 文件2.pdf --->将其重命名为"文件2-3.pdf"
  • 文件4.pdf --->将其重命名为"文件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++ 
   }
 }

2 个答案:

答案 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