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?
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.
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).
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
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"))
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.
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)"
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)
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.)
Voici une autre solution alternative:
Write-Host (" {0} - {1} - {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
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))
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
De Que faire/ne pas faire dans PowerShell: Première partie:
$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
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
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")
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.
(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"
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"
}
$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