使用PowerShell重命名目录中每个文件夹中的每个文件

问题描述:

我有一个大约60个.jpg图像文件夹的目录,每个文件夹大约10张图片。问题在于,在这些目录中的每一个目录中图像的顺序都是正确的,但是名称是重击的,一些目录从000.jpg开始,其他目录在002.jpg。我想要做的是制作一个脚本,它将重新命名这些目录中的文件,从001.jpg开始。使用PowerShell重命名目录中每个文件夹中的每个文件

我有一点成功。以下是在每个目录中执行的代码。

$i = 1 

Get-ChildItem *.jpg | %{Rename-Item $_ -NewName ('{0:D3}.jpg' -f $i++)} 

所以我试图让它在根目录下工作,而不是我执行它60次,每次我必须这样做。到目前为止,我失败了。我试图从各个部分分割它,但现在我甚至不明白我的代码应该做什么。

$dir = Get-ChildItem | ?{ $_.PSIsContainer } 
$dir | Foreach-Object{ 
$i = 1 

Get-ChildItem *.jpg | %{Rename-Item $_ -NewName ('{0:D3}.jpg' -f $i++)}} 

我跟你说实话,我不太了解PowerShell。这就是为什么我要求您帮助修复代码并使其更好地工作。

+1

您需要进入每个文件夹,进行重命名,然后再次返回。 '$ rootDir = Get-Location'在脚本的顶部,然后对于每个循环'set-location $ _'执行Get-ChildItem重新编号然后'set-location $ rootDir'返回原点。 – TessellatingHeckler

+1

您可以使用'Group-Object'如'Get-ChildItem。\ * \ *。jpg |组目录| ForEach-Object -Begin {$ i = 0} -Process {$ _。Group | %{Rename-Item $ _ -NewName('{0:D3} .jpg'-f $ i ++)}}}'......我很确定这样做会达到你想要的效果。 – TheMadTechnician

试试这个:

Set-Location 'C:\path\to\rootdir' 
Get-ChildItem -Directory -Recurse | % { 
    Get-ChildItem -Path $_.FullName -Filter *.jpg | 
    sort Name | 
    ForEach-Object -Begin { $i = 1 } -Process { 
     Rename-Item $_.FullName -NewName ('{0:D3}.jpg' -f $i++) 
    } 
} 
  • Get-ChildItem -Directory -Recurse得到所有子子-...-子目录。 (-Path .\*\*.jpg只能获得子版本。)
  • Get-ChildItem -Path <path> -Filter *.jpg获取<path>目录下的所有jpg文件。
  • sort Name按文件名升序排列文件。 sortSort-Object cmdlet的别名。
  • 如果您要测试Rename-Item,请附加-WhatIf切换参数。欲了解更多信息,请键入:Get-Help Rename-Item -Parameter WhatIfGet-Help about_CommonParameters
  • 请注意,$i = 1,而不是$i = 0,因为++post-incrementing operator
  • % {...}% -Process {...}相同。 %ForEach-Object cmdlet的别名。
  • 流水线(|)允许换行。