Domine Strings no PowerShell: Concatenar, Dividir e Mais

Strings no PowerShell são provavelmente o tipo de dado mais utilizado no PowerShell. Desde exibir mensagens, solicitar entrada ou enviar dados para arquivos, é quase impossível escrever scripts sem que strings estejam envolvidas.

Neste artigo, você aprenderá que strings não servem apenas para leitura e exibição. Elas também podem ser manipuladas para se adequarem ao propósito de qualquer tarefa para a qual você esteja escrevendo o script. Como, por exemplo, substituir caracteres ou palavras inteiras, concatenar strings para formar uma nova string, ou até mesmo dividir uma string em várias.

Compreendendo as Strings

De acordo com a definição do .NET para string – “Uma string é uma coleção sequencial de caracteres usada para representar texto”. Em resumo, enquanto houver uma sequência de caracteres formando um texto, há uma string.

Definindo Strings do Sistema no PowerShell

Strings são definidas ao envolver uma série de caracteres entre aspas simples ou duplas. Abaixo estão exemplos de uma string.

PS> 'Hello PowerShell - Today is $(Get-Date)'PS> "Hello PowerShell - Today is $(Get-Date)"

Na verdade, as Strings são do tipo System.Strings no .NET.

Como você pode ver no exemplo acima, a primeira string é envolvida por aspas simples e a segunda por aspas duplas. Se você estiver se perguntando, a única diferença entre as duas é que strings em aspas duplas suportam expansão de string, enquanto as aspas simples representarão apenas strings literais.

Para confirmar o conceito de aspas simples vs. aspas duplas, ao colar ambas as strings do exemplo acima no PowerShell.

A captura de tela abaixo mostra que uma string entre aspas simples retorna exatamente a string literal que foi definida. Enquanto a string entre aspas duplas retorna a string com o resultado da expressão do cmdlet Get-Date.

Single Quote vs. Double-Quote String Output

O resultado mostrado acima demonstra a distinção de quando é apropriado usar aspas simples ou duplas ao definir strings.

O Objeto String

Como mencionado na seção anterior, a coleção de caracteres que forma um texto é uma string. O valor resultante da string é o objeto String. O objeto String é um objeto .NET do tipo [System.String].

E, como System.String é um objeto, ele possui propriedades que você pode acessar usando o cmdlet Get-Member. Abaixo, estamos inserindo uma variável dentro de uma string com aspas duplas.

PS> "Hello PowerShell - Today is $(Get-Date)" | Get-Member=

A captura de tela abaixo mostra o TypeName e a lista parcial de propriedades do objeto String.

String Object properties

Concatenando Strings no PowerShell

A concatenação de strings é descrita como a união de duas ou mais strings, essencialmente criando um objeto de string a partir de vários objetos de string separados. Existem vários métodos no PowerShell para concatenar strings. Cada método é diferente, e o método a ser usado depende de como você planeja implementar a concatenação de strings.

A typical example of using string concatenation in the real world is Active Directory user creation. Perhaps you’re creating a user creation script that takes the first name, last name, and department values from a list.

Usando a concatenação de strings, você pode formular a convenção de nomenclatura padrão para o nome, nome de exibição, nome de usuário e endereço de e-mail. Para este exemplo, você estará trabalhando com as strings mostradas abaixo. Copie este código abaixo e cole-o em sua sessão do PowerShell.

$domain = 'contoso.com'
$firstname = 'Jack'
$lastname = 'Ripper'
$department = 'Health'

Usando os valores de variáveis de exemplo acima, o objetivo é derivar os seguintes valores listados abaixo concatenando strings.

  • Nome = primeironome sobrenome
  • NomeExibicao = primeironome sobrenome (departamento)
  • NomeSamAccount = primeironome.sobrenome
  • EnderecoEmail = [email protected]

Nas próximas seções, os valores listados acima serão criados usando os diferentes métodos de concatenação de strings disponíveis no PowerShell.

Vamos começar!

Usando o Operador de Concatenação de Strings do PowerShell

As linguagens de programação têm seu próprio operador de concatenação de strings usado para concatenar strings. Por exemplo, no Visual Basic, o método de concatenação é o sinal de e comercial (&). O PowerShell também possui seu próprio método de concatenação, que é o sinal de mais (+).

Usando o operador de concatenação de strings, você pode concatenar strings usando o código abaixo.

## Nome
$firstname + ' ' + $lastname
## NomeExibicao
$firstname + ' ' + $lastname + ' (' + $department + ')'
## NomeSamAccount
$firstname + '.' + $lastname
## Endereço de E-mail
$firstname + '.' + $lastname + '@' + $domain

