Как я могу массово переименовать файлы в PowerShell?

Я пытаюсь сделать следующее:

  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"}  

Оцените статью
techsly.ru
Добавить комментарий