2012-11-14 10 views

Odpowiedz

43

otrzymanych w Przykładzie 4, w dokumentacji pomocy w Rename_Item pobierane z polecenia:

get-help Rename-Item -examples 

przykład:

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

Uwaga wyjaśnienie w dokumentacji pomocy w odwrotnym ukośnikiem w poleceniu zastąpić dzięki temu za pomocą wyrażeń regularnych znaleźć tekst do zastąpienia.

+0

Dzięki, musiałem tego nie zauważyć. –

+2

jeśli podasz argument -WiszyKiedy do Zmieńnazwę-Pozycję, pokazuje on wynik operacji bez zmiany nazwy czegokolwiek, co jest bardzo przydatne –

+0

To jest rzeczywiście zły przykład w dokumencie IMO. Ten kod nie jest równoważny z 'ren * .xml * .tmp' (wskazówka:' a.xml.xml'). Chcesz 'System.IO.Path.ChangeExtension': http://stackoverflow.com/a/36241702/67824. –

15

Działa to również, gdy znajdujesz się w pożądanym katalogu.

Dir | Rename-Item –NewName { $_.name –replace "old","new" } 
1
dir -Recurse | where-object -FilterScript {$_.Extension -eq ".xml"} | Rename-Item -NewName {[System.IO.Path]::GetFileNameWithoutExtension($_.fullname) + ".tmp"} 

użycie -whatIf ocenić pierwszy wynik

+0

Rozgrywka z powodu flagi '-WhatIf'. – Lucubrator

8

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

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

(Manish Kumar był blisko z GetFileNameWithoutExtension ale to jest bardziej elegancki i prawdopodobnie nieco bardziej efektywny, nie to, że nadmiernie sprawy w tym przypadku)

2

Oto kolejny wariant, który zadziała.

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

$_.BaseName zrobi nazwę "podstawową" bez (ostatniego) rozszerzenia.

0

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

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

Jeszcze prościej - pamiętaj, że zastąpi ciąg wyszukiwania jest wyrażenie regularne,

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

z „$” oznacza koniec z eksploatacji ciąg znaków, więc znaki "xml" muszą być ostatnimi trzema znakami nazwy pliku.

Powiązane problemy