Я пытаюсь сделать следующее:
Rename-Item c:\misc\*.xml *.tmp
В основном я хочу изменить расширение для всех файлов в каталоге до .tmp
вместо .xml
. Кажется, я не могу найти прямой способ сделать это в PowerShell.
Я пытаюсь сделать следующее:
Rename-Item c:\misc\*.xml *.tmp
В основном я хочу изменить расширение для всех файлов в каталоге до .tmp
вместо .xml
. Кажется, я не могу найти прямой способ сделать это в PowerShell.
Выведено из примера 4 в справочной документации Rename_Item, извлеченной с помощью команды:
get-help Rename-Item -examples
Пример:
Get-ChildItem *.xml | Rename-Item -NewName { $_.Name -replace '\.xml','.tmp' }
Обратите внимание на объяснение в справочной документации для обратного слэша экранирования в команде replace из-за него с использованием регулярных выражений, чтобы найти текст для замены.
Это также хорошо работает, когда вы находитесь в нужной директории.
Dir | Rename-Item –NewName { $_.name –replace "old","new" }
Существующие ответы предлагают оператор -replace
, но что, если файл называется a.xml.xml
? Обе подстановки .xml
будут заменены, а конечным результатом будет a.tmp.tmp
. К счастью, для этого есть .NET-метод:
Dir *.xml | rename-item -newname { [io.path]::ChangeExtension($_.name, ".tmp") }
(Маниш Кумар был близок с GetFileNameWithoutExtension
, но это более элегантно и, вероятно, немного более эффективно, а не то, что в этом случае это слишком важно)
Вот еще один вариант, который будет работать.
dir *.xml | Rename-Item -NewName {$_.BaseName + ".tmp"}
$_.BaseName
будет выполнять "базовое" имя без (последнего) расширения.
Еще проще - помните, что строка поиска замены является регулярным выражением,
dir *.xml | rename-item -newname {$_.name -replace "xml$","tmp"}
"$" представляет конец строки, поэтому символы "xml" должны быть последними тремя символами имени файла.
dir -Recurse | where-object -FilterScript {$_.Extension -eq ".xml"} | Rename-Item -NewName {[System.IO.Path]::GetFileNameWithoutExtension($_.fullname) + ".tmp"}
использовать -WhatIf для оценки результата сначала
сокращенная версия с использованием псевдонима будет:
ls *.xml | ren -new {$_.BaseName + ".tmp"}