Можно ли переименовать файлы в подпапках на основе файла .CSV с помощью Powershell - PullRequest
1 голос
/ 30 марта 2019

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

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

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

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

Get-ChildItem

Получается ошибка, вероятно, я не знаю, как совместить ее с импортом CSV

.csv формат файла

Oname, NNAME
Name1, NewName1
Name2, Newname2

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Предлагаю:

  • читать 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

1 голос
/ 30 марта 2019

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

  • фальшивое чтение в 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: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".
...