Como concatenar strings e variáveis em PowerShell?
suponha que eu tenha o seguinte trecho:
$assoc = New-Object psobject -Property @{
Id = 42
Name = "Slim Shady"
Owner = "Eminem"
}
Write-host $assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner
Esperava que este trecho mostrasse:
42 - Slim Shady - Eminem
mas em vez disso mostra:
O que me faz pensar que o operador
42 + - + Slim Shady + - + Eminem
+
não é apropriado para concatenar cadeias e variáveis.
Como se deve abordar isto com o PowerShell?
16 answers
Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
Ver a versão 3.0, p34, expansão das sub-expressões do Windows PowerShell Language.
Você pode fazer isso (como @Ben disse):
$name = 'Slim Shady'
Write-Host 'My name is'$name
-> My name is Slim Shady
Ou podes fazer isto:
$name = 'Slim Shady'
Write-Host "My name is $name"
-> My name is Slim Shady
As aspas simples são para o literal, dê o texto exactamente como este, por favor. As aspas são para quando você quer algum pré-processamento feito (tais como variáveis, caracteres especiais etc)
Então:
$name = "Marshall Bruce Mathers III"
Write-Host "$name"
-> Marshall Bruce Mathers III
Considerando o seguinte:
$name = "Marshall Bruce Mathers III"
Write-Host '$name'
-> $name
(http://ss64.com/ps/syntax-esc.html acho que é bom para referência).
Uma maneira é:
Write-host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
Outro é:
Write-host ("{0} - {1} - {2}" -f $assoc.Id,$assoc.Name,$assoc.Owner )
Ou apenas (mas eu não gosto disso;):
Write-host $assoc.Id " - " $assoc.Name " - " $assoc.Owner
Tenta embrulhar o que quiseres Imprimir entre parêntesis:
Write-host ($assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner)
O seu código está a ser interpretado como muitos parâmetros a serem passados para Write-Host
. Embrulhá-lo dentro de parêntesis irá concatenar os valores e, em seguida, passar o valor resultante como um único parâmetro.
Para concatenar duas cadeias de caracteres para armazenar numa variável/usar numa função, você pode usar-join.
Por exemplo
$name = -join("Jo", "h", "n");
Atribuiria "John" a $name.
De modo a sair, numa linha:
Write-Host (-join("Jo", "h", "n"))
Outra opção é:
$string = $assoc.ID
$string += " - "
$string += $assoc.Name
$string += " - "
$string += $assoc.Owner
Write-Host $string
O método" melhor " é provavelmente o que C. B. sugeriu:
Write-host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
É necessário colocar a expressão entre parêntesis para evitar que sejam tratados como parâmetros diferentes do cmdlet:
Write-host ($assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner)
Aqui está outra maneira como alternativa:
Write-host (" {0} - {1} - {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
Enquanto expressão:
"string1" + "string2" + "string3"
Vai concatenar as cordas. Você precisa colocar um $ na frente do parêntesis para fazê-lo avaliar como um único argumento quando passado para um comando powershell. Exemplo:
Write-Host $( "string1" + "string2" + "string3" )
Como bónus, se quiser que abranja várias linhas, então terá de usar a sintaxe ackward backtick no fim da linha (sem quaisquer espaços ou caracteres à direita do backtick). Exemplo:
Write-Host $(`
"The rain in " +`
"Spain falls mainly " +`
"in the plains" )`
-ForegroundColor Yellow
(Na verdade, acho que o Powershell está neste momento implementado um pouco errado por requer back-ticks desnecessários entre parênteses. Se a Microsoft apenas seguisse as regras de parêntesis" Python" ou " TCL " de permitir que você coloque quantas linhas novas você quiser entre parêntesis inicial e final, então eles resolveriam a maioria dos problemas que as pessoas não gostam sobre powershell relacionados com a continuação da linha, e concatenação de cadeias de caracteres. Descobri que podes deixar as carraças desligadas, às vezes, em continuações de linha entre parêntesis, mas... é muito instável e imprevisível se funcionar.. é melhor adicionar os pontos de trás.)
Só quero trazer outra maneira de fazer isto usando o texto.net .Formato:
$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))
De o Que Fazer / Não Fazer em PowerShell: Parte 1:
$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
$name = 'Slim Shady'
Write-Host 'My name is'$name
Vai sair
O meu nome é Slim Shady.
Repare como se coloca um espaço entre as palavras para si
$strDate = Get-Date
$strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday
Eu pareço lutar com isso (e muitas outras coisas não intuitivas) cada vez que eu uso PowerShell após o tempo longe dele, então eu agora opto por:
[string]::Concat("There are ", $count, " items in the list")
Write-Host também pode concatenar assim:
Write-Host $assoc.Id" - "$assoc.Name" - "$assoc.Owner
Esta é a maneira mais simples, IMHO.
Tenta isto:
$name = "Slim Shady"
Write-Host "My name is " $name