2017-10-13 184 views
1

我有一個大約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

回答

0

試試這個:

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的別名。
  • 流水線(|)允許換行。
相關問題