PowerShell e Tee


9

Eu uso este comando para ver a saída no console e em um arquivo:

powershell -command "my_command_1 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"  
powershell -command "my_command_2 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"
# etc

Não funciona tão bem quanto eu esperava e tenho algumas perguntas:

  1. Como redireciono o stderr também para um arquivo?
  2. A saída funciona muito estranha. Para alguns comandos, existe um grande atraso entre o texto impresso e o console / arquivo atualizado. Para alguns outros comandos, a saída parece atualizada quando o texto é impresso (eu executo comandos sem tee e sei o que deve ser impresso). Esse atraso torna esse tee quase inútil - e se algum erro crítico for impresso para que eu precise interromper o comando, mas não veja nada até que seja tarde demais?

    Para alguns comandos, a saída é impressa somente após a conclusão do comando completo.

  3. Além disso, mesmo que o comando solicite a entrada do usuário, a saída do console / arquivo está vazia! Para esse comando, eu sei o que ele espera e imprime cegamente o texto necessário e funcionou, mas para outros - sem saída, esperarei que algo aconteça infinitamente enquanto o comando aguardará minha entrada!

Existem soluções para esses problemas? Caso contrário, esse item no PowerShell é completamente inútil.


Hesito em acreditar que uma ferramenta usada em milhares de scripts é "completamente inútil" apenas porque pode não atender aos seus requisitos específicos.
Stephen Jennings

Certo, quero dizer, é inútil nesse caso em particular :) É melhor deixar a camiseta em paz, do que ter problemas tão ruins.
precisa saber é o seguinte

Respostas:


7
  1. My-Command 2>&1 | Tee-Object 'myfile.log'. Veja Get-Help about_Redirection.
  2. Você deve capturar erros, sem depender do Ctrl+ C. Veja Get-Help about_Try_Catch_Finally. O comando que você está executando é um programa externo ou um script?
  3. Pelo que entendi, normalmente os objetos de seqüência de caracteres não são enviados pelo canal até que um caractere de fim de linha seja atingido. O motivo é bastante simples: se não fizesse isso, seqüências parciais (leia-se: incompletas) iriam para o cano. Teepode lidar bem com seqüências parciais, mas outros cmdlets como ForEach-Objectou Select-Objectcertamente não. Observe que Get-Contentpossui uma opção especial -ReadCountque, de certa forma, substitui esse comportamento e interfere seriamente em um Select-Object -Skip/-First/-Last/-Uniquecomando mais abaixo no canal.

Pode muito bem ser que os programas externos que você está executando não obedeçam às convenções que o PowerShell espera. Tee, por exemplo, é chamado corretamente Tee-Object, o que deve indicar os tipos de coisas com as quais é bom trabalhar. Nesse caso, você pode ser mais ao longo da linha para obter tee.exea partir GNU Win32 Utils ou MSYS que são projetados para encaminhar imediatamente o conteúdo.


1. obrigado; 2. Correto, eu quis dizer algumas situações críticas imprevistas; 3. Não entendo o que é culpado por seqüências incompletas :) Eventualmente, meus comandos executam scripts Python - são comandos de malha. Eu tentei usar o tee.exe dos utilitários Linux compilados para Windows - o mesmo resultado, sem saída em alguns casos. Isso significa que minha configuração e scripts concretos não funcionarão bem com os utilitários de tee? Obrigado.
precisa saber é o seguinte

Parece-me que o script python está se comportando mal.
Bacon Bits
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.