PowerShell renomeando vários arquivos, parte específica do nome do arquivo

5

Estou tentando renomear vários arquivos que possuem nomes de arquivos que terminam da mesma maneira. Esses arquivos estão atualmente: "Foo Bar (U) (V7.9) (EUA) .txt" "Poucas Ber Doo Ber (U) (V7.9) (EUA) .txt" ect

Estou tentando remover a seção "(U) (V7.9) (USA)" do nome e substituir esta seção por (EUA). Esses arquivos seriam então nomeados: "Foo Bar (EUA) .txt" "Poucas Ber Doo Ber (EUA) .txt"

Eu não consigo fazer funcionar, mas aqui está o que eu tenho tentado em vão:

get-childItem '* (U) (V7.9) (USA).txt' | rename-item -newname { $_.name -replace '(U) (V7.9) (USA)','(USA)' }
    
por root 15.09.2013 / 22:12

2 respostas

7

Vários dos caracteres que você está tentando substituir são caracteres especiais em regex. Eles têm significados especiais e reservados que permitem criar expressões complicadas quando eles não são "escapados". Para escapar deles, basta incluir uma barra invertida na frente do caractere especial. Exemplo:

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)

Aqui está uma Referência Regex do Powershell caso você tenha problemas semelhantes. Você pode notar que o caractere backtick 'é usado em vez da barra invertida - o backtick é o caractere de escape no powershell, mas isso não é verdade para todo o manuseio de regex no .NET (no qual o Powershell é construído). Por causa disso, você pode ver ambos usados em exemplos de regex para o powershell na internet.

    
por 15.09.2013 / 22:31
2

Se você quiser apenas remover a parte "(U) (V7.9)", também poderá usar:

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

Mas você também tem que usar o escapecharacter para os parantheses. E não esqueça o seguinte espaço espacial, porque não queremos obter um espaço duplo.

Há também uma opção para usar o método substring(start,length) . Mas aí você tem que calcular o começo do "(U) (V7.9)" Part.

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

que gera Randomname (USA).txt .

O 20 é o número de caracteres (começando por trás) para o primeiro caractere da string a ser removida (neste caso: ( of (U) ). O 9 é o número de caracteres (começando no verso) para o primeiro caractere após a string a ser removida (neste caso: ( de (USA) , porque não queremos obter um espaço duplo).

Esse método é independente do Comprimento do Randomname , mas só funciona com a posição e o comprimento conhecidos da string a ser removida. De qualquer forma, o -replace -Method é mais fácil de usar, se você conhece o escapechararcter. Eu só queria mencionar uma outra maneira de obter o resultado desejado.

    
por 18.09.2013 / 15:09

Tags