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

标签 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*}

最佳答案

“-morestuffhere”是棘手的部分。 Move-Item 和 Rename-Item 上的路径参数(即源位置)不采用通配符。但这可以通过另一种方式解决。首先,您能否像这样将 CSV header 添加到您的 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。

关于windows - 使用 Powershell 使用查找文件递归重命名目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1686443/

相关文章:

windows - 如何调试无响应的Grails应用程序?

linux - 在 Windows 上将 "node"命令更改为 "nodejs"

c# - 不使用 XAML 绘制形状

mysql - 如何在 mysql 5.6.16 中重命名分区名称

c# - 如何使用代码重命名文档库中的标题列?

pandas - 重命名列后得到keyerror

c++ - 使用 CMake、Clang 和 Ninja 在 Windows 上构建 c++ 项目

powershell - 如何动态创建环境变量?

sharepoint - 使用 PowerShell 激活功能时读取 FeatureActivated 事件上的 web.config

windows - 如何使用参数(描述空白)获取广告中的所有 OU - 没有描述?