¿Cómo convierto un objeto de matriz en una cadena en PowerShell?

175

¿Cómo puedo convertir un objeto de matriz en cadena?

Lo intenté:

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

sin suerte . ¿Cuáles son las diferentes posibilidades en PowerShell?

jrara
fuente
55
Vea mi respuesta, pero su código también funciona bien. ¿Por qué dices "sin suerte"?
Roman Kuzmin
44
Lo siento, sí, parece funcionar, creo que arruiné algo cuando probé esto.
jrara

Respuestas:

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

Usar comillas dobles (y opcionalmente usar el separador $ofs)

# This Is a cat
"$a"

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

Usando operador unirse

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

# ThisIsacat
-join $a

Usando la conversión a [string]

# This Is a cat
[string]$a

# This-Is-a-cat
$ofs = '-'
[string]$a
Roman Kuzmin
fuente
9
Para los no iniciados (como yo) $ofsestá documentado aquí
Liam
13
La documentación de Stackoverflow se ha cerrado, por lo que el enlace de Liam está inactivo. Aquí hay otra explicación de $ OFS, el separador de campo de salida: blogs.msdn.microsoft.com/powershell/2006/07/15/…
Simon Tewsi
¿Por qué se llama OFS? Es un nombre extraño teniendo en cuenta que se ha llamado IFS en shell estándar durante décadas y décadas.
Johan Boulé
1
@ JohanBoulé: Porque usar el primer carácter del Separador de campo de entrada como el Separador de campo de salida es un truco desagradable, y no permite separar campos con cadenas de caracteres múltiples. (Awk, por ejemplo, tiene variables FS y OFS).
Martin Bonner apoya a Monica el
@martin bonner: gracias, tiene sentido ahora. No sé cómo arruiné esto.
Johan Boulé
36

Descubrí que canalizar la matriz al Out-Stringcmdlet también funciona bien.

Por ejemplo:

PS C:\> $a  | out-string

This
Is
a
cat

Depende de su objetivo final en cuanto a qué método es el mejor para usar.

Jeremy Saunders
fuente
44
FYI: solo hacerlo $atendría el mismo efecto que$a | out-string
JohnLBevan
77
@JohnLBevan No siempre. ($a | out-string).getType()= Cadena. $a.getType()= Objeto []. Si usa $ a como argumento para un método que espera una cadena (como invoke-expressionpor ejemplo), entonces $a | out-stringtiene una clara ventaja.
rojo
18
1> $a = "This", "Is", "a", "cat"

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

La línea dos realiza la operación y envía al host, pero no modifica $ a:

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

4> $a

This Is a cat

5> $a.Count

1
TCC
fuente
10

De una pipa

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

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

Host de escritura

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

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

Ejemplo

Steven Penny
fuente
Este es un truco increíble. El ejemplo ya no funciona, y aunque esta respuesta tiene 5 años, trato de explicar lo que aprendí hoy. La variable $ofses la Output Field Separatorque se utiliza cuando una matriz se convierte en una cadena para la salida. Aquí se establece en el bloque de script que devuelve el valor de cadena de la entrada (matriz de la tubería) que se ejecuta mediante el comando &. No lo sabía $ofsantes, además de &aceptar un bloque de guión como argumento
Martin Konopka
3

Puede especificar un tipo como este:

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

Comprobando el tipo:

$a.GetType()

Confirma:

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

Salida de $ a:

PS C: \> $ a 
Esta 
Es 
una 
gato
Ameer Deen
fuente
0
$a = "This", "Is", "a", "cat"

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

Write-Host $sent
Underverse
fuente