Perguntas sobre a Tee PowerShell

8

Eu uso este comando para ver a saída no console e no 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 redirecionar o stderr também para o arquivo?
  2. A saída funciona muito estranha. Para alguns comandos, há um enorme atraso entre o texto ser impresso e o console / arquivo ser 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). Este atraso torna este tee quase inútil - e se algum erro crítico for impresso, então eu preciso parar o comando, mas não vou ver nada até que seja tarde demais. Para alguns comandos, a saída é impressa somente após o comando completo ser feito.
  3. Além disso, mesmo se o comando solicitar entrada do usuário, a saída do arquivo / console estará vazia! Para esse comando eu sei o que ele espera e imprimo cegamente o texto necessário e ele funcionou, mas para outros - sem saída eu vou esperar que algo aconteça infinitamente enquanto o comando espera minha entrada!

Existem soluções para esses problemas? Se não, esta camiseta no Powershell é completamente inútil.

    
por race1 20.04.2011 / 07:57

1 resposta

6

  1. %código%. Veja My-Command 2>&1 | Tee-Object 'myfile.log' .
  2. Você deve estar trapping erros, não confiando em Ctrl + C . Veja Get-Help about_Redirection . O comando está executando um programa externo ou um script?
  3. Pelo que entendi, normalmente os objetos string não são enviados pelo pipe até que um caractere de fim-de-linha seja alcançado. A razão é bem simples: se não fizesse isso, seqüências parciais (lidas: incompletas) iriam pelo cano. Get-Help about_Try_Catch_Finally pode manipular cadeias parciais, mas outros cmdlets como Tee ou ForEach-Object certamente não. Note que Select-Object tem um comutador especial Get-Content que, de alguma forma, sobrescreve este comportamento, e irá mexer seriamente com o comando -ReadCount mais abaixo no canal.

É muito provável que os programas externos que você está executando não obedeçam às convenções que o PowerShell está esperando. Select-Object -Skip/-First/-Last/-Unique , por exemplo, é apropriadamente chamado de Tee , que deve informar os tipos de coisas com as quais é bom trabalhar. Nesse caso, você pode estar mais longe na linha para obter Tee-Object de GNU Win32 Utils ou MSYS que são projetados para encaminhamento imediato de conteúdo.

    
por 20.04.2011 / 08:37