1

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

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

2 回答 2

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。

于 2009-11-06T18:31:31.907 回答
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
于 2009-11-06T10:26:06.863 回答