Melhor maneira de gravar no console no PowerShell

142

Estou tendo um pouco de confusão sobre as várias maneiras de imprimir (eco) no console. Vi que existem várias maneiras de gravar a saída no console, como:

Write-Host "Hello world1"
"Hello World2"
Out-Host -InputObject "Hello World3"

Todas as três maneiras serão impressas no console. A do meio é de alguma forma mais simples, menos detalhada e mais fácil de usar. Também acho que quando você escreve uma função como:

function GetValues()
{
    "1"
    "2"
}

Ele ainda retorna duas strings no pipeline:

E ainda sou capaz de imprimir os valores:

foreach ($s in GetValues)
{
    Write-Host "s: " $s
}

O que eu descobri foi que o uso apenas da cadeia de caracteres citada nem sempre aparece em hosts personalizados e que eu tive que usar o Write-Host para obter valores para imprimir em hosts personalizados.

De alguma forma, acho isso confuso. É "Print something"suposto ser um apelido para Write-Hostou qual é a intenção?

Andre
fonte

Respostas:

101

O comportamento padrão do PowerShell é apenas despejar tudo o que sai de um pipeline sem ser escolhido por outro elemento do pipeline ou ser atribuído a uma variável (ou redirecionado) Out-Host. O que Out-Hostfaz é obviamente dependente do host.

Apenas deixar as coisas caírem do pipeline não é um substituto para o Write-Hostqual existe apenas o motivo da saída de texto no aplicativo host.

Se você deseja saída, use os Write-*cmdlets. Se você deseja retornar valores de uma função, basta despejar os objetos lá sem nenhum cmdlet.

Joey
fonte
1
Eu digitei isso no script .vbs. Apenas essa linha de código e está me causando erro.
precisa saber é o seguinte
58

O do meio escreve no pipeline. Write-Hoste Out-Hostgrava no console. 'eco' é um alias para o Write-Outputqual grava também no pipeline. A melhor maneira de gravar no console seria usando o Write-Hostcmdlet.

Quando um objeto é gravado no pipeline, ele pode ser consumido por outros comandos da cadeia. Por exemplo:

"hello world" | Do-Something

mas isso não funcionará desde que seja Write-Hostgravado no console, não no pipeline (Do-Something não receberá a sequência):

Write-Host "hello world" | Do-Something
Shay Levy
fonte
3
Essa resposta é tecnicamente correta, mas suspeito que ela desvie um usuário do PowerShell neófito. A primeira regra do PowerShell efetivo é produzir resultados úteis no pipeline. Se você estiver usando muito o Write-Host, provavelmente está fazendo errado.
OldFart
6
Bem, não foi isso que o OP perguntou, como escrever no console? Há uma diferença entre escrever no host e escrever no pipeline, e é preciso saber o que cada um faz. Vou atualizar minha resposta com um esclarecimento.
Shay Levy