【问题标题】:Can I rename files in subfolders based on.CSV file using Powershell我可以使用 Powershell 重命名基于 .CSV 文件的子文件夹中的文件吗
【发布时间】:2019-08-21 08:40:49
【问题描述】:

我想根据 .csv 文件重命名一些文件,我使用以下代码成功地这样做了

Import-Csv "C:\Location\rename.csv" | foreach { Rename-Item -Path $_.Oname -NewName $_.NName }

但这只会重命名父文件夹中的文件
我试图让它包含子文件夹中的文件,但徒劳无功

我尝试添加

Get-ChildItem

出现错误,可能我不知道如何将它与导入的 csv 结合起来

.csv 文件格式为

Oname,NName
名称1,新名称1
名称2,新名称2

【问题讨论】:

  • 是的,可以做到。 [grin] 查看Get-Help Get-ChildItem -Parameter Recurse 的一种方法。
  • 感谢您的回答,老实说,我试过了,但没有成功
    可能是因为我不知道在哪里包含它们

标签: powershell csv rename


【解决方案1】:

这是完成这项工作的一种方法。由于文件可能位于目标目录树中的任何位置,因此更加迂回。它是做什么的......

  • 伪造读取新旧文件名的 CSV 文件
  • 设置目标顶层目录
  • 设置文件类型
    如果您没有只有一种文件类型,可以在此处和Get-ChildItem 行中将其删除。
  • 获取目标目录树中与CSV文件中ONames匹配的所有文件
  • 遍历该文件项集合
  • 获取与当前文件项名匹配的OName的索引[数组中项的位置]
  • 对该文件进行重命名
    -WhatIfRename-Item 行的末尾是用来显示会发生什么的。 [grin] 当您准备好对您的样本数据 [以及稍后对您的真实数据] 执行此操作时,将其删除。

这里是代码...

# fake reading in a CSV file
#    in real life, use Import-CSV
$InStuff = @'
OName, NName
"GWords_2019-02-20.log", "MORE_GWords_2019-02-20.log"
"Two_2019-03-06.log", "Yet another _-_ Two_2019-03-06.log"
"One_GWords_2019-02-27.log", "Slightly different - One_GWords_2019-02-27.log"
'@ | ConvertFrom-Csv

$TargetDir = "$env:TEMP\Testing"
$Filter = '*.log'

$FileList = Get-ChildItem -LiteralPath $TargetDir -Filter $Filter -File -Recurse |
    Where-Object {$_.Name -in $InStuff.OName}

foreach ($FL_Item in $FileList)
    {
    $Index = $InStuff.OName.IndexOf($FL_Item.Name)
    Rename-Item -LiteralPath $FL_Item.FullName -NewName $InStuff[$Index].NName -WhatIf
    }

输出[重新格式化以提高可读性] ...

What if: Performing the operation "Rename File" on target 
        "Item: C:\Temp\Testing\GWords_2019-02-20.log
    Destination:
        C:\Temp\Testing\MORE_GWords_2019-02-20.log".
What if: Performing the operation "Rename File" on target
        "Item: C:\Temp\Testing\SubOne\One_GWords_2019-02-27.log
    Destination:
        C:\Temp\Testing\SubOne\Slightly different - One_GWords_2019-02-27.log".
What if: Performing the operation "Rename File" on target
        "Item: C:\Temp\Testing\SubTwo\Two_2019-03-06.log
    Destination:
        C:\Temp\Testing\SubTwo\Yet another _-_ Two_2019-03-06.log".

【讨论】:

    【解决方案2】:

    我建议:

    • 将 csv 读入变量
    • 然后从 OldName NewName 对构建一个哈希表
    • 使用 .OName 属性和 Get-ChildItem -Include 以递归方式选择文件
    • 直接管道到 Rename-Item 并从哈希表中获取 NewName

    ## Q:\Test\2019\03\30\SO_55433812.ps1
    $Renames = Import-csv "C:\Location\rename.csv"
    $TargetDir = "$env:TEMP\Testing"
    
    $RenHash = @{}
    $Renames | ForEach-Object { $RenHash[$_.OName]=$_.NName }
    
    Get-ChildItem -Path $TargetDir -Recurse -Include $Renames.OName | 
        Rename-Item -NewName {$RenHash[$_.Name]} -WhatIf
    

    今年测试文件夹的示例输出(德语区域设置)

    WhatIf: Ausführen des Vorgangs "Datei umbenennen" für das 
    Ziel "Element: Q:\Test\2019\02\17\test.txt 
             Ziel: Q:\Test\2019\02\17\Example.txt".
    WhatIf: Ausführen des Vorgangs "Datei umbenennen" für das 
    Ziel "Element: Q:\Test\2019\02\28\file.csv 
             Ziel: Q:\Test\2019\02\28\File.Csv".
    WhatIf: Ausführen des Vorgangs "Datei umbenennen" für das 
    Ziel "Element: Q:\Test\2019\02\28\test.txt 
             Ziel: Q:\Test\2019\02\28\Example.txt".
    WhatIf: Ausführen des Vorgangs "Datei umbenennen" für das 
    Ziel "Element: Q:\Test\2019\03\19\sample.csv 
             Ziel: Q:\Test\2019\03\19\Example.csv".
    

    如果输出看起来正常,请删除结尾的 -WhatIf

    【讨论】:

    • 谢谢,代码运行了,但它什么也没做,没有错误..我相信有些东西不见了
    • 调整第一行的路径,其余的取决于你的rename.csv,只处理匹配OName属性的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2018-08-21
    • 2018-02-07
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    相关资源
    最近更新 更多