Supposons que j'ai l'extrait de code suivant:
$assoc = New-Object psobject -Property @{
Id = 42
Name = "Slim Shady"
Owner = "Eminem"
}
Write-host $assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner
Je m'attends à ce que cet 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 devez-vous aborder cela avec PowerShell?
powershell
string-concatenation
Ninja Cowgirl
la source
la source
Write-host ($assoc.Id.ToString() + " - " + $assoc.Name + " - " + $assoc.Owner)
ici $ assoc.Id est unInt32
donc nous devons utiliser sa représentation sous forme de chaîne. Sinon, PS essaie d'effectuer une addition arithmétique au lieu d'une concaténation.Réponses:
Voir l' extension de sous-expressions Windows PowerShell Language Specification version 3.0 , p34.
la source
Write-Output
et al , c'est donc probablement la plus utile à avoir dans votre boîte à outils."... $name ..."
fonctionnera tout de même, mais dans la question d'origine à laquelle cette réponse répond, la question est de savoir comment accéder aux propriétés des objets. donc si$name.id -eq 42
alors"... $name.id ..."
ne fonctionnerait pas comme vous le souhaitez, car il rendrait comme... @{id=42}.id ...
au lieu de la souhaitée... 42 ...
Pour cela, utilisez la méthode de la réponse"... $($name.id) ..."
. Je signets une question à modifier plus tard.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):
Ou vous pouvez le faire:
Les guillemets simples sont pour littéral, affichez la chaîne exactement comme ceci, s'il vous plaît. Les guillemets doubles sont pour quand vous voulez faire un prétraitement (comme les variables, les caractères spéciaux, etc.)
Donc:
Tandis que:
( http://ss64.com/ps/syntax-esc.html je trouve bon pour référence).
la source
Une façon est:
Un autre est:
Ou juste (mais je n'aime pas ça;)):
la source
$assoc.Id
et"
(et al). Autrement dit, l'option 1 vous donneId__-__Name__-__Owner
(deux espaces de chaque côté de chacun-
), mais l'option 3 donneId___-___Name___-___Owner
( trois espaces).$assoc.Id"###"$assoc.Name
va ajouter des espaces de chaque côté de la ###, où"$($assoc.Id)###$($assoc.Name)"
ne sera pas .Vous pouvez aussi utiliser
-join
Par exemple
Attribuerait "John" à $ nom.
Donc, pour sortir, en une seule ligne:
la source
Essayez d'envelopper tout ce que vous souhaitez imprimer entre parenthèses:
Votre code est interprété comme autant de paramètres transmis
Write-Host
. L'encapsuler entre parenthèses concatène les valeurs, puis transmet la valeur résultante en tant que paramètre unique.la source
Write-Debug
ouWrite-Verbose
pour inclure des guillemets doubles et des valeurs variables, commeWrite-Debug ('Running "cmdlet" with parameter $MyVar = ' + $MyVar + " at time " + (Get-Date -DisplayHint Time))
Une autre option est:
La "meilleure" méthode est probablement celle suggérée par CB:
la source
StringBuilder
option si vous devenez fou. ; ^)Vous devez placer l'expression entre parenthèses pour éviter qu'elles ne soient traitées comme des paramètres différents de l'applet de commande:
la source
Alors que l'expression:
va concaténer les chaînes. Vous devez mettre un $ devant la parenthèse pour qu'elle soit évaluée comme un seul argument lorsqu'elle est passée à une commande powershell. Exemple:
En prime, si vous souhaitez qu'il s'étende sur plusieurs lignes, vous devez utiliser la syntaxe d'acquittement vers l'arrière à la fin de la ligne (sans espaces ni caractères à droite de l'arrière). Exemple:
(En fait, je pense que Powershell est actuellement implémenté un peu mal en nécessitant des retours en arrière inutiles entre parenthèses. Si Microsoft devait simplement suivre les règles de parenthèse "Python" ou "TCL" pour vous permettre de mettre autant de nouvelles lignes que vous le souhaitez entre le démarrage et la fin des parenthèses résoudrait alors la plupart des problèmes que les gens n'aiment pas à propos de la PowerShell liés à la continuation de ligne et à la concaténation des chaînes. J'ai trouvé que vous pouvez laisser les tiques en arrière parfois en ligne entre les parenthèses, mais sa vraiment floconneux et imprévisible si cela fonctionne .. il vaut mieux simplement ajouter les contre-coups.)
la source
Voici une autre façon comme alternative:
la source
Je veux juste apporter une autre façon de le faire en utilisant .NET String.Format :
la source
String.Format
au lieu de l'ancienne plaine"{0}" -f $var
? Je ne vois pas l'intérêt d'utiliser du code .NET où PowerShell ordinaire peut faire le travail ...(Version PS actuelle 5.1.17134.407)
Tout est dit et fait maintenant, je suppose, mais cela fonctionne aussi à partir de maintenant:
Remarque: cela ne fonctionne qu'avec des guillemets doubles
la source
Ces réponses semblent toutes très compliquées. Si vous l'utilisez dans un script PowerShell, vous pouvez simplement le faire:
Il produira
Notez comment un espace est placé entre les mots pour vous
la source
De quoi faire / ne pas faire dans PowerShell: Partie 1 :
la source
Concaténer des chaînes comme au temps DOS. C'est un gros problème pour la journalisation, alors voilà:
la source
toString
option est plus simple:(Get-Date).toString('yyyyMMdd')
Je semble avoir du mal avec cela (et bien d'autres choses non intuitives) chaque fois que j'utilise PowerShell après un temps loin de lui, alors j'opte maintenant pour:
la source
Write-Host peut également concaténer comme ceci:
C'est le moyen le plus simple, à mon humble avis.
la source
la source
Si vous concaténez des chaînes pour créer des chemins de fichier, utilisez la commande join-path:
Il ajoutera automatiquement les barres obliques de fin / de tête appropriées pour vous, ce qui rend les choses beaucoup plus faciles.
Je m'excuse si c'est trop hors sujet, mais j'ai pensé que cela pourrait aider certains.
Si je n'utilise pas PowerShell pendant un certain temps, parfois j'oublie qu'il existe et commence à rechercher les opérateurs de concaténation.
la source
Vous pouvez également accéder aux méthodes C # /. NET, et les éléments suivants fonctionnent également:
la source
Juste pour le plaisir. Vous pouvez également accéder directement aux valeurs du PSObject comme ci-dessous:
Mais si vous ne spécifiez pas que l'objet doit être ordonné, Powershell affichera les valeurs dans un ordre aléatoire. Il faut donc ajouter le drapeau [commandé]
la source