我可以使用Powershell基于.CSV文件重命名子文件夹中的文件吗

时间:2019-03-30 17:10:39

标签: powershell csv rename

我想基于.csv文件重命名一些文件,我成功使用以下代码完成了

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

但是仅重命名父文件夹中的文件
我试图使其包含子文件夹中的文件,但没有成功

我尝试添加

Get-ChildItem

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

.csv文件格式为

  

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

2 个答案:

答案 0 :(得分:1)

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

  • 无法读取CSV文件中的旧文件名/新文件名
  • 设置目标顶级目录
  • 设置文件类型
    如果您只有一种文件类型,则可以在此处和Get-ChildItem行中将其删除。
  • 在目标目录树中获取与CSV文件中的ONames匹配的所有文件
  • 通过该文件项进行迭代
  • 获取与当前文件项目名称匹配的OName的索引[项目在数组中的位置]
  • 对该文件进行重命名
    -WhatIf行末尾的Rename-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".

答案 1 :(得分:1)

我建议:

  • 将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