Usando a Expansão de Strings no PowerShell

O uso da expansão de strings pode ser o método que resulta no código mais curto ao concatenar strings. Você verá no código abaixo que tudo o que é necessário é organizar as strings na ordem em que devem aparecer e envolvê-las entre aspas duplas.

# Usando a Expansão de Strings
## Nome
"$firstname $lastname"
## Nome de exibição
"$firstname $lastname ($department)"
## SamAccountName
"$firstname.$lastname"
## Endereço de e-mail
"$firstname.$lastname@$domain"

Então, o PowerShell interpreta e manipula a expansão de strings dentro da string entre aspas duplas para gerar a string concatenada como resultado. Você pode consultar a saída de exemplo abaixo.

Using String Expansion

Usando o Operador de Formato no PowerShell

O operador de formato (-f) é principalmente usado para formatação composta. O que é importante lembrar com este método é que há três partes ao usar -f.

Consulte a terceira linha do código abaixo. O "{0} {1}" representa o formato e os espaços reservados. Os números entre chaves indicam o índice da string na coleção a ser exibida em seu lugar. As aspas podem ser simples ou duplas.

A coleção de strings de entrada neste exemplo é representada por $nome, $sobrenome. Isso significa que o índice da variável $nome é 0, enquanto o $sobrenome é 1.

Finalmente, `-f` é o local entre o espaço reservado e o conjunto de strings representado por (`-f`).

## Nome
"{0} {1}" -f $firstname,$lastname
## NomeExibicao
"{0} {1} ({2})" -f $firstname,$lastname,$department
## NomeSamAccount
"{0}.{1}" -f $firstname,$lastname
## EnderecoEmail
"{0}.{1}@{2}" -f $firstname,$lastname,$domain

O código acima resultará nos resultados mostrados abaixo.

Using the Format Operator

Usando o Operador -Join do PowerShell

O operador -Join pode ser usado para unir strings em uma única string de duas maneiras.

A primeira maneira de usar -Join é seguindo-o com o conjunto de strings que você deseja concatenar. O operador -Join não oferece uma opção para adicionar um delimitador. Todas as strings no conjunto serão unidas sem nada entre elas.

-Join <String[]>

A segunda maneira de usar o operador -Join é especificar o delimitador a ser usado. O conjunto de strings será unido, mas o caractere de delimitador especificado será inserido entre cada string.

<String[]> -Join <Delimiter>

Voltando ao objetivo de concatenar strings, o código abaixo demonstra como usar o operador -Join para juntar strings.

## Nome
$firstname, $lastname -join ' '
## NomeExibicao
$firstname,$lastname,"($department)" -join ' '
## NomeSamAccount
-join ($firstname,'.',$lastname)
## EnderecoEmail
-join ($firstname,'.',$lastname,'@',$domain)

Quando você executa o código de exemplo acima no PowerShell, espera ver uma saída semelhante à mostrada abaixo.

Using the PowerShell Join Operator

O Método String.Format() do .NET

O método String.Format do .NET é o equivalente no .NET do Operador de Formatação do PowerShell. Ele opera da mesma forma que o operador de formatação, onde o formato e os espaços reservados precisam ser especificados.

## Nome
[string]::Format("{0} {1}",$firstname,$lastname)
## Nome de Exibição
[string]::Format("{0} {1} ({2})",$firstname,$lastname,$department)
## SamAccountName
[string]::Format("{0}.{1}",$firstname,$lastname)
## Endereço de Email
[string]::Format("{0}.{1}@{2}",$firstname,$lastname,$domain)

A captura de tela abaixo mostra o Método String.Format em ação.

The .NET String.Format Method

O Método String.Concat() do .NET

Outro método para concatenar strings é usar o Método String.Concat do .NET. O Método String.Concat do .NET é o equivalente no .NET do Operador de Concatenação de Strings do PowerShell (+). Mas, em vez de usar o sinal + para unir strings, você pode adicionar todas as strings dentro do método assim – [string]::Concat(string1, string2...).

## Nome
[string]::Concat($firstname,' ',$lastname)
## Nome de Exibição
[string]::Concat($firstname,' ',$lastname,' (',$department,')')
## Nome da Conta Sam
[string]::Concat($firstname,'.',$lastname)
## Endereço de E-mail
[string]::Concat($firstname,'.',$lastname,'@',$domain)

A captura de tela abaixo demonstra o resultado da invocação do método .NET String.Concat. Você pode ver que o PowerShell mesclou string1, string2.

Using the .NET String.Concat Method

O Método .NET String.Join()

O método String.Join do .NET é o equivalente do método .NET do Operador de Junção do PowerShell (-join). O formato para este método é [string]::Join(<delimitador>,<string1>,<string2>,...).

