【问题标题】:Using Powershell to recursively rename directories using a lookup file使用 Powershell 使用查找文件递归地重命名目录
【发布时间】:2010-12-13 18:34:27
【问题描述】:

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

我有一个 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*}

【问题讨论】:

  • 这可能更适合 SO。

标签: windows powershell rename


【解决方案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

【讨论】:

    【解决方案2】:

    “-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。

    【讨论】:

    • 非常有趣 - 我不知道 Import-Csv。
    猜你喜欢
    • 2014-03-03
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 2014-07-12
    • 2021-06-09
    相关资源
    最近更新 更多