Come faccio a convertire un oggetto array in una stringa in PowerShell?


175

Come posso convertire un oggetto array in stringa?

Provai:

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

senza fortuna . Quali sono le diverse possibilità in PowerShell?


5
Vedi la mia risposta ma anche il tuo codice funziona bene. Perché dici "senza fortuna"?
Roman Kuzmin,

4
Scusa, sì, sembra funzionare, penso di aver sbagliato qualcosa quando l'ho provato.
jrara,

Risposte:


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

Uso delle virgolette doppie (e facoltativamente utilizzare il separatore $ofs)

# This Is a cat
"$a"

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

Utilizzo dell'operatore join

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

# ThisIsacat
-join $a

Utilizzando la conversione in [string]

# This Is a cat
[string]$a

# This-Is-a-cat
$ofs = '-'
[string]$a

9
Per i non iniziati (come me) $ofsè documentato qui
Liam,

13
La documentazione di Stackoverflow è stata chiusa, quindi il collegamento di Liam è interrotto. Ecco un'altra spiegazione di $ OFS, il Output Field Separator: blogs.msdn.microsoft.com/powershell/2006/07/15/…
Simon Tewsi,

Perché si chiama OFS? È un nome strano considerando che è stato chiamato IFS su shell standard per decenni e decenni.
Johan Boulé,

1
@ JohanBoulé: Perché usare il primo carattere del separatore del campo di input come separatore del campo di output è un brutto trucco e non consente di separare i campi con stringhe multi-carattere. (Awk ad esempio ha variabili FS e OFS).
Martin Bonner supporta Monica il

@martin bonner: grazie, ora ha senso. Non so come ho fatto un casino.
Johan Boulé,

36

Ho scoperto che anche il piping dell'array al Out-Stringcmdlet funziona bene.

Per esempio:

PS C:\> $a  | out-string

This
Is
a
cat

Dipende dal tuo obiettivo finale su quale metodo è il migliore da usare.


4
FYI: solo facendo $aavrebbe lo stesso effetto di$a | out-string
JohnLBevan

7
@JohnLBevan Non sempre. ($a | out-string).getType()= String. $a.getType()= Oggetto []. Se stai usando $ a come argomento per un metodo che prevede una stringa (come invoke-expressionad esempio), allora $a | out-stringha un chiaro vantaggio.
venerdì

18
1> $a = "This", "Is", "a", "cat"

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

La riga due esegue l'operazione e restituisce l'host, ma non modifica $ a:

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

4> $a

This Is a cat

5> $a.Count

1

10

Da una pipa

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

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

Write-Host

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

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

Esempio


Questo è un trucco incredibile. L'esempio non funziona più e anche se questa risposta ha 5 anni, provo a spiegare ciò che ho imparato oggi. Il $ofsè Output Field Separatorvariabile utilizzata quando una matrice viene convertita in stringa per l'uscita. Qui è impostato nel blocco di script che restituisce il valore stringa dell'input (array dalla pipe) che viene eseguito dal comando &. Non lo sapevo $ofsprima, oltre ad &accettare un blocco di script come argomento
Martin Konopka il

3

È possibile specificare il tipo in questo modo:

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

Verifica del tipo:

$a.GetType()

conferma:

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

In uscita $ a:

PS C: \> $ a 
Questo 
È 
un' 
gatto

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

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

Write-Host $sent
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.