Domine Strings no PowerShell: Concatenar, Dividir e Mais

Strings em 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 o envolvimento de strings.

Neste artigo, você aprenderá que strings não são apenas para leitura e exibição. Elas também podem ser manipuladas para se adequarem ao propósito da tarefa para a qual você pode estar escrevendo o script. 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 da .NET de 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

As 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)"

As strings são, na verdade, System.Strings na .NET.

Como você pode ver no exemplo acima, a primeira string está entre aspas simples e a segunda string está entre aspas duplas. Se você estiver se perguntando, a única diferença entre as duas é que as strings entre 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 de String

Conforme declarado 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 qual usar 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.

Utilizando a concatenação de strings, você pode formular a convenção padrão de nomes 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 o código abaixo e cole em sua sessão do PowerShell.

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

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

  • Nome = primeiro nome sobrenome
  • Nome de Exibição = primeiro nome sobrenome (departamento)
  • SamAccountName = primeiro.nome
  • Endereço de E-mail = [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 seus próprios operadores de concatenação de strings usados 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 adição (+).

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

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

Usando a Expansão de Strings do 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 conforme devem aparecer e colocá-las entre aspas duplas.

# Usando a Expansão de Strings
## Nome
"$firstname $lastname"
## Nome de Exibição
"$firstname $lastname ($department)"
## Nome de Conta Sam
"$firstname.$lastname"
## Endereço de Email
"$firstname.$lastname@$domain"

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

Using String Expansion

Usando o Operador de Formatação do PowerShell

O operador de formatação (-f) é principalmente usado para formatação composta. O que é importante lembrar é que, com este método, 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 como entrada neste exemplo é representada por $primeironome,$ultimonome. Isso significa que o índice da variável $primeironome é 0, enquanto o do $ultimonome é 1.

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

## Nome
"{0} {1}" -f $firstname,$lastname
## NomeExibição
"{0} {1} ({2})" -f $firstname,$lastname,$department
## SamAccountName
"{0}.{1}" -f $firstname,$lastname
## Endereço de Email
"{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 array de strings que você deseja concatenar. O operador -Join não fornece uma opção para adicionar um delimitador. Todas as strings no array serão coladas juntas sem nada no meio.

-Join <String[]>

A segunda maneira de usar o operador -Join é especificar o delimitador a ser usado. O array de strings será unido, mas o caractere 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 ' '
## NomeExibição
$firstname,$lastname,"($department)" -join ' '
## SamAccountName
-join ($firstname,'.',$lastname)
## Endereço de Email
-join ($firstname,'.',$lastname,'@',$domain)

Quando você executa o código de exemplo acima no PowerShell, você esperaria 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 do .NET do Operador de Formatação do PowerShell. Funciona da mesma forma que o operador de formatação, onde é necessário especificar o formato e os espaços reservados.

## 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 E-mail
[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 do .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 de 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 fundiu string1, string2.

Using the .NET String.Concat Method

O Método .NET String.Join()

O método .NET String.Join é 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 exemplo de código abaixo. Lembre-se, o primeiro item é sempre o delimitador. Se você não deseja adicionar um delimitador, então você pode especificar isso —> ''.

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

Dividindo Strings no 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 inversa 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ê procura uma maneira simples de dividir uma string e criar um array, não procure mais do que o 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 de non-regex.

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

$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, você 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 a divisão unária e binária.

# 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 string de uma única linha. 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
# Atribua um valor de string à variável $string
$string = 'This sentence will be split between whitespaces'
# Divida o valor de $string e armazene o resultado na variável $split
$split = -split $string
# Obtenha a contagem das substrings resultantes
$split.Count
# Mostre as substrings resultantes
$split

Como pode ser visto a partir do 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 de $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

Ao testar o código acima no PowerShell, você obterá o seguinte resultado abaixo.

Splitting a String into Substrings with Character Delimiter

Você percebe a partir da saída 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 incluir o caractere entre parênteses.

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

Após modificar o delimitador de divisão, como mostrado acima, executá-lo resultaria na saída mostrada abaixo.

Splitting a string on semicolon

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

O Delimitador de String

As strings também podem ser divididas por outra string como delimitador. Neste exemplo, a string “dia” é usada como delimitador.

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

O Delimitador de 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 utiliza efetivamente mais de um delimitador.

O exemplo abaixo usa a expressão {$PSItem -eq 'e' -or $PSItem -eq 'y'}, 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ê executar este 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 seja maior que 1

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

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

Após executar o código mostrado acima, a expectativa é que a string seja dividida no local onde o valor do caractere pode ser convertido como um inteiro com um valor maior que 1. 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 correspondência RegEx com 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 palavras e caracteres não alfanuméricos. O objetivo é dividir a string com qualquer caractere não alfanumérico. Em RegEx, os caracteres não alfanuméricos são representados por \W, enquanto os caracteres de palavra que correspondem a esses 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 que o operador -Split divida uma string em várias substrings. A opção que pode ser usada para limitar o resultado da substring é o parâmetro <Max-substrings>.

Quando você se refere à sintaxe do -Split, o parâmetro <Max-substrings> é o parâmetro que segue diretamente o parâmetro <Delimited>. 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, ao executar o código acima, o resultado é este abaixo. Como você pode ver no resultado 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ê pode alterar 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 a partir dos últimos três delimitadores correspondentes.

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

Encontrar e Substituir Strings

Nesta seção, você aprenderá sobre os dois métodos que podem ser usados para procurar 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 incorporado que pode ajudar a realizar operações de pesquisa e substituição – o método replace(). O método replace() aceita no máximo quatro sobrecargas.

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

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

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

No exemplo abaixo, o código procurará 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 de RegEx para substituir cadeias de caracteres com o operador -replace. O código abaixo procura na cadeia de caracteres de formato livre (here-string) a cadeia que corresponde a (#.) e substitui-as 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 Cadeias de Cadeias

O objeto de cadeia de caracteres tem um método chamado SubString(). O método SubString() é utilizado para extrair cadeias de caracteres dentro de cadeias de caracteres 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() iniciaria a pesquisa. 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 utilizado, o método SubString() retornará todos os caracteres.

Extraindo uma Subcadeia de uma Posição de Início e um Comprimento Fixo

O código de exemplo abaixo recupera a parte do valor de cadeia de caracteres $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 Subcadeia de uma Posição de Início Dinâmica

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

O código abaixo faz o seguinte:

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

Como 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

Também é possível usar o PowerShell para comparar strings, utilizando os métodos integrados do objeto string como CompareTo(), Equals() e Contains(). Ou utilizando os operadores de comparação do PowerShell (operadores de comparação).

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 string.

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

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

Using CompareTo() method to compare strings

Usando o método Equals() e o operador -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 False 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 o operador -eq para comparar os valores de $string1 e $string2.

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

Como você pode ver no resultado abaixo, o resultado ao usar -eq e o método Equal() são os mesmos.

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/