Precisa procurar por uma sequência dentro de outra sequência? Não se preocupe, o substring do PowerShell está aqui! Neste artigo, eu te guio em como abandonar objetos e buscar dentro de sequências.
O substring do PowerShell
I love being on social media because I always come across something interesting related to PowerShell. Sometimes it is a trick I didn’t know about or a question someone is trying to figure out. I especially like the questions because it helps me improve my understanding of how people learn and use PowerShell. Workload permitting, I’m happy to jump in and help out.
Recentemente, um desafio se concentrou na análise de sequências. Embora você me ouça falar bastante sobre objetos no pipeline, não há nada de errado em analisar sequências se for isso que você precisa. Existem muitos arquivos de log por aí que precisam de análise, e o PowerShell pode ajudar.
Procurar por uma sequência em outra sequência
Neste caso, estou assumindo que algum tipo de arquivo de log está em jogo. Não sei como é o log completo nem qual é o objetivo geral. Tudo bem. Podemos aprender muito com a tarefa imediata. Digamos que você tenha uma sequência que se parece com isso:
Mailbox:9WJKDFH-FS349-1DSDS-OIFODJFDO-7F21-FC1BF02EFE26 (O'Hicks, Jeffery(X.))
I’ve changed the values a little bit and modified my name to make it more challenging. The goal is to grab the name from the string. I want to end up with:
O'Hicks, Jeffery(X.)
Há várias maneiras diferentes de realizar isso. A maneira certa provavelmente depende do seu nível de experiência com o PowerShell e do que mais você pode querer realizar. Vou começar atribuindo essa sequência à variável $s.
Usando o operador de separação do PowerShell
Quando me deparo com a análise de strings, às vezes ajuda dividir a string em componentes mais gerenciáveis. Para fazer isso, posso usar o operador split. Também há um método split para a classe string. Vou assumir que você vai dedicar um tempo depois para ler mais sobre PowerShell split.
$s -split "\s",2
O “\s” é um padrão de expressão regular que significa um espaço. O valor do parâmetro 2 indica que quero apenas duas substrings. Em outras palavras, dividir no primeiro espaço encontrado.

I end up with an array of two elements. All I need is the second one.
$t = ($s -split "\s",2)[1]
Usando o método substring
Agora, para a diversão da análise, vamos usar o método SubString() do objeto string.
$t.Substring(1,$t.length-2)
I am telling PowerShell to get part of the string in $t, starting at character position 1 and then getting the next X number of characters. In this case, X is equal to the length of the string, $t, minus 2. This has the net effect of stripping off the outer parentheses.

Aqui está uma variação, onde faço a divisão no caractere “(”.
($s -split "\(",2) $t = ($s -split "\(",2)[1] $t.Substring(0,$t.length-1)

A diferença é que isso elimina o parêntese inicial. Então, tudo que preciso fazer é pegar tudo até o último caractere. A propósito, se você olhar um objeto string com Get-Member, verá alguns métodos Trim. Estes são para remover espaços em branco iniciais e/ou finais. Esses métodos não se aplicam aqui.
Dividir uma string usando números de índice de array
Existe mais uma maneira de dividir uma string que você pode achar útil. Você pode tratar todas as strings como um array de caracteres. Isso significa que você pode usar números de índice de array para referenciar elementos específicos.
Contar elementos em um array começa em 0. Se você executar $t[0], obterá o primeiro elemento do array, neste caso ‘O’. Você também pode usar o operador de intervalo.
$t[0..5]

Neste momento, $t tem um ) extra no final que eu não quero. Preciso pegar tudo até o segundo elemento do final.
$t[0..($t.length-2)]
Isso me dará um array exibido verticalmente, como você pode ver na captura de tela acima. Dito isso, é fácil juntar a string cortada novamente.
-join $t[0..($t.length-2)]
Pode parecer um pouco estranho começar com um operador, mas se você ler sobre _join, então verá que esta é uma abordagem válida que funciona.

Função simples para análise de strings
I’m assuming you want an easy way to do this type of parsing, so I wrote a simple function.
Function Optimize-String { [cmdletbinding()] Param( [Parameter(Position=0,Mandatory,HelpMessage="Enter a string of text")] [ValidateNotNullorEmpty()] [string]$Text, [int]$Start=0, [int]$End=0 ) #trim off spaces $string = $Text.Trim() #get length value when starting at 0 $l = $string.Length-1 #get array elements and join them back into a string -join $string[$Start..($l-$end)] } #end function
A função recebe uma string de texto e retorna a substring menos X número de caracteres do início e X número de caracteres do final. Agora tenho um comando fácil para analisar strings.

Se você olhar através do código, então verá que estou usando o método Trim(). Estou usando porque não quero que espaços extras no início ou no final da string sejam incluídos.
Voltando à minha variável de string original, agora posso analisá-la com um comando de uma linha:
optimize-string ($s -split("\s",2))[1] -Start 1 -end 1

Se fizer mais sentido para você dividir isso em etapas separadas, tudo bem.
$arr = $s -split("\s",2) $text = $arr[1] optimize-string $text -Start 1 -end 1
Da próxima vez, veremos a análise de strings usando expressões regulares, e não será assustador, eu prometo.