¿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?


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

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.


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

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


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

0
$a = "This", "Is", "a", "cat"

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

Write-Host $sent
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.