2012-11-14 12 views

risposta

43

Derivato da esempio 4 nella documentazione aiuto di Rename_Item recuperate con il comando:

get-help Rename-Item -examples 

Esempio:

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

nota la spiegazione nella documentazione di aiuto per il backslash fuga nel comando sostituire a causa di esso utilizzando le espressioni regolari per trovare il testo da sostituire.

+0

Grazie, devo aver perso questo. –

+2

se si specifica l'argomento -WhatIf su Rename-Item mostra l'output dell'operazione senza effettivamente rinominare nulla, che è molto utile –

+0

Questo in realtà è un cattivo esempio nel documento IMO. Questo codice non è equivalente a 'ren * .xml * .tmp' (suggerimento:' a.xml.xml'). Vuoi 'System.IO.Path.ChangeExtension': http://stackoverflow.com/a/36241702/67824. –

15

Questo funziona anche quando ci si trova nella directory desiderata.

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

uso -WhatIf per valutare il risultato prima

+0

Upvote a causa del flag '-WhatIf'. – Lucubrator

8

Le risposte attuali suggeriscono l'operatore -replace, ma cosa succede se il file si chiama a.xml.xml? Entrambe le sottostringhe .xml verranno sostituite e il risultato finale sarà a.tmp.tmp. Per fortuna, c'è un metodo .NET per questo:

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

(Manish Kumar era vicino con GetFileNameWithoutExtension ma questo è più elegante e probabilmente un po 'più efficiente, non che eccessivamente le questioni in questo caso)

2

ecco un altro variante che funzionerà.

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

$_.BaseName farà il nome di "base" senza la (ultima) estensione.

0

una versione abbreviata utilizzando l'alias sarebbe:

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

Ancora più facile - ricordate che la stringa di ricerca sostituzione è un'espressione regolare,

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

Il "$" rappresenta end-of stringa, quindi i caratteri "xml" devono essere gli ultimi tre caratteri del nome file.

Problemi correlati