Como converter um objeto de matriz em uma seqüência de caracteres no PowerShell?


175

Como posso converter um objeto de matriz em string?

Eu tentei:

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

sem sorte . Quais são as diferentes possibilidades no PowerShell?


5
Veja minha resposta, mas seu código também funciona bem. Por que você diz "sem sorte"?
Roman Kuzmin

4
Desculpe, sim, parece funcionar, acho que errei alguma coisa quando testei isso.
Jrara # 11/11

Respostas:


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

Usando aspas duplas (e, opcionalmente, use o separador $ofs)

# This Is a cat
"$a"

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

Usando junção de operador

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

# ThisIsacat
-join $a

Usando a conversão para [string]

# This Is a cat
[string]$a

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

9
Para os não iniciados (como eu) $ofsestá documentado aqui
Liam

13
A documentação do Stackoverflow foi desativada, portanto o link de Liam está morto. Aqui está outra explicação do $ OFS, o separador de campos de saída: blogs.msdn.microsoft.com/powershell/2006/07/15/…
Simon Tewsi 5/17/17

Por que é chamado OFS? É um nome estranho, considerando que tem sido chamado de IFS no shell padrão por décadas e décadas.
Johan Boulé

1
@ JohanBoulé: Porque usar o primeiro caractere do separador de campos de entrada como separador de campos de saída é um truque desagradável - e não permite a separação de campos com seqüências de caracteres múltiplos. (Awk, por exemplo, tem variáveis ​​FS e OFS).
Martin Bonner apoia Monica

@ Bonin Bonner: obrigado, isso faz sentido agora. Não sei como estraguei tudo.
Johan Boulé

36

Descobri que canalizar a matriz para o Out-Stringcmdlet também funciona bem.

Por exemplo:

PS C:\> $a  | out-string

This
Is
a
cat

Depende do seu objetivo final sobre qual método é o melhor para usar.


4
FYI: apenas fazendo $ateria o mesmo efeito que$a | out-string
JohnLBevan

7
@JohnLBevan Nem sempre. ($a | out-string).getType()= String. $a.getType()= Objeto []. Se você estiver usando $ a como argumento para um método que espera uma sequência de caracteres (como invoke-expressionpor exemplo), terá $a | out-stringuma clara vantagem.
rojo

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

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

A linha dois executa a operação e as saídas para o host, mas não modifica $ a:

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

4> $a

This Is a cat

5> $a.Count

1

10

De um cano

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

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

Host de gravação

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

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

Exemplo


Esse é um truque incrível. O exemplo não funciona mais e, embora essa resposta tenha cinco anos, tento explicar o que aprendi hoje. A $ofsé Output Field Separatorvariável, que é usado quando uma matriz é convertida em cadeia para a saída. Aqui, ele é definido no bloco de scripts, retornando o valor da string da entrada (matriz do canal) que é executada pelo comando &. Eu não sabia sobre $ofsantes, bem como &aceitar um bloco de script como argumento
Martin Konopka

3

Você pode especificar um tipo como este:

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

Verificando o tipo:

$a.GetType()

Confirma:

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

Saída de $ a:

PS C: \> $ a 
este 
É 
uma 
gato

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

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

Write-Host $sent
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.