前提・実現したいこと
PowerShellで、指定したパス以下にある「階層化された」フォルダの全ての名前の頭に番号を付けたいのです。
一般的にこういう場合は
$items = Get-ChildItem $sourceFolder -Recurse -Directory;
でフォルダのオブジェクト配列を取得し、
foreach ($item in $items) { Rename-Item -path $item.FullName -NewName ($targetnumber + $item.Name); }
で順番にリネームするなどが考えられるわけですが、階層化されたフォルダの場合うまくいきません。
発生している問題/試したこと
以下のようなtemp以下にいくつかフォルダがある構成だとして
D:¥temp¥ D:¥temp¥hoge¥ D:¥temp¥hoge¥fuga¥ D:¥temp¥hoge¥fuga¥piyo¥
ゴールとしてはD:¥temp¥をスクリプトで指定し、"123"を付加し、以下のようになってほしいのですが、
D:¥temp¥ D:¥temp¥123hoge¥ D:¥temp¥123hoge¥123fuga¥ D:¥temp¥123hoge¥123fuga¥123piyo¥
多くの場合、上の階層のフォルダの名前が変わった段階(★)で、下位のフォルダのパスが変わってしまいますから、変更元のフォルダが見つからないエラーになってしまいます。
D:¥temp¥ D:¥temp¥123hoge¥ ←★ D:¥temp¥hoge¥fuga¥ ←エラー D:¥temp¥hoge¥fuga¥piyo¥ ←エラー
Rename-Item : 'D:¥temp¥hoge¥fuga¥' の項目は存在しないため、名前を変更できません。 発生場所 test.ps1:100 文字:7 + ... Rename-Item -path $item.FullName -NewName ($target ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Rename-Item]、PSInvalidOperationException + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand
解決方法について
この場合、やはりループ1回でやろうとせず、再帰のような形でフォルダごとに繰り返しやるしかないのでしょうか。
オブジェクト配列を末尾からリネームするとか、何らかの方法でパス文字列の文字数降順でソートができると良いかと思うのですが、ちょっと現在やり方が見つけられずにいます。
皆様のお知恵を拝借できないものでしょうか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。