Jak mogę masowo zmieniać nazwy plików w PowerShell?

Staram się wykonać następujące czynności:

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

Chcę zmienić rozszerzenie dla każdego pliku w katalogu na .tmp zamiast .xml. Nie mogę znaleźć prostego sposobu, aby to zrobić w PowerShell.

Author: Kevin Panko, 2012-11-14

7 answers

Pochodzi z przykładu 4 w dokumentacji pomocy dla Rename_Item pobranej komendą:

get-help Rename-Item -examples

Przykład:

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

zwróć uwagę na wyjaśnienie w dokumentacji pomocy dla odwrotnego ukośnika w poleceniu zastąp z powodu użycia wyrażeń regularnych do znalezienia tekstu do zastąpienia.

 46
Author: dugas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-14 16:37:54

To działa również dobrze, gdy jesteś w pożądanym katalogu.

Dir | Rename-Item –NewName { $_.name –replace "old","new" }
 16
Author: etoxin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-05 23:18:23

Istniejące odpowiedzi sugerują operator -replace, ale co jeśli plik nazywa się a.xml.xml? Oba podciągi .xml zostaną zastąpione, a wynikiem końcowym będzie a.tmp.tmp. Na szczęście istnieje na to metoda. NET:

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

(Manish Kumar był blisko GetFileNameWithoutExtension ale to jest bardziej eleganckie i prawdopodobnie nieco bardziej wydajne, nie że to zbyt ważne w tym przypadku)

 8
Author: Ohad Schneider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:42

Oto inny wariant, który zadziała.

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

$_.BaseName wykona nazwę "base" bez (ostatniego) rozszerzenia.

 2
Author: Trashman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-16 21:16:46
dir -Recurse | where-object -FilterScript {$_.Extension -eq ".xml"} | Rename-Item -NewName {[System.IO.Path]::GetFileNameWithoutExtension($_.fullname) + ".tmp"}

Use-WhatIf to evaluate the result first

 1
Author: Manish Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-23 01:10:46

Skróconą wersją używającą aliasu będzie:

ls *.xml | ren -new {$_.BaseName + ".tmp"}
 1
Author: spinalfrontier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-20 04:46:09

Jeszcze łatwiej-pamiętaj, że szukany łańcuch zastąp jest wyrażeniem regularnym,

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

" $ "reprezentuje koniec łańcucha znaków, więc znaki" xml " muszą być trzema ostatnimi znakami nazwy pliku.

 1
Author: John Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-18 15:16:46