Я пытаюсь сделать следующее:
Rename-Item c: misc *. xml * .tmp
Я в основном хочу изменить расширение каждого файла в каталоге на .tmp
вместо .xml
. Кажется, я не могу найти простой способ сделать это в PowerShell.
Из примера 4 в справочной документации Rename-Item
извлекается с помощью команды:
get-help Rename-Item -examples
Пример:
Get-ChildItem * .txt | Rename-Item -NewName {$ _. Name -replace ' .txt', '. Log'}
Обратите внимание на объяснение в справочной документации для экранирование обратной косой черты в команде замены из-за использования регулярных выражений для поиска текста для замены.
Чтобы гарантировать соответствие только оператора регулярного выражения -replace
расширение в конце строки, включите символ конца строки регулярного выражения $
.
Get-ChildItem * .txt | Rename-Item -NewName {$ _. Name -replace ' .txt $', '. Log'}
Это касается случая, упомянутого @OhadSchneider в комментариях , где у нас может быть файл с именем lorem.txt.txt
, и мы хотим получить в итоге lorem.txt.log
, а не lorem.log.log
.
Теперь, когда регулярное выражение достаточно точно нацелено и вдохновлено ответом @ etoxin, мы могли бы сделать команду более удобной для использования следующим образом:
Get-ChildItem | Rename-Item -NewName {$ _. Name -replace ' .txt $', '. Log'}
То есть нет необходимости фильтровать перед конвейером, если наше регулярное выражение достаточно фильтрует после трубы. И изменение командной строки (например, если вы скопируете указанную выше команду и теперь хотите использовать ее для изменения расширения файлов .xml) больше не требуется в двух местах.
Это тоже хорошо работает, когда вы находитесь в нужном каталоге.
Dir | Rename-Item –NewName {$ _. Name –replace "old", "new"}
Это тоже хорошо работает, когда вы находитесь в нужном каталоге.
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
, но это более элегантно и, вероятно, немного более эффективно, не то чтобы это слишком важно в данном случае)
Существующие ответы предлагают -replace
оператор, но что, если файл называется a.xml.xml
? Обе подстроки .xml
будут заменены, и конечный результат будет a.tmp.tmp
. К счастью, для этого есть метод .NET:
Dir * .xml | rename-item -newname {[io.path ] :: ChangeExtension ($ _. Name, ".tmp")}
(Маниш Кумар был близок с GetFileNameWithoutExtension
, но это более элегантно и, вероятно, немного более эффективно, но в данном случае это не слишком важно)
Вот еще один вариант, который работа.
dir * .xml | Re name-Item -NewName {$ _. BaseName + ".tmp"}
$ _. BaseName
сделает «базовое» имя без (последнее) расширение.
Вот еще один вариант, который подойдет.
dir * .xml | Rename-Item -NewName {$ _. BaseName + ".tmp"}
$ _. BaseName
сделает «базовое» имя без (последнее) расширение.
сокращенная версия с использованием псевдонима будет выглядеть так:
ls * .xml | ren -new {$ _. BaseName + ".tmp"}
сокращенная версия с использованием псевдонима будет выглядеть так:
ls * .xml | ren -new {$ _. BaseName + ".tmp"}
dir -Recurse | где-объект -FilterScript {$ _. Extension -eq ".xml"} | Rename-Item -NewName {[System.IO.Path] :: GetFileNameWithoutExtension ($ _. Fullname) + ".tmp"}
сначала используйте -WhatIf для оценки результата
dir -Recurse | где-объект -FilterScript {$ _. Extension -eq ".xml"} | Rename-Item -NewName {[System.IO.Path] :: GetFileNameWithoutExtension ($ _. Fullname) + ".tmp"}
сначала используйте -WhatIf для оценки результата
Еще проще — помните, что строка поиска замены является регулярным выражением,
dir * .xml | rename-item -newname {$ _. name -replace "xml $", "tmp"}
Знак «$» представляет конец строки, поэтому символы «xml «должны быть последними тремя символами имени файла.
Еще проще — помните, что строка поиска замены является регулярным выражением
dir * .xml | rename-item -newname {$ _. name -replace "xml $", "tmp"}
Знак «$» представляет конец строки, поэтому символы «xml «должны быть последними тремя символами имени файла.
Кажется, это работает и является питоническим, т.е. простым лучше, чем сложный (https://www.python.org/dev/peps/pep-0020/) способ сделать это (когда вы находитесь в каталоге):
$ files = Get-ChildItem -file -Filter * .xml; ForEach ($ file в $ files) {$ n = $ file.Basename Copy-Item -Path $ file -Destination "$ n.tmp" Remove-Item "$ n.xml"}
Кажется, это работает и является питоническим, т.е. простое лучше, чем сложное (https://www.python.org/dev/peps/pep-0020/) способ сделать это (как только вы окажетесь в каталоге):
$ files = Get-ChildItem -file -Filter * .xml; ForEach ($ file в $ files) {$ n = $ file.Basename Copy-Item -Path $ file -Destination "$ n.tmp" Remove-Item "$ n.xml"}