Comment concaténer des chaînes et des variables dans PowerShell?

Supposons que j'ai l'extrait suivant:

$assoc = New-Object psobject -Property @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}

Write-host $assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner

Je m'attendrais à ce que cet extrait montre:

42 - Slim Shady - Eminem

Mais à la place, il montre:

42 + - + Slim Shady + - + Eminem

Ce Qui me fait penser que l'opérateur + n'est pas approprié pour concaténer des chaînes et des variables.

Comment devriez-vous aborder cela avec PowerShell?

372
demandé sur Peter Mortensen 2013-02-27 17:34:02

16 réponses

Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"

Voir l'extensionWindows PowerShell Language Specification Version 3.0 , P34, sub-expressions.

388
répondu David Brabant 2016-03-18 19:32:01

Personne Ne semble avoir mentionné la différence entre les guillemets simples et doubles. (J'utilise PowerShell 4).

Vous pouvez le faire (comme l'a dit @ Ben):

$name = 'Slim Shady'
Write-Host 'My name is'$name
-> My name is Slim Shady

, Ou vous pouvez faire ceci:

$name = 'Slim Shady'
Write-Host "My name is $name"
-> My name is Slim Shady

Les guillemets simples sont pour littéral, sortie de la chaîne exactement comme ceci, veuillez. Les guillemets doubles sont pour quand vous voulez un pré-traitement effectué (comme les variables, les caractères spéciaux etc)

Donc:

$name = "Marshall Bruce Mathers III"
Write-Host "$name"
-> Marshall Bruce Mathers III

Considérant ce qui suit:

$name = "Marshall Bruce Mathers III"
Write-Host '$name'
-> $name

(http://ss64.com/ps/syntax-esc.html je trouve bon pour référence).

126
répondu TinyRacoon 2015-09-08 13:01:28

Une façon est:

Write-host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"

Un Autre est:

Write-host  ("{0}  -  {1}  -  {2}" -f $assoc.Id,$assoc.Name,$assoc.Owner )

Ou tout simplement (mais je ne l'aime pas ;) ):

Write-host $assoc.Id  "  -  "   $assoc.Name  "  -  "  $assoc.Owner
102
répondu CB. 2015-07-12 18:24:09

Essayez d'emballer ce que vous voulez imprimer entre parenthèses:

Write-host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)

Votre code est interprété comme de nombreux paramètres passés à Write-Host. L'envelopper dans la parenthèse concaténera les valeurs, puis passera la valeur résultante en tant que paramètre unique.

38
répondu goric 2013-02-27 13:37:39

Pour concaténer deux chaînes à stocker dans une variable / utiliser dans une fonction, vous pouvez utiliser -join.

Par exemple

$name = -join("Jo", "h", "n");

Affecterait "John" à $ name.

Donc à la sortie, dans une ligne:

Write-Host (-join("Jo", "h", "n"))
34
répondu manyways 2016-10-19 19:07:05

Une autre option est:

$string = $assoc.ID
$string += " - "
$string += $assoc.Name
$string += " - "
$string += $assoc.Owner
Write-Host $string

La "meilleure" méthode est probablement celle suggérée par C. B.:

Write-host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"
18
répondu Frode F. 2017-03-21 15:26:13

Vous devez placer l'expression entre parenthèses pour éviter qu'elle ne soit traitée comme des paramètres différents de l'applet de commande:

Write-host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)
14
répondu Richard 2015-07-13 17:46:25

Voici une autre façon comme alternative:

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

Alors que l'expression:

"string1" + "string2" + "string3"

Concaténera les chaînes. Vous devez mettre un $ devant la parenthèse pour le faire évaluer comme un seul argument lorsqu'il est passé à une commande powershell. Exemple:

Write-Host $( "string1" + "string2" + "string3" ) 

En prime, si vous voulez qu'il couvre plusieurs lignes, vous devez utiliser la syntaxe ackward backtick à la fin de la ligne (sans espaces ni caractères à droite du backtick). Exemple:

Write-Host $(`
    "The rain in "        +`
    "Spain falls mainly " +`
    "in the plains"       )`
    -ForegroundColor Yellow

(en fait, je pense que Powershell est actuellement implémenté un peu mal par nécessite des back-ticks inutiles entre parenthèses. Si Microsoft suivait simplement les règles de parenthèse " Python "ou" TCL " pour vous permettre de mettre autant de nouvelles lignes que vous le souhaitez entre les parenthèses de début et de fin, ils résoudraient la plupart des problèmes que les gens n'aiment pas à propos de powershell liés à la continuation de la ligne et à la concaténation des chaînes. J'ai trouvé que vous pouvez laisser les back-ticks parfois sur les continuations en ligne entre parenthèses, mais c'est vraiment flakey et imprévisible si cela va fonctionner.. il vaut mieux simplement ajouter les backticks.)

9
répondu Bill Moore 2017-09-11 00:22:34

Je veux juste apporter une autre façon de le faire en utilisant.Net String.Format :

$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))
7
répondu Martin Brandl 2016-05-26 18:11:40

De Quoi Faire / Ne Pas faire en PowerShell: Partie 1:

$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
6
répondu Mad Tom Vane 2015-07-12 18:25:52

Ces réponses semblent toutes très compliquées. Si vous utilisez ceci dans un script PowerShell, vous pouvez simplement le faire:

$name = 'Slim Shady'
Write-Host 'My name is'$name

Il affichera

Mon nom est Slim Shady

Notez comment un espace est mis entre les mots pour vous

6
répondu elev8ed 2015-07-12 18:26:35

Concaténer des chaînes comme dans les jours DOS. C'est une grosse affaire pour la journalisation, alors voilà:

$strDate = Get-Date
$strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)"

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

Il semble que je lutte avec ceci (et beaucoup d'autres choses non intuitives) chaque fois que J'utilise PowerShell après le temps loin de lui, donc j'opte maintenant pour:

[string]::Concat("There are ", $count, " items in the list")
2
répondu Luke Puplett 2017-04-19 08:23:11

Write-Host {[3] } peut concaténer comme ceci aussi:

Write-Host $assoc.Id" - "$assoc.Name" - "$assoc.Owner

C'est le moyen le plus simple, à mon humble avis.

2
répondu Mordechai 2017-06-17 12:50:46

Essayez ceci:

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