2017-10-13 5 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

Get-ChildItemのように 'Group-Object'を使うことができます。\ * \ *。jpg |グループディレクトリ| ForEach-Object -Begin {$ i = 0} - プロセス{$ _。グループ| %{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ファイル名順にファイルを昇順にソートします。 sortは、Sort-Objectコマンドレットのエイリアスです。
  • Rename-Itemをテストする場合は、-WhatIfスイッチパラメータを追加します。 ++post-incrementing operatorあるので$i = 1、ない$i = 0そのGet-Help Rename-Item -Parameter WhatIfまたはGet-Help about_CommonParameters
  • 注:詳しくは、と入力してください。
  • % {...}% -Process {...}と同じです。 %ForEach-Objectコマンドレットのエイリアスです。
  • パイプライン(|)は改行を許可します。
関連する問題