如何使用Powershell递归重命名文件夹?

时间:2011-06-02 15:06:37

标签: powershell recursion file-rename

使用PS递归重命名文件很简单(例如,Mike Ormond's blog的变体):

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')
  4. 我目前正在这个过程的第一步。

    我找到this帖子,其中讨论了挑战,并提出了一个解决方案,但没有谈到解决方案是什么。

    我一直跑进递归墙。如果我让PS使用标志处理递归,则在子项之前重命名父文件夹,并且脚本会引发错误。如果我自己尝试实现递归,那么我的头脑会变得很烦,而且事情发生了可怕的错误 - 对于我的生活,我无法在递归树的尾部开始重命名。

3 个答案:

答案 0 :(得分:8)

以下是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
    }
}

答案 1 :(得分:3)

这个怎么样 - 做一个全名的递归列表,按照全名的长度按降序排序,然后通过重命名例程运行它。

e.g。

gci <directory> -recurse |
 foreach {$_.fullname} |
  sort -length -desc

答案 2 :(得分: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) }