Existem várias maneiras diferentes de enviar mensagens. Qual é a diferença efectiva entre a saída de algo via Write-Host
, Write-Output
ou [console]::WriteLine
?
Percebo também que se eu usar:
write-host "count=" + $count
O +
é incluído na saída. Por que isso? A expressão não deve ser avaliada para produzir uma única sequência concatenada antes de ser gravada?
powershell
Scott Langham
fonte
fonte
Write-Output
quando você está emitindo resultados.Write-Host
quando você estiver emitindo informações de log. Nunca use[console]::writeline()
.[console]::writeline("hello world")
que não possa fazerWrite-Host "hello world"
. Outra, melhor, mais recentemente resposta aplicável é owrite-host
segredowrite-information
para que seus dados é colocado em um córrego comowrite-error
assim você pode capturá-lo e usá-lo em outro lugar.[console]::writeline()
não faz issoRespostas:
Write-Output
deve ser usado quando você deseja enviar dados na linha de tubulação, mas não necessariamente deseja exibi-los na tela. O pipeline acabará gravando-oout-default
se nada mais o usar primeiro.Write-Host
deve ser usado quando você quiser fazer o oposto.[console]::WriteLine
é essencialmente o queWrite-Host
está fazendo nos bastidores.Execute este código de demonstração e examine o resultado.
Você precisará colocar a operação de concatenação entre parênteses, para que o PowerShell processe a concatenação antes de tokenizar a lista de parâmetros
Write-Host
ou usar a interpolação de cadeiasBTW - Assista a este vídeo de Jeffrey Snover explicando como o pipeline funciona. Quando comecei a aprender o PowerShell, descobri que essa é a explicação mais útil de como o pipeline funciona.
fonte
Write-Output
seja o padrão, por exemplo, se você tiver um PsObject e cuspir na tela fazendo isso,$object
ele fará a mesma coisaWrite-Output $object
. Pode valer a pena mencionarWrite-Output
quando possível. Consulte github.com/PoshCode/PowerShellPracticeAndStyle/issues/… > Use retorno somente para finalizar a execução. > Evite saída de gravação (...). Em vez disso, quando quiser tornar a saída mais clara, apenas atribua a saída a uma variável com nome relevante. e coloque essa variável em uma linha por si só para sinalizar saída explícita. > Write-Output -NoEnumerate está quebrado no PowerShell 6 e dura 16 meses ou mais - não há plano para corrigi-lo. Em resumo:> NÃO USE Write-Output - NUNCA.Além do que Andy mencionou, há outra diferença que pode ser importante - o write-host grava diretamente no host e não retorna nada, o que significa que você não pode redirecionar a saída, por exemplo, para um arquivo.
Agora execute no PowerShell:
Como visto, você não pode redirecioná-los para um arquivo. Talvez isso seja surpreendente para alguém que não é cuidadoso.
Mas se você alternar para usar a saída de gravação, o redirecionamento funcionará conforme o esperado.
fonte
Aqui está outra maneira de obter o equivalente a Write-Output. Basta colocar sua string entre aspas:
Você pode garantir que isso funcione da mesma forma que a saída de gravação executando esta experiência:
Os dois primeiros exibirão "blá-blá" em out.txt, mas o terceiro não.
"help Write-Output" fornece uma dica desse comportamento:
Nesse caso, a própria sequência "count = $ count" é o objeto no final de um pipeline e é exibida.
fonte
Para usos de
Write-Host
,PSScriptAnalyzer
produz o seguinte diagnóstico:Consulte a documentação por trás dessa regra para obter mais informações. Trechos para a posteridade:
Jeffrey Snover tem uma postagem no blog Considerada prejudicial para o host de gravação, na qual afirma que host de gravação é quase sempre a coisa errada a se fazer, pois interfere na automação e fornece mais explicações por trás do diagnóstico, no entanto, o exposto acima é um bom resumo.
fonte
No meu teste, Write-Output e [Console] :: WriteLine () têm um desempenho muito melhor que o Write-Host.
Dependendo da quantidade de texto que você precisa escrever, isso pode ser importante.
Abaixo, se o resultado de 5 testes cada um para Write-Host, Write-Output e [Console] :: WriteLine ().
Na minha experiência limitada, descobri que, ao trabalhar com qualquer tipo de dados do mundo real, preciso abandonar os cmdlets e ir direto para os comandos de nível inferior para obter um desempenho decente dos meus scripts.
fonte
Write-Output
eWrite-Host
servem a propósitos diferentes; portanto, não faz sentido comparar o desempenho deles. Sim, o uso direto dos tipos .NET e seus métodos é mais rápido, mas você perde os recursos de nível superior que os cmdlets do PowerShell podem fornecer.[Console]::WriteLine()
é semelhante aoWrite-Host
caso em questão, mas não funcionará em todas as circunstâncias, porque nem todos os hosts do PowerShell são consoles .Em relação ao [Console] :: WriteLine () - você deve usá-lo se quiser usar pipelines no CMD (não no PowerShell). Digamos que você queira que seu ps1 transmita muitos dados para o stdout e algum outro utilitário para consumi-los / transformá-los. Se você usar Write-Host no script, será muito mais lento.
fonte