Estou executando um servidor a partir de um arquivo em lotes e quero que a saída do servidor seja exibida na tela e também gravada em um arquivo de log. Eu encontrei uma maneira de fazer isso com esta resposta :
powershell "startmyserver | tee server.log"
O problema é que o canal faz com que o primeiro comando seja executado e completamente concluído antes da execução do segundo comando. Isso significa que não consigo monitorar o stdout do meu servidor enquanto ele estiver em execução, e é isso que estou tentando fazer (não quero desligar o servidor apenas para verificar as mensagens de log mais recentes).
Para um exemplo mais simples, tentei pause
. Bem, pause
não existe no Powershell, então tive que executá-lo dentro de um cmd
shell aninhado :
powershell "cmd /c pause | tee test.txt"
Sem surpresa, depois de executar este comando, recebo um cursor piscando. Depois de um tempo, pressiono uma tecla e, em seguida, "Pressione qualquer tecla para continuar" aparece e é gravado no arquivo quase ao mesmo tempo.
O que eu quero que aconteça é o canal para transmitir o stdout linha por linha para o próximo comando. Em outras palavras, sempre que encontrar um caractere EOL, ele deverá enviar alguma saída e isso (no meu caso tee
) fará com que o texto apareça na tela e seja gravado simultaneamente no arquivo. (Na verdade, eu nem me preocupo em saber se o texto está escrito no arquivo linha por linha, ele pode ser escrito no final, embora isso não seja o ideal. Eu só quero poder ver as linhas na tela como estão escritos.)
Isso é possível no prompt de comando e / ou no PowerShell?
fonte
powershell cmd /c pause | tee "test.txt"
está executando o tee no seu contexto atual. Como estou executando isso no cmd (não no ps1), esse comando falhará, comotee
é um comando do PowerShell. se esse comando funcionou para você, presumo que (a) você tenha outrotee
no seu sistema ou (b) você o executou no Powershell. Nenhum dos quais é o meu caso de uso.pause
? I utilizadopause
apenas por conveniência, porque eu não queria um comando que iria encerrar imediatamente e, portanto, torná-lo impossível dizer se as linhas foram transmitidos antes do comando foi concluídoRespostas:
Esse problema é explicado no Stack Overflow como o fato de o PowerShell
Tee-Object
não liberar o fluxo de saída, mas espera apenas pela origem, para que você obtenha a saída no final da operação. Isso ocorre por design.A solução proposta na resposta foi usar este código:
Uma formulação alternativa para tentar se a acima não funcionou é:
Portanto, o comando seria semelhante a:
No meu teste modesto, a saída foi gerada muito rápido para eu ver se isso funcionava como você especificou.
fonte
Add-Content
, em vez deSet-Content