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