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:

42 + - + Slim Shady + - + Eminem

O que me faz pensar que o operador + não é apropriado para concatenar cadeias e variáveis.

Como se deve abordar isto com o PowerShell?

Author: Peter Mortensen, 2013-02-27

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.

 388
Author: David Brabant, 2016-03-18 19:32:01
Ninguém parece ter mencionado a diferença entre aspas simples e aspas duplas. (Estou usando PowerShell 4).

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

 126
Author: TinyRacoon, 2015-09-08 13:01:28

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
 102
Author: CB., 2015-07-12 18:24:09

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.

 38
Author: goric, 2013-02-27 13:37:39

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"))
 34
Author: manyways, 2016-10-19 19:07:05

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)"
 18
Author: Frode F., 2017-03-21 15:26:13

É 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)
 14
Author: Richard, 2015-07-13 17:46:25

Aqui está outra maneira como alternativa:

Write-host (" {0}  -  {1}  -  {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
 10
Author: Dave Sexton, 2013-02-27 13:42:57

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

 9
Author: Bill Moore, 2017-09-11 00:22:34

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))
 7
Author: Martin Brandl, 2016-05-26 18:11:40

De o Que Fazer / Não Fazer em PowerShell: Parte 1:

$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
 6
Author: Mad Tom Vane, 2015-07-12 18:25:52
Estas respostas parecem todas muito complicadas. Se estiver a usar isto num programa PowerShell, pode simplesmente fazer isto:
$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

 6
Author: elev8ed, 2015-07-12 18:26:35
Cordas concatenadas como nos dias DOS. Isto é importante para o registo, por isso aqui vai:
$strDate = Get-Date
$strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)"

Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday
 4
Author: Kelly Davis, 2017-02-07 18:42:11

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")
 2
Author: Luke Puplett, 2017-04-19 08:23:11

Write-Host também pode concatenar assim:

Write-Host $assoc.Id" - "$assoc.Name" - "$assoc.Owner
Esta é a maneira mais simples, IMHO.
 2
Author: Mordechai, 2017-06-17 12:50:46

Tenta isto:

$name = "Slim Shady"
Write-Host "My name is " $name
 -5
Author: Kiran, 2015-04-29 16:54:21