web-dev-qa-db-fra.com

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 l'extrait montre:

42 - Slim Shady - Eminem

Mais à la place cela 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?

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

Voir la Spécification de langage Windows PowerShell Version 3.0 , p34, développement des sous-expressions.

459
David Brabant

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

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

$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, la chaîne de caractères est exactement comme ceci, s'il vous plaît ..____ Les guillemets doubles sont valables lorsque vous voulez effectuer un pré-traitement (comme des variables, des caractères spéciaux, etc.)

Alors:

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

Tandis que:

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

( http://ss64.com/ps/syntax-esc.html Je trouve que c'est bien pour référence).

154
TinyRacoon

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 juste (mais je n'aime pas ça;)):

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

Vous pouvez également utiliser -join

Par exemple.

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

Affecterait "John" à $ name.

Donc, pour afficher en une seule ligne:

Write-Host (-join("Jo", "h", "n"))
60
manyways

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

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

Votre code est interprété sous la forme de nombreux paramètres passés à Write-Host. En le plaçant entre parenthèses, vous concatérez les valeurs puis transmettez la valeur obtenue sous la forme d'un paramètre unique.

45
goric

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 CB:

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

Vous devez placer l'expression entre parenthèses pour éviter qu'elles ne soient traitées comme des paramètres différents de la cmdlet:

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

Alors que l'expression:

"string1" + "string2" + "string3"

concaténer les chaînes. Vous devez mettre un $ devant la parenthèse pour que l'évaluation soit considérée comme un argument unique lorsqu'elle est transmise à une commande powershell. Exemple:

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

En prime, si vous souhaitez qu'il s'étende sur 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 faux car il nécessite des contrôles inutiles entre parenthèses. Si Microsoft ne faisait que suivre les règles de parenthèse "Python" ou "TCL" en mettant fin à la parenthèse, ils résoudraient la plupart des problèmes que les gens n'aiment pas avec powershell liés à la continuation de la ligne et à la concaténation de chaînes. vraiment floconneux et imprévisible si cela fonctionnera .. il vaut mieux ajouter les backticks.)

13
Bill Moore

Voici une autre solution alternative:

Write-Host (" {0}  -  {1}  -  {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
10
Dave Sexton

Je veux juste apporter un autre moyen de faire cela en utilisant .NET String.Format :

$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))
8
Martin Brandl

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

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

Il va sortir

Je m'appelle Slim Shady

Notez comment un espace est mis entre les mots pour vous

6
elev8ed

De Que faire/ne pas faire dans PowerShell: Première partie:

$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
6
E.V.I.L.

Concaténer des chaînes comme dans les jours DOS. C'est un gros problème pour la journalisation, alors voici:

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

Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday
4
Kelly Davis

Il semble que je sois aux prises avec ce problème (et bien d’autres choses peu intuitives) chaque fois que j’utilise PowerShell à chaque fois que je l’utilise, alors j’opte maintenant pour:

[string]::Concat("There are ", $count, " items in the list")
4
Luke Puplett

Write-Host 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
Mordechai

(Version actuelle du PS 5.1.17134.407)

Tout est dit et fait maintenant je suppose mais cela fonctionne aussi à partir de maintenant:

$myVar = "Hello"

echo "${myVar} World"
1
Benjamin

Juste pour le plaisir. Vous pouvez également accéder aux valeurs du PSObject directement comme ci-dessous:

$assoc.psobject.Properties.value -join " - "

Mais si vous ne spécifiez pas que l'objet doit être commandé, Powershell affiche les valeurs dans un ordre aléatoire. Alors devrait ajouter le drapeau [commandé]

$assoc = [pscustomobject] [ordered] @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}
0
R.Amersfoort
$assoc = @{
    Id = 34
    FirstName = "John"
    LastName = "Doe"
    Owner = "Wife"
}

$assocId = $assoc.Id
$assocFN = $assoc.FirstName
$assocLN = $assoc.LastName
$assocName = $assocFN, $assocLN -Join " "
$assocOwner = $assoc.Owner

$assocJoin = $assocId, $assocName, $assocOwner -join " - "
$assocJoin
#Output = 34 - John Doe - Wife
0
blayderunner123