Estou executando um script do PowerShell em um arquivo em lotes. O script busca uma página da web e verifica se o conteúdo da página é a sequência "OK".
O script do PowerShell retorna um nível de erro para o script em lote.
O script em lote é executado pelo ScriptFTP , um programa de automação de FTP. Se ocorrer um erro, o ScriptFTP poderá enviar a saída completa do console para o administrador por email.
No script do PowerShell, gostaria de gerar o valor de retorno do site, se não estiver "OK", para que a mensagem de erro seja incluída na saída do console e, portanto, no email de status.
Eu sou novo no PowerShell e não tenho certeza de qual função de saída usar para isso. Eu posso ver três:
- Host de gravação
- Saída de gravação
- Escrever erro
Qual seria a coisa certa a ser usada para gravar no equivalente do Windows stdout
?
fonte
"Hello, World!" | Out-Host
.Out-Host
por outro lado, envia objetos para o host do PowerShell para exibição e sua implementação depende do host. O host do console os envia para o identificador de saída padrão (passando peloOut-Default
caminho), de fato. O PowerShell ISE os exibe em seu painel de saída, no entanto, e outros hosts podem fazer outras coisas completamente.Get-ChildItem
a saída em formato de tabela, por exemplo, e resulta com muitas propriedades (por exemplo, WMI) padrãoFormat-List
.Eu acho que neste caso você precisará de Write-Output .
Se você tem um script como
então, se você chamar o script com saída redirecionada, algo como
yourscript.ps1 > out.txt
, você aparecerátest2
na telatest1\ntest3\n
em "out.txt".Observe que "test3" e a linha Write-Output sempre acrescentam uma nova linha ao seu texto e não há como o PowerShell parar isso (ou seja,
echo -n
é impossível no PowerShell com os comandos nativos). Se você deseja a funcionalidade (um tanto básica e fácil no Bash )echo -n
, consulte a resposta da samthebest .Se um arquivo em lotes executar um comando do PowerShell, provavelmente capturará o comando Write-Output. Eu tive "longas discussões" com os administradores de sistema sobre o que deveria ser gravado no console e o que não deveria. Agora concordamos que as únicas informações se o script executado com êxito ou tiver que ser morto
Write-Host
precisam ser edificadas e tudo o que o autor do script precisa saber sobre a execução (quais itens foram atualizados, quais campos foram definidos etc.) para saída de gravação. Dessa forma, quando você envia um script ao administrador do sistema, ele poderunthescript.ps1 >someredirectedoutput.txt
ver facilmente na tela, se está tudo bem. Em seguida, envie o "someredirectedoutput.txt" de volta aos desenvolvedores.fonte
Eu acho que o seguinte é uma boa exibição de Echo vs. Write-Host . Observe como test () realmente retorna uma matriz de entradas, e não um único int, como se poderia facilmente acreditar.
Saída do terminal acima:
fonte
$x = test
apenas imprimir123
e não também456
?Você pode usar qualquer um deles em seu cenário, pois eles gravam nos fluxos padrão (saída e erro). Se você estivesse canalizando a saída para outro comando, desejaria usar o Write-Output , que terminará no Write-Host .
Este artigo descreve as diferentes opções de saída: O PowerShell O é para saída
fonte
Magenta pode ser um dos valores do enumerador "System.ConsoleColor" - Preto, Azul escuro, Verde escuro, Verde escuro, Ciano, Vermelho escuro, Magenta escuro, Amarelo escuro, Cinza, Cinza escuro, Azul, Verde, Ciano, Vermelho, Magenta, Amarelo, Branco.
O
+ $File.FullName
é opcional e mostra como colocar uma variável na string.fonte
Você simplesmente não pode fazer com que o PowerShell omita essas novas linhas irritantes. Não há script ou cmdlet que faça isso.
É claro que o Write-Host é um absurdo absoluto, porque você não pode redirecionar / canalizar a partir dele! Você simplesmente tem que escrever o seu:
Por exemplo
fonte
De fato , mas infelizmente , o Windows PowerShell e o PowerShell Core a partir da v7.0 enviam todos os seus 6 (!) Fluxos de saída ao stdout quando chamados de fora , via CLI do PowerShell .
Veja este problema do GitHub para uma discussão sobre esse comportamento problemático, que provavelmente não será corrigido por uma questão de compatibilidade com versões anteriores.
Na prática, isso significa que qualquer fluxo do PowerShell para o qual você envia saída será visto como saída stdout por um chamador externo:
Por exemplo, se você executar o seguinte a partir
cmd.exe
, você verá nenhuma saída, porque o redirecionamento de stdout paraNUL
se aplica igualmente a todos PowerShell córregos:C:\>powershell -noprofile -command "Write-Error error!" >NUL
No entanto - curiosamente - se você redirecionar stderr , PowerShell faz enviar o seu fluxo de erro para stderr , de modo que com
2>
você pode capturar a saída de erro-stream seletivamente; as seguintes saídas apenas'hi'
- a saída do fluxo de sucesso - enquanto capturam a saída do fluxo de erros no arquivoerr.txt
:C:\>powershell -noprofile -command "'hi'; Write-Error error!" 2>err.txt
O comportamento desejável é:
1
do PowerShell (número ) para stdout .Envie a saída de todos os outros fluxos para o stderr , que é a única opção, pois entre os processos existem apenas 2 fluxos de saída - stdout (saída padrão) para dados e stderr (erro padrão) para mensagens de erro e todos os outros tipos de mensagens - como como informações de status - que não são dados .
É aconselhável fazer essa distinção no seu código, mesmo que atualmente não esteja sendo respeitado .
Dentro do PowerShell :
Write-Host
é para saída de exibição e ignora o fluxo de saída de sucesso - como tal, sua saída não pode ser (diretamente) capturada em uma variável, nem suprimida nem redirecionada.Sua intenção original era simplesmente criar feedback do usuário e criar interfaces de usuário simples, baseadas em console (saída colorida).
Devido à incapacidade anterior de ser capturada ou redirecionada, o PowerShell versão 5 foi criado
Write-Host
para o fluxo de informações recém-introduzido (número6
), portanto, desde então, é possível capturar e redirecionar aWrite-Host
saída.Write-Error
destina-se a gravar erros sem finalização no fluxo de erros (número2
); conceitualmente, o fluxo de erros é equivalente a stderr.Write-Output
grava no fluxo de sucesso (saída) (número1
), que é conceitualmente equivalente a stdout; é o fluxo para o qual gravar dados (resultados).Write-Output
raramente é necessário devido ao recurso implícito de saída do PowerShell :Write-Output "Honey, I'm $HOME"
e"Honey, I'm $HOME"
são equivalentes, com o último não apenas sendo mais conciso, mas também mais rápido.fonte