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?
16 réponses
Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
Voir l'extensionWindows PowerShell Language Specification Version 3.0 , P34, sub-expressions.
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).
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
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.
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"))
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)"
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)
Voici une autre façon comme alternative:
Write-host (" {0} - {1} - {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
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.)
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))
De Quoi Faire / Ne Pas faire en PowerShell: Partie 1:
$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
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
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
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")
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.
Essayez ceci:
$name = "Slim Shady"
Write-Host "My name is " $name