Selecione os caracteres seguintes depois de um caractere identificador em Powershell


3

Eu tenho uma pasta muito grande de arquivos, dos quais eu organizo com um script meu que refina os arquivos apenas para o que eu preciso. Esses itens são nomeados de forma semelhante aos exemplos a seguir:

  • Foo (Bar).txt
  • My File (This is) (My File).doc
  • Example (File) (Stuff) (Things).xml

Eu preciso puxar todos os caracteres do nome do arquivo depois de (mas incluindo) o primeiro parêntese aberto "(" sem incluir a extensão do arquivo. Minha saída desejada para este exemplo seria:

  • (Bar)
  • (This is) (My File)
  • (File) (Stuff) (Things)

Eu estava brincando com a seguinte linha sem sucesso, e não tenho certeza se isso seria a melhor maneira de lidar com esse problema:

Get-ChildItem "*" | ForEach-Object { $_.SubString( $_.IndexOf('\(')+1 ) }

Respostas:


2

Eu acho que você está perto. Em primeiro lugar, limpe o nome do caminho e a extensão usando o BaseName propriedade de FileInfo. Então apenas pegue a substring começando no índice retornado por IndexOf:

Get-ChildItem * | ForEach-Object { $_.BaseName.SubString( $_.BaseName.IndexOf('(') ) }

embora você possa querer adicionar algum tratamento de erro nos casos em que não existe (. Talvez algo como isto:

Get-ChildItem * | ForEach-Object { $start = $_.BaseName.IndexOf('('); if($start -ge 0){$_.BaseName.SubString( $_.BaseName.IndexOf('(') )} }

Bem, o upvote é porque isso é muito útil para mim; espero que o OP ache o mesmo!
Debra

Muito útil! A primeira linha funciona muito bem, embora eu não saiba por que você incluiu o "P" na sua segunda linha. Se você removê-lo, funciona muito bem. Eu também adicionei "Select-uniq" ao final da linha para remover entradas duplicadas. O que eu terminei é o seguinte, obrigado pela sua ajuda: Get-ChildItem * | ForEach-Object { $start = $_.BaseName.IndexOf(''); if($start -ge 0){$_.BaseName.SubString( $_.BaseName.IndexOf('(') )} else{$ErrorAction} } | Select -uniq
root
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.