#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.