Могу ли я переименовывать файлы во вложенных папках на основе.Файл CSV с помощью Powershell

#powershell #csv #rename

#powershell #csv #переименовать

Вопрос:

Я хочу переименовать некоторые файлы на основе файла .csv, мне удалось сделать это, используя следующий код

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

но это переименовывает только файлы в родительской папке
Я пытался включить в него файлы во вложенных папках, но тщетно

Я попытался добавить

 Get-ChildItem
  

Появляется ошибка, возможно, я не знаю, как объединить ее с import csv

формат файла .csv является

Oname,NName
Name1,NewName1
Name2,Newname2

Комментарии:

1. да, это можно сделать. [ усмешка ] посмотрите Get-Help Get-ChildItem -Parameter Recurse на один из способов сделать это.

2. Спасибо за ваш ответ, честно говоря, я пытался, но это не сработало <br> может быть, потому, что я не знаю, куда их включить

Ответ №1:

вот один из способов выполнить эту работу. это немного более обходной путь, поскольку файлы могут находиться где угодно в дереве целевых каталогов. что это делает…

  • подделывает чтение в CSV старых / новых имен файлов
  • задает целевой верхний каталог
  • задает тип файла,
    если у вас нет только одного типа файла, это можно удалить здесь и в Get-ChildItem строке.
  • возвращает все файлы в целевом дереве каталогов, которые соответствуют ONames в файле CSV
  • выполняет итерацию по этой коллекции файловых элементов
  • возвращает индекс [положение элемента в массиве] OName, который соответствует имени текущего элемента файла
  • выполняется ли переименование этого файла, чтобы
    -WhatIf в конце Rename-Item строки было показано, что произойдет. [усмешка] удалите это, когда будете готовы сделать это по-настоящему с вашими образцовыми данными [и позже с вашими реальными данными].

вот код…

 # 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:TEMPTesting"
$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:TempTestingGWords_2019-02-20.log
    Destination:
        C:TempTestingMORE_GWords_2019-02-20.log".
What if: Performing the operation "Rename File" on target
        "Item: C:TempTestingSubOneOne_GWords_2019-02-27.log
    Destination:
        C:TempTestingSubOneSlightly different - One_GWords_2019-02-27.log".
What if: Performing the operation "Rename File" on target
        "Item: C:TempTestingSubTwoTwo_2019-03-06.log
    Destination:
        C:TempTestingSubTwoYet another _-_ Two_2019-03-06.log".
  

Ответ №2:

Я предлагаю:

  • считывать csv в переменную
  • затем создайте хэш-таблицу из пар OldName NewName
  • используйте .Свойство OName с помощью Get-ChildItem -Include для рекурсивного выбора файлов
  • напрямую перейдите к Rename-Item и получите новое имя из хэш-таблицы

 ## Q:Test2019330SO_55433812.ps1
$Renames = Import-csv "C:Locationrename.csv"
$TargetDir = "$env:TEMPTesting"

$RenHash = @{}
$Renames | ForEach-Object { $RenHash[$_.OName]=$_.NName }

Get-ChildItem -Path $TargetDir -Recurse -Include $Renames.OName | 
    Rename-Item -NewName {$RenHash[$_.Name]} -WhatIf
  

Пример вывода из тестовой папки this years (немецкий язык)

 WhatIf: Ausführen des Vorgangs "Datei umbenennen" für das 
Ziel "Element: Q:Test2019217test.txt 
         Ziel: Q:Test2019217Example.txt".
WhatIf: Ausführen des Vorgangs "Datei umbenennen" für das 
Ziel "Element: Q:Test2019228file.csv 
         Ziel: Q:Test2019228File.Csv".
WhatIf: Ausführen des Vorgangs "Datei umbenennen" für das 
Ziel "Element: Q:Test2019228test.txt 
         Ziel: Q:Test2019228Example.txt".
WhatIf: Ausführen des Vorgangs "Datei umbenennen" für das 
Ziel "Element: Q:Test2019319sample.csv 
         Ziel: Q:Test2019319Example.csv".
  

Если вывод выглядит нормально, удалите завершающий -WhatIf

Комментарии:

1. Спасибо, код выполняется, но он ничего не делает, ошибок нет.. Я считаю, что чего-то не хватает

2. Настройте пути в первых строках, остальное зависит от вас rename.csv , обрабатываются только файлы, соответствующие свойству OName.