O primeiro item dentro do método -Join é sempre o delimitador. Em seguida, os valores dos itens subsequentes são as strings que você deseja concatenar. Veja o código de exemplo abaixo. Lembre-se, o primeiro item é sempre o delimitador. Se você não quiser adicionar um delimitador, então você pode especificar isso —> ''.

## Nome
[string]::Join(' ',$firstname,$lastname)
## Nome de Exibição
[string]::Join(' ',$firstname,$lastname,"($department)")
## Nome da Conta Sam
[string]::Join('',$firstname,'.',$lastname)
## Endereço de E-mail
[string]::Join('',$firstname,'.',$lastname,'@',$domain)
The .NET String.Join Method

Dividindo Strings do PowerShell

Você viu vários métodos diferentes para concatenar strings na seção anterior. Nesta seção, você aprenderá sobre as diferentes maneiras de usar o PowerShell para dividir strings. Dividir strings é a ação reversa da concatenação.

Você pode dividir strings no PowerShell de duas maneiras diferentes – a função/método split() ou o operador split.

Dividindo Strings com o Método Split()

Se você está procurando uma maneira simples de dividir uma string e criar um array, não precisa procurar mais além do método split(). O método split() está presente em todos os objetos de string e é capaz de dividir uma string em um array com base em um caractere não-regex.

Por exemplo, se você tiver uma string como green|eggs|and|ham e quiser criar um array como @('green','eggs','and','ham'), você pode dividir essa string no símbolo de pipe (|) como no trecho de código a seguir.

$string = 'green|eggs|and|ham'
$string.split('|')

Em seguida, você verá que o PowerShell dividiu a string no array desejado com o símbolo de pipe.

O método split() é uma maneira simples de dividir strings, mas é limitado. O método split() não permite dividir strings usando expressões regulares. Se você precisa de recursos mais avançados para dividir uma string, precisará aprender sobre o operador split.

O Operador -Split

O principal operador que pode ser usado para dividir strings no PowerShell é o operador -Split. Usando o operador -Split, as strings são divididas entre espaços em branco por padrão, ou com caracteres delimitadores específicos.

Abaixo está a sintaxe do operador -Split para sua referência. Lembre-se de observar a diferença entre o split unário e binário.

# Divisão Unária
-Split <String>
-Split (<String[]>)

# Divisão Binária
<String> -Split <Delimiter>[,<Max-substrings>[,"<Options>"]]
<String> -Split {<ScriptBlock>} [,<Max-substrings>]

Neste exemplo, a variável $string contém o valor de uma única linha de string. Em seguida, com o operador -Split, a string de uma única linha será dividida em um array de strings do PowerShell. A string dividida resultante é salva na variável $split.

## Dividindo Strings em Substrings
# Atribuir um valor de string à variável $string
$string = 'This sentence will be split between whitespaces'
# Dividir o valor de $string e armazenar o resultado na variável $split
$split = -split $string
# Obter a contagem das substrings resultantes
$split.Count
# Mostrar as substrings resultantes
$split

Como você pode ver pelo resultado acima, o que era originalmente uma única string foi dividido em 7 substrings. Isso demonstra como o PowerShell divide uma string em um array.

O Delimitador de Caracteres

No exemplo anterior, o operador -Split dividiu o objeto de string única em várias substrings mesmo sem especificar um delimitador; isso ocorre porque o delimitador padrão do operador -Split é o espaço em branco. No entanto, os delimitadores também podem ser caracteres, strings, padrões ou blocos de script.

Neste exemplo, o delimitador usado é o ponto e vírgula ;.

## Dividindo Strings em Substrings com Delimitador
# Atribua um valor de string à variável $string
$string = 'This;sentence;will;be;split;between;semicolons'
# Divida o valor da $string e armazene o resultado na variável $split
$split = $string -split ";"
# Obtenha a contagem das substrings resultantes
$split.Count
# Mostre as substrings resultantes
$split

Quando você testa o código acima no PowerShell, você obterá o resultado abaixo.

Splitting a String into Substrings with Character Delimiter

Você percebe pelo output acima que o caractere delimitador foi omitido completamente das substrings resultantes.

Se, por algum motivo, você precisar reter o caractere delimitador, o delimitador pode ser retido ao envolver o caractere entre parênteses.

$split = $string -split "(;)"
$split.Count
$split

Após modificar o delimitador de divisão, como mostrado acima, ao executá-lo resultará no output mostrado abaixo.

Splitting a string on semicolon

O resultado acima mostra que os caracteres delimitadores não são omitidos, e são contabilizados nas substrings resultantes.

O Delimitador de String

Strings também podem ser divididas por outra string como delimitador. Neste exemplo, a string “day” é usada como delimitador.

$daysOfTheWeek= 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek -split "day"

O Delimitador do Bloco de Script

A scriptBlock as the delimiter enables the -Split operator to perform custom or complex splitting of strings.

Nos exemplos anteriores, o caractere ou string delimitador é usado para dividir as strings. Com o uso de um bloco de script, você pode criar uma expressão que efetivamente usa mais de um delimitador.

O exemplo abaixo usa a expressão {$PSItem -eq 'e' -or $PSItem -eq 'a'}, o que significa que a string será dividida se o caractere de entrada for 'e' ou 'a'.

$daysOfTheWeek= 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek -split {$PSItem -eq 'e' -or $PSItem -eq 'y'}

E quando você executa esse comando acima, a saída será substrings que são divididas com os caracteres delimitadores especificados na expressão no bloco de script.

Splitting a String into Substrings with a Script Block Delimiter

Este próximo exemplo faz um pouco mais com um bloco de script. Desta vez, a expressão avalia se:

  • O caractere de entrada passa como um inteiro; e
  • Que seu valor é maior que 1

Se o resultado da avaliação for verdadeiro, então o operador -Split usará esse caractere como delimitador. Além disso, o tratamento de erros é adicionado para garantir que os erros sejam filtrados.

$daysOfTheWeek= 'monday1tuesday2wednesday3thursday1friday4saturday8sunday'
$daysOfTheWeek -split {
    try {
        [int]$PSItem -gt 1
    }
    catch {
        # NÃO FAZER NADA
    }
}

Depois de executar o código mostrado acima, a expectativa é que a string seja dividida no lugar onde o valor do caractere pode ser convertido em um inteiro com um valor maior que 1. O abaixo mostra a saída esperada.

Splitting a String into Substrings with a Script Block Delimiter

O Delimitador RegEx

Por padrão, o operador -Split usa a correspondência de RegEx para o delimitador especificado. Isso significa que você também pode usar RegEx como delimitadores para dividir strings.

Neste próximo exemplo, a string contém caracteres de palavra e caracteres não-palavra. O objetivo é dividir a string com qualquer caractere não-palavra. Em RegEx, caracteres não-palavra são representados por \W, enquanto caracteres de palavra que correspondem a estes caracteres – [a-zA-Z0-9_] são representados por \w.

$daysOfTheWeek= 'monday=tuesday*wednesday^thursday#friday!saturday(sunday'
$daysOfTheWeek -split "\W"

Limitando Substrings

Também é possível impedir o operador -Split de dividir uma string em um número de substrings. A opção que pode ser usada para alcançar a limitação do resultado da substring é o parâmetro <Max-substrings>.

Quando você se refere de volta à sintaxe -Split, o parâmetro <Max-substrings> é o parâmetro que segue diretamente o parâmetro <Delimitado>. A sintaxe é mostrada novamente abaixo para referência.

<String> -Split <Delimiter>[,<Max-substrings>[,"<Options>"]]

Seguindo a sintaxe acima, o código de exemplo abaixo é modificado para limitar o número de divisões/substrings para 3.

$daysOfTheWeek= 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek -split ",",3

E, executando o código acima resulta neste output abaixo. Como você pode ver do output abaixo, a string foi dividida em apenas três substrings. Os delimitadores restantes foram ignorados.

Limiting the Number of Substrings starting from the first 3 matched delimiters

Agora, se você quiser limitar as substrings, mas de forma reversa, você poderia mudar o valor do parâmetro <Max-substrings> para um valor negativo. Neste próximo exemplo, o <Max-substrings> é alterado para -3.

$daysOfTheWeek= 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek -split ",",-3

E como resultado do código modificado acima, a string foi dividida começando pelos últimos três delimitadores correspondentes.

Limiting the Number of Substrings starting from the last 3 matched delimiters

Localizar e Substituir Strings

Nesta seção, você aprenderá sobre os dois métodos que podem ser usados para buscar e realizar uma substituição de string no PowerShell. O método Replace() e o operador -Replace.

O Método Replace()

O objeto de string também possui um método integrado que pode ajudar a realizar operações de busca e substituição – o método replace(). O método replace() aceita um máximo de quatro sobrecargas.

O conjunto aceitável de sobrecargas para o método replace() é listado abaixo.

<String>.Replace(<original>, <substitute>[, <ignoreCase>][, <culture>])

As únicas sobrecargas necessárias são <original> e <substituto>. <ignoreCase> e <culture> são opcionais.

No exemplo abaixo, o código buscará todas as instâncias do caractere vírgula (,) e as substituirá por ponto e vírgula (;).

$daysOfTheWeek = 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek.Replace(',',';')

Além de substituir apenas um caractere, você também pode usar o método replace() para buscar e substituir strings. O código de exemplo abaixo substitui a palavra “day” por “night”.

$daysOfTheWeek = 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek.Replace('day','NIGHT')
Replacing a matched string using the replace() method

O Operador -Replace

A sintaxe para o operador de substituição é mostrada abaixo.

<string> -replace <original>, <substitute>

Usando a sintaxe acima, o código de exemplo abaixo substitui a palavra “day” por “Night” com o operador -replace.

$daysOfTheWeek = 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek -replace 'day','NIGHT'
Replacing a matched character with the -replace operator

Este próximo exemplo utiliza uma correspondência RegEx para substituir strings com o operador -replace. O código abaixo procura na here-string pela string que corresponde a (#.) e substitui ela por nada.

$daysOfTheWeek = @'
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
'@
$daysOfTheWeek -replace "\d.\s",""
Replacing a RegEx match using -replace

Extraindo Strings de Strings

O objeto de string tem um método chamado SubString(). O método SubString() é usado para extrair strings dentro de strings em locais específicos. A sintaxe para o método SubString() é mostrada abaixo.

<String>.SubString(<startIndex>[,<length>])

O startIndex é o índice de posição onde o método SubString() iniciará a busca. O parâmetro length indica o número de caracteres a serem retornados a partir do startIndex. O parâmetro length é opcional e, se não for usado, o método SubString() retornará todos os caracteres.

Extraindo uma Substring de uma Posição Inicial e um Comprimento Fixo

O código de exemplo abaixo recupera a parte do valor da string $guid começando pelo índice 9 e retorna exatamente os 5 caracteres que seguem.

$guid = 'e957d74d-fa16-44bc-9d72-4bea54952d8a'
$guid.SubString(9,5)

Extraindo uma Substring de uma Posição Inicial Dinâmica

Este próximo exemplo demonstra como você pode usar a propriedade de comprimento da string do PowerShell para definir dinamicamente um índice inicial.

O código abaixo faz o seguinte:

  • Obtém o comprimento do objeto de string.
  • Obtém o índice do índice médio dividindo o comprimento por 2.
  • Usa o índice do meio como o índice inicial da substring.
$guid = 'e957d74d-fa16-44bc-9d72-4bea54952d8a'
$guid.SubString([int]($guid.Length/2))

Já que o valor do length não foi especificado, o método Substring() retornou todos os caracteres a partir do índice inicial.

Extracting a Substring from a Dynamic Starting Position

Comparando Strings no PowerShell

Você pode usar o PowerShell para comparar strings também usando os métodos internos do objeto string, como os métodos CompareTo(), Equals() e Contains(). Ou, usando os operadores de comparação do PowerShell .

Usando o Método CompareTo()

O método CompareTo() retorna um valor de 0 se as duas strings tiverem o mesmo valor. Por exemplo, o código abaixo compara dois objetos de string.

$string1 = "This is a string"
$string2 = "This is a string"
$string1.CompareTo($string2)

E como os valores são os mesmos, o resultado deve ser 0, como mostrado abaixo.

Using CompareTo() method to compare strings

Usando o Método Equals() e -eq

O método Equals() e o operador -eq podem ser usados para verificar se o valor das duas strings é igual.

O exemplo abaixo usa o método Equals() para comparar os valores de $string1 e $string2.

$string1 = "This is a string"
$string2 = "This is not the same string"
$string1.Equals($string2)

O código acima deve retornar Falso porque os valores de $string1 e $string2 não são iguais um ao outro.

Comparing strings with the Equals() method

O próximo exemplo de código abaixo usa -eq em vez disso para comparar os valores de $string1 e $string2.

$string1 = "This is a string"
$string2 = "This is not the same string"
$string1 -eq $string2

Conforme você pode ver a partir da saída abaixo, o resultado ao usar -eq e o método Equal() são iguais.

Comparing strings with the -eq operator

Usando o Método Contains()

Neste exemplo, as duas strings estão sendo comparadas verificando se a string do PowerShell contém a substring de outra string.

O código abaixo mostra que os valores de $string1 e $string2 não são iguais. No entanto, o valor de $string2 é uma substring de $string1.

$string1 = "This is a string 1"
$string2 = "This is a string"
$string1.Contains($string2)

O resultado do código acima deve ser True, como mostrado abaixo.

Comparing strings using the Contains() method

Leitura Adicional

Source:
https://adamtheautomator.com/powershell-strings/