使用Powershell使用查找文件递归重命名目录

时间:2009-11-05 10:38:08

标签: windows powershell rename

我需要重命名很多目录及其子目录。

我有一个csv文件,其中包含旧目录名和所需的新名称。

1,blah,old_name1,new_name2,wibble
2,foo,old_name2,new_name2,bar
3,john,old_name3,new_name3,paul
4,george,old_name4,new_name4,ringo

请注意,某些目录名称是

old_name1-morestuffhere 

需要重命名为

 new_name1-morestuffhere

我广泛知道如何在bash中执行此操作:

mv -r `cat file.csv | awk -F, '{print $3* $4*}'`

..但我一定会和powershell完全失败。

编辑:这是我到目前为止所得到的。这是否接近?:

cat .\file.csv | foreach { $oldname = $_.split(",")[2], $newname = $_.split(",")[3], move-item $oldname*, $newname*}

2 个答案:

答案 0 :(得分:3)

“ - morestuffhere”是棘手的部分。 Move-Item和Rename-Item上的Path参数(即源位置)不带通配符。但这可以通过另一种方式解决。首先,您可以将CSV标头添加到CSV文件中,如下所示:

Index,F2,OldName,NewName,F5
1,blah,old_name1,new_name2,wibble
...

如果是这样,我们可以使用PowerShell的Import-Csv cmdlet。现在,以下内容似乎有点复杂,但它处理了多个OldName-<differentstuffhere>NewName-<sameasoldnamestuffhere>重命名的情况。

$names = Import-Csv names.csv | 
             Foreach {
                 $oldDirs=@(Get-ChildItem . -r -filter "$($_.OldName)*" | 
                            ?{$_.PSIsContainer} | %{$_.FullName})
                 Add-Member -in $_ NoteProperty OldDirs $oldDirs -PassThru
             }

foreach ($name in $names) {
    foreach ($oldDir in $name.oldDirs) {
        $dir     = Split-Path $oldDir -Parent
        $suffix  = (Split-Path $oldDir -Leaf).Substring($name.OldName.Length)
        $newPath = Join-Path $dir ($name.NewName + $suffix)
        Rename-Item $oldDir ($name.NewName + $suffix) -WhatIf -ea 0
    }
}

这是手工编写,因此可能存在错误。当你对结果感到满意时,删除-Whatif。

答案 1 :(得分:1)

这是另一种选择,因为你应该已经安装了vbscript

Set objFS = CreateObject("Scripting.FileSystemObject")
strFile= "C:\test\file.csv"
Set objFile = objFS.OpenTextFile(strFile,1)
Do Until objFile.AtEndOfStream 
    strLine = objFile.ReadLine
    s = Split(strLine,",")
    oldname = s(2)
    newname = s(3)
    WScript.Echo oldname, newname
    Set objFile=objFS.GetFile(oldname)
    objFile.Name = newname  
    Set objFile=Nothing 
Loop