Formatação de Strings do PowerShell: Domine os Conceitos Básicos

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

As strings são definidas ao envolver um ou mais caracteres entre aspas simples ou duplas, como:

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

Definir strings dessa forma é direto, mas logo você se verá precisando obter o valor de uma variável dentro de strings.

Por exemplo, talvez você tenha um script com um parâmetro ComputerName e, no seu script, precise 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 envolver $ComputerName dentro da string com aspas duplas é apenas uma maneira de inserir variáveis em strings. Existem algumas maneiras diferentes de fazer isso. Vamos dar uma olhada em dois exemplos.

Expandindo Strings

O primeiro método é provavelmente algo que você já conhece, chamado de expansão de strings, ou simplesmente expandindo variáveis dentro de strings existentes. Esta é a maneira mais comum de fazer com que o valor de uma variável apareça em uma string.

Para fazer isso, é necessário colocar a variável dentro de uma string com aspas duplas. As aspas simples não funcionarão, pois tratam todos os caracteres literalmente.

Por exemplo, talvez eu precise especificar o caminho para um arquivo. Eu conheço o caminho da pasta base, mas ainda não sei o nome real do arquivo. Eu poderia criar uma variável chamada $FullPath e inserir estaticamente o caminho da pasta, tornando o 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 cifrão 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 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 entrarão nessa string fora dela, como 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 envolver a propriedade do objeto em parênteses e outro cifrão. 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 seus rótulos em 1 e continuar adicionando variáveis separadas por vírgula para o operador de formato. Desde que a posição do índice do operador de formato corresponda à posição no rótulo da string, você pode adicionar quantas referências desejar.

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, digamos 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á cercar essa referência com aspas duplas. Sem essas aspas duplas, o utilitário.exe não poderia 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 em expansão, parecerá um pouco bagunçado porque você deve 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 Substring do PowerShell: Encontrando uma string dentro de uma string e Variáveis do PowerShell em Strings.

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