Formatação de String no PowerShell: Domine os Conceitos Básicos

O tipo string é provavelmente a variável mais popular no PowerShell. Eu acho que nunca escrevi um script que não contivesse pelo menos uma string. Strings são ótimas para definir um conjunto simples de caracteres como um nome de computador, caminho para um arquivo de texto, um caminho de chave de registro, uma URL e assim por diante. Expandindo variáveis dentro de strings e usando as capacidades de formatação de strings do PowerShell, você pode fazer praticamente qualquer coisa.

Strings são definidas ao se colocar um ou mais caracteres entre aspas simples ou duplas como:

$Url = 'http:\\www.bing.com'
$FilePath = 'C:\thisissomefile.txt'

Definir strings assim é simples, mas logo você se verá precisando obter o valor de uma variável dentro das strings.

Por exemplo, talvez você tenha um script com um parâmetro ComputerName e no seu script, você precisa concatenar um prefixo padrão a ele como SRV- conforme mostrado abaixo.

$ComputerName = 'URANUS'
$ComputerName = "SRV-$ComputerName"

O valor da variável $ComputerName agora é SRV-URANUS mas colocar $ComputerName dentro da string com aspas duplas é apenas uma maneira de inserir variáveis em strings. Existem algumas maneiras diferentes de fazer isso acontecer. Vamos dar uma olhada em dois exemplos.

Expandindo Strings

O primeiro método é um com o qual você provavelmente já está familiarizado, chamado expandindo strings, ou simplesmente expandindo variáveis dentro de strings existentes. Esta é a maneira mais comum de fazer o valor de uma variável aparecer em uma string.

Para fazer isso requer colocar a variável dentro de uma string com aspas duplas. Aspas simples não funcionarão porque tratam todos os caracteres literalmente.

Por exemplo, talvez eu precise especificar o caminho para um arquivo. Eu sei o caminho da pasta base, mas ainda não sei o nome do arquivo. Eu posso criar uma variável chamada $FullPath e inserir estaticamente o caminho da pasta, mas fazer do nome do arquivo uma variável.

PS> $FileName = 'MyFile.txt'
PS> $FullPath = "C:\Folder\subfolder\$FileName"
PS> $FullPath
C:\Folder\subfolder\MyFile.txt

E se você precisar especificar uma propriedade de objeto dentro de uma string? Isso parece um pouco diferente. Nesse caso, eu preciso cercar a propriedade com parênteses e adicionar um sinal de dólar na frente. Isso é chamado de operador de subexpressão. Isso diz ao PowerShell para expandir o valor primeiro.

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> $FullPath = "C:\Folder\subfolder\$($File.Name)"
PS> $FullPath
C:\Folder\subfolder\MyFile.txt

Expandir uma string é muito comum, mas e se você tiver uma string mais complicada?

Usando o Operador de Formato de String do PowerShell

Outra maneira de garantir que os valores das variáveis sejam inseridos em suas strings é através do operador de formato do Powershell (-f).

Usando o operador de formato, você não precisa colocar a variável ou a propriedade dentro de uma string cercada por aspas duplas. Você pode criar uma string entre aspas simples e especificar as variáveis que irão para essa string do lado de fora, conforme mostrado abaixo.

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> 'C:\Folder\subfolder\{0}' -f $File.Name
C:\Folder\subfolder\MyFile.txt

Você pode ver que tem o mesmo efeito exato. Embora desta vez você não tenha que usar aspas duplas ou se preocupar em cercar a propriedade do objeto em parênteses e outro sinal de dólar. Parece um pouco mais limpo, mas pode ser mais difícil de entender. Usar o operador de formato obriga você a substituir o {0} por $File.Name em sua mente.

Para adicionar outras variáveis, basta incrementar suas etiquetas por 1 e continuar adicionando variáveis separadas por vírgula ao operador de formato. Desde que a posição do índice do operador de formato coincida com a posição na etiqueta da string, você pode adicionar quantas referências quiser.

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> $SubFolderName = 'folder1'
PS> 'C:\Folder\subfolder\{0}\{1}' -f $SubFolderName, $File.Name
C:\Folder\subfolder\folder1\MyFile.txt

Quando usar o Operador de Formato

I usually prefer to place variables inside of the string and expand them because I don’t have to match an index with a value. However, there are exceptions, as in the case of special characters that must be escaped.

Por exemplo, suponha que você precise executar um utilitário de linha de comando que exige que você passe um nome de arquivo para ele. Este caminho do arquivo pode conter espaços, então você precisará envolver essa referência com aspas duplas. Sem essas aspas duplas, o utility.exe não conseguiria interpretar corretamente o argumento do arquivo.

Utility.exe -file "C:\Program Files\SomeFolder\a subfolder here"

Agora, digamos que você queira fazer isso em um script do PowerShell. Se estiver usando strings expansíveis, ficaria um pouco bagunçado porque você precisa usar um acento grave para escapar das aspas duplas.

$FileName = 'C:\Program Files\SomeFolder\a subfolder here'
Start-Process -FilePath 'utility.exe' -Args "`"$FileName`""

Agora, vamos obter o mesmo resultado com o operador de formato.

$FileName = 'C:\Program Files\SomeFolder\a subfolder here'
$Args = '"{0}"' -f $FileName
Start-Process -FilePath 'utility.exe' -Args $Args

I don’t have to use any escape characters. This may seem like a simple example but as soon as you come across large strings that require a lot of escaping you will soon see the real benefit of using the format operator!

Resumo

Da próxima vez que se encontrar tendo que substituir variáveis dentro de uma string, pense em qual método seria mais legível. Isso economizará tempo a longo prazo.

Para mais posts relacionados ao trabalho com strings, não deixe de conferir O PowerShell Substring: Encontrando uma string dentro de outra e Variáveis do PowerShell em Strings.

Source:
https://adamtheautomator.com/powershell-string-format/