Comment convertir un objet tableau en chaîne dans PowerShell?

175

Comment puis-je convertir un objet tableau en chaîne?

J'ai essayé:

$a = "This", "Is", "a", "cat"
[system.String]::Join(" ", $a)

sans chance . Quelles sont les différentes possibilités dans PowerShell?

jrara
la source
5
Voir ma réponse mais votre code fonctionne très bien aussi. Pourquoi dites-vous "sans chance"?
Roman Kuzmin
4
Désolé, oui, cela semble fonctionner, je pense que j'ai raté quelque chose quand j'ai testé cela.
jrara

Réponses:

294
$a = 'This', 'Is', 'a', 'cat'

Utiliser des guillemets doubles (et éventuellement utiliser le séparateur $ofs)

# This Is a cat
"$a"

# This-Is-a-cat
$ofs = '-' # after this all casts work this way until $ofs changes!
"$a"

Utilisation de la jointure d'opérateur

# This-Is-a-cat
$a -join '-'

# ThisIsacat
-join $a

Utilisation de la conversion en [string]

# This Is a cat
[string]$a

# This-Is-a-cat
$ofs = '-'
[string]$a
Roman Kuzmin
la source
9
Pour les non-initiés (comme moi) $ofsest documenté ici
Liam
13
La documentation de Stackoverflow a été fermée, le lien de Liam est donc mort. Voici une autre explication de $ OFS, le séparateur de champ de sortie: blogs.msdn.microsoft.com/powershell/2006/07/15
Simon Tewsi
Pourquoi s'appelle-t-il OFS? C'est un nom étrange étant donné qu'il s'appelle IFS sur une coque standard depuis des décennies et des décennies.
Johan Boulé
1
@ JohanBoulé: Parce que l'utilisation du premier caractère du séparateur de champ d'entrée comme séparateur de champ de sortie est un mauvais hack - et ne permet pas de séparer les champs avec des chaînes de plusieurs caractères. (Awk par exemple a des variables FS et OFS).
Martin Bonner soutient Monica le
@martin bonner: merci, c'est logique maintenant. Je ne sais pas comment j'ai gâché ça.
Johan Boulé
36

J'ai trouvé que la canalisation du tableau vers l' Out-Stringapplet de commande fonctionne bien aussi.

Par exemple:

PS C:\> $a  | out-string

This
Is
a
cat

Cela dépend de votre objectif final quant à la meilleure méthode à utiliser.

Jeremy Saunders
la source
4
FYI: le simple fait de faire $aaurait le même effet que$a | out-string
JohnLBevan
7
@JohnLBevan Pas toujours. ($a | out-string).getType()= Chaîne. $a.getType()= Objet []. Si vous utilisez $ a comme argument pour une méthode qui attend une chaîne (comme invoke-expressionpar exemple), cela $a | out-stringprésente un net avantage.
rojo
18
1> $a = "This", "Is", "a", "cat"

2> [system.String]::Join(" ", $a)

La ligne deux effectue l'opération et sort vers l'hôte, mais ne modifie pas $ a:

3> $a = [system.String]::Join(" ", $a)

4> $a

This Is a cat

5> $a.Count

1
TCC
la source
10

D'un tuyau

# This Is a cat
'This', 'Is', 'a', 'cat' | & {"$input"}

# This-Is-a-cat
'This', 'Is', 'a', 'cat' | & {$ofs='-';"$input"}

Hôte d'écriture

# This Is a cat
Write-Host 'This', 'Is', 'a', 'cat'

# This-Is-a-cat
Write-Host -Separator '-' 'This', 'Is', 'a', 'cat'

Exemple

Steven Penny
la source
C'est un truc incroyable. L'exemple ne fonctionne plus, et même si cette réponse a 5 ans, j'essaie d'expliquer ce que j'ai appris aujourd'hui. La variable $ofsis Output Field Separatorqui est utilisée lorsqu'un tableau est converti en chaîne pour la sortie. Ici, il est défini dans le bloc de script renvoyant la valeur de chaîne de l'entrée (tableau du tube) qui est exécutée par la commande &. Je ne savais pas $ofsavant, ainsi que d' &accepter un bloc de script comme argument
Martin Konopka
3

Vous pouvez spécifier le type comme ceci:

[string[]] $a = "This", "Is", "a", "cat"

Vérification du type:

$a.GetType()

Confirme:

    IsPublic Nom IsSerial BaseType
    -------- -------- ---- --------
    True True String [] System.Array

Sortie de $ a:

PS C: \> $ a 
Ce 
Est 
une 
chat
Ameer Deen
la source
0
$a = "This", "Is", "a", "cat"

foreach ( $word in $a ) { $sent = "$sent $word" }
$sent = $sent.Substring(1)

Write-Host $sent
Underverse
la source