787 votes

Comment concaténer des chaînes de caractères et des variables dans Powershell ?

Supposons l'extrait suivant :

$name = "Slim Shady"
Write-Host "My name is " + $name

Je m'attendais à ce que ce bout de phrase s'affiche :

My name is Slim Shady

Mais au lieu de cela, il montre :

My name is + Slim Shady

Ce qui me fait penser que le + n'est pas approprié pour concaténer des chaînes de caractères et des variables.

L'exemple ci-dessus est un exemple artificiel. Dans mon cas réel, il y a une variable $assoc avec des propriétés Id , Name et Owner que j'aimerais faire partie de la chaîne.

Comment aborder cette question avec Powershell ?

37 votes

Votre code fonctionne si tous les éléments sont des chaînes de caractères et vous mettez l'expression entre parenthèses : Write-host ($assoc.Id.ToString() + " - " + $assoc.Name + " - " + $assoc.Owner) ici $assoc.Id est un Int32 Nous devons donc utiliser sa représentation sous forme de chaîne. Sinon, PS essaie d'effectuer une addition arithmétique au lieu d'une concaténation.

6 votes

Étant donné le nombre de consultations, j'ai pensé qu'il était approprié de réparer le texte de cette question, même si mes modifications ont changé le contenu de manière assez importante. J'ai essayé de garder la terminologie/la formulation et l'esprit de la question intacts, tout en l'améliorant suffisamment pour qu'elle puisse être rouverte.

857voto

David Brabant Points 11159
Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"

1 votes

Cette technique fonctionne avec Write-Output et al aussi, c'est donc probablement le plus utile à avoir dans votre boîte à outils.

8 votes

Pourquoi le $($name) plutôt que le simple $name ? Est-ce que c'est simplement défensif de la même manière que dans bash en utilisant ${name} ?

110 votes

Ce n'est pas techniquement une concaténation.

147voto

CB. Points 24549

d'une manière ou d'une autre :

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

un autre est :

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

ou juste ( mais je n'aime pas ça ;) )

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

9 votes

Je ne pense pas que le dernier fonctionne exactement comme prévu. Voir pastebin ici . Powershell ajoutera un espace (même si vous en avez deux ici) à la sortie pour l'espace blanc entre $assoc.Id y " (et al). Autrement dit, l'option 1 vous donne Id__-__Name__-__Owner (deux espaces de chaque côté de chaque - ), mais l'option 3 donne Id___-___Name___-___Owner ( trois espaces).

4 votes

Peut-être un pastebin plus utile . $assoc.Id"###"$assoc.Name sera ajouter des espaces de chaque côté du ###, où "$($assoc.Id)###$($assoc.Name)" ne le fera pas .

86voto

goric Points 5230

Essayez de mettre entre parenthèses ce que vous voulez imprimer :

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

Votre code est interprété comme si plusieurs paramètres étaient passés à l'ordinateur. Write-Host . En les plaçant entre parenthèses, les valeurs seront concaténées et la valeur résultante sera transmise comme un seul paramètre.

4 votes

+1, je préfère ce format lorsque j'utilise d'autres méthodes telles que Write-Debug o Write-Verbose pour inclure des guillemets doubles et des valeurs variables, telles que Write-Debug ('Running "cmdlet" with parameter $MyVar = ' + $MyVar + " at time " + (Get-Date -DisplayHint Time))

1 votes

Oui, c'est une concaténation de chaînes de caractères. Elle n'ajoute pas de nouvelles lignes ni d'espaces supplémentaires. Elle vous permet d'utiliser des chaînes de caractères à guillemets simples ou doubles.

1 votes

Cette astuce est une véritable concaténation et vous permet de faire des chaînes de caractères multi-lignes, comme vous le feriez en .net. Très bien pour faire des déclarations SQL multilignes ! Pourquoi powershell ne fait-il pas cela par défaut ?

39voto

Frode F. Points 12953

Puisque nous avons soudainement commencé à inclure toutes les options possibles, je vais en ajouter une nouvelle.

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

Blague à part, la "meilleure" méthode est probablement celle que C.B. a fournie :

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

3 votes

Vous devez ajouter le StringBuilder si vous devenez fou de concat ;^)

2 votes

Il y a sûrement un moyen d'envoyer les propriétés souhaitées dans un fichier externe, puis de les désérialiser en une chaîne de composants reliés par des tirets ( ?).

0 votes

Il est difficile d'imaginer une approche pire que celle-ci. Les chaînes de caractères sont immuables, donc chaque opération de concaténation produit en fait une nouvelle chaîne, en copiant les caractères de l'original.

29voto

Richard Points 54016

Il est nécessaire de mettre l'expression entre parenthèses pour éviter qu'elle ne soit traitée comme un paramètre différent de la cmdlet :

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

1 votes

Ceci est obligatoire pour Write-Debug

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X