Подтвердить что ты не робот

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

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

Rename-Item c:\misc\*.xml *.tmp

В основном я хочу изменить расширение для всех файлов в каталоге до .tmp вместо .xml. Кажется, я не могу найти прямой способ сделать это в PowerShell.

4b9b3361

Ответ 1

Выведено из примера 4 в справочной документации Rename_Item, извлеченной с помощью команды:

get-help Rename-Item -examples

Пример:

Get-ChildItem *.xml | Rename-Item -NewName { $_.Name -replace '\.xml','.tmp' }

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

Ответ 2

Это также хорошо работает, когда вы находитесь в нужной директории.

Dir | Rename-Item –NewName { $_.name –replace "old","new" }

Ответ 3

Существующие ответы предлагают оператор -replace, но что, если файл называется a.xml.xml? Обе подстановки .xml будут заменены, а конечным результатом будет a.tmp.tmp. К счастью, для этого есть .NET-метод:

Dir *.xml | rename-item -newname { [io.path]::ChangeExtension($_.name, ".tmp") } 

(Маниш Кумар был близок с GetFileNameWithoutExtension, но это более элегантно и, вероятно, немного более эффективно, а не то, что в этом случае это слишком важно)

Ответ 4

Вот еще один вариант, который будет работать.

dir *.xml | Rename-Item -NewName {$_.BaseName + ".tmp"}

$_.BaseName будет выполнять "базовое" имя без (последнего) расширения.

Ответ 5

Еще проще - помните, что строка поиска замены является регулярным выражением,

dir *.xml | rename-item -newname {$_.name -replace "xml$","tmp"}

"$" представляет конец строки, поэтому символы "xml" должны быть последними тремя символами имени файла.

Ответ 6

dir -Recurse | where-object -FilterScript {$_.Extension -eq ".xml"} | Rename-Item -NewName {[System.IO.Path]::GetFileNameWithoutExtension($_.fullname) + ".tmp"}

использовать -WhatIf для оценки результата сначала

Ответ 7

сокращенная версия с использованием псевдонима будет:

ls *.xml | ren -new {$_.BaseName + ".tmp"}