PowerShell rinomina più file, parte specifica del nome del file


5

Sto tentando di rinominare più file con nomi di file che terminano allo stesso modo. Questi file sono attualmente: "Foo Bar (U) (V7.9) (USA) .txt" "Pochi Ber Doo Ber (U) (V7.9) (USA) .txt" ect

Sto cercando di rimuovere la sezione "(U) (V7.9) (USA)" del nome e sostituire questa sezione con (USA). Questi file sarebbero quindi denominati: "Foo Bar (USA) .txt" "Pochi Ber Doo Ber (USA) .txt"

Non riesco a farlo funzionare, ma ecco cosa ho cercato inutilmente:

get-childItem '* (U) (V7.9) (USA).txt' | rename-item -newname { $_.name -replace '(U) (V7.9) (USA)','(USA)' }

Risposte:


7

Molti dei personaggi che stai cercando di sostituire sono caratteri speciali nella regex. Hanno significati speciali e riservati che ti permettono di creare espressioni complicate quando non sono "scappati". Per sfuggire a loro, è sufficiente includere una barra rovesciata davanti al carattere speciale. Esempio:

PS C:\> $string = "(U) (V7.9) (USA)"

#Failure
PS C:\> $string -replace "(U) (V7.9) (USA)", "(USA)"
(U) (V7.9) (USA)

#Success
PS C:\> $string -replace "\(U\) \(V7\.9\) \(USA\)", "(USA)"
(USA)

Ecco un Riferimento di Powershell Regex in caso di problemi simili. Si può notare che viene utilizzato il carattere backtick `invece del backslash - l'apice è il carattere di escape in powershell, ma ciò non è vero per tutte le manipolazioni di espressioni regolari in .NET (su cui è basato Powershell). Per questo motivo, è possibile vedere entrambi utilizzati negli esempi di espressioni regolari per PowerShell su Internet.


1
Grazie per il vostro aiuto e mi dispiace per il post in ritardo. Ho avuto qualche difficoltà con "$ string -replace" per qualche ragione, ma ecco quello che ho usato che funziona perfettamente per me: get-childItem '*(U) (V7.9) (USA)*' | rename-item -newname { $_.name -replace '\(U\) \(V7.9\) \(USA\)','(USA)' }
root

2

Se vuoi solo rimuovere la parte "(U) (V7.9)", puoi anche usare:

-replace("\(U\) \(V7.9\) ","")

Ma devi usare anche l'escapecharacter per le parate. E non dimenticare il seguente carattere spaziale, perché non vogliamo ottenere un doppio spazio.

C'è anche un'opzione per usare il substring(start,length) Metodo. Ma lì devi calcolare l'inizio della parte "(U) (V7.9)".

$string = "Randomname (U) (V7.9) (USA).txt"
$string.substring(0, $string.length - 20) + $string.substring($string.length - 9)

quali uscite Randomname (USA).txt.

Il 20 è il numero di caratteri (che iniziano sul retro) al primo carattere della stringa da rimuovere (in questo caso: ( di (U) ). Il 9 è il numero di caratteri (che iniziano sul retro) al primo carattere dopo la stringa da rimuovere (in questo caso: ( di (USA)perché non vogliamo ottenere un doppio spazio).

Questo metodo è indipendente dalla lunghezza del Randomname ma funziona solo con la posizione nota e la lunghezza della stringa da rimuovere. Comunque -replace -Method è più facile da usare, se conosci l'escapecharcarter. Volevo solo menzionare un altro modo per ottenere l'output desiderato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.