10

PS を使用した再帰的なファイル名の変更は簡単です ( Mike Ormond のブログの例のバリエーション):

dir *_t*.gif -recurse 
    | foreach { move-item -literal $_ $_.Name.Replace("_thumb[1]", "")}

フォルダー構造の名前を再帰的に変更しようとしています。

ユース ケースは、VS.NET ソリューション全体の名前を変更できるようにすることです (たとえば、Foo.Bar から Bar.Foo に)。これを行うには、いくつかの手順があります。

  1. フォルダーの名前を変更します (例: \Foo.Bar\Foo.Bar.Model => \Bar.Foo\Bar.Foo.Model)
  2. ファイルの名前を変更します (例: Foo.Bar.Model.csproj => Bar.Foo.Model.csproj)。
  3. 名前空間の変更を修正するためにファイル内を検索して置換します (例: 'namespace Foo.Bar' => 'namespace Bar.Foo')

私は現在、このプロセスの最初のステップに取り組んでいます。

この投稿を見つけました。これは、課題について説明し、解決策を主張していますが、その解決策については説明していません。

私は再帰の壁にぶつかり続けます。PS にフラグを使用して再帰を処理させると、親フォルダーの名前が子フォルダーの前に変更され、スクリプトがエラーをスローします。自分で再帰を実装しようとすると、頭が痛くなり、物事がひどくうまくいかなくなります.私の人生では、再帰ツリーの末尾で名前の変更を開始することはできません.

4

3 に答える 3

9

rbellamy が最終的に得た解決策は次のとおりです。

Get-ChildItem $Path -Recurse | %{$_.FullName} |
Sort-Object -Property Length -Descending |
% {
    Write-Host $_
    $Item = Get-Item $_
    $PathRoot = $Item.FullName | Split-Path
    $OldName = $Item.FullName | Split-Path -Leaf
    $NewName = $OldName -replace $OldText, $NewText
    $NewPath = $PathRoot | Join-Path -ChildPath $NewName
    if (!$Item.PSIsContainer -and $Extension -contains $Item.Extension) {
        (Get-Content $Item) | % {
            #Write-Host $_
            $_ -replace $OldText, $NewText
        } | Set-Content $Item
    }
    if ($OldName.Contains($OldText)) {
        Rename-Item -Path $Item.FullName -NewName $NewPath
    }
}
于 2012-03-01T08:08:18.943 に答える
3

これはどうですか - フル ネームの再帰的なリストを作成し、フル ネームの長さで降順に並べ替えてから、名前変更ルーチンを実行します。

例えば

gci <directory> -recurse |
 foreach {$_.fullname} |
  sort -length -desc
于 2011-06-02T15:15:47.313 に答える
2

多分これの何かが役に立つでしょう、これは再帰的にディレクトリ構造に「前」を追加するスニペットです

$dirs = Get-ChildItem c:/foldertorecurse -rec |  Where-Object {$_.PSIsContainer -eq 1} |  sort fullname -descending
foreach ( $dir in $dirs ) { rename-item -path $dir.fullname -newname ("pre" + $dir.name) } 
于 2011-06-02T17:38:33.473 に答える