PowerShell e Tee


9

Uso questo comando per vedere l'output sia nella console che in un file:

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

Non funziona come mi aspettavo e ho alcune domande:

  1. Come reindirizzare stderr anche a un file?
  2. L'output funziona in modo molto strano. Per alcuni comandi c'è un enorme ritardo tra la stampa del testo e l'aggiornamento della console / del file. Per alcuni altri comandi l'output sembra aggiornato quando viene stampato il testo (eseguo i comandi senza tee e so cosa dovrebbe stampare). Questo ritardo rende questa maglietta quasi inutile: cosa succede se verrà stampato un errore critico, quindi devo interrompere il comando, ma non vedrò nulla fino a quando non è troppo tardi?

    Per alcuni comandi l'output viene stampato solo dopo aver eseguito il comando completo.

  3. Inoltre, anche se il comando richiede l'input dell'utente, l'output della console / del file è vuoto! Per quel comando so cosa si aspetta e stampa ciecamente il testo necessario e ha funzionato, ma per gli altri - senza output aspetterò che accada all'infinito mentre il comando attenderà il mio input!

Ci sono soluzioni per questi problemi? In caso contrario, questa cosa tee in PowerShell è completamente inutile.


Sono titubante nel ritenere che uno strumento utilizzato in migliaia di script sia "completamente inutile" solo perché potrebbe non soddisfare i tuoi requisiti specifici.
Stephen Jennings,

Bene, intendo dire che in questo caso particolare è inutile :) Meglio lasciare solo la maglietta, che avrà problemi così gravi.
gara 1

Risposte:


7
  1. My-Command 2>&1 | Tee-Object 'myfile.log'. Vedere Get-Help about_Redirection.
  2. Dovresti intercettare errori, non fare affidamento su Ctrl+ C. Vedere Get-Help about_Try_Catch_Finally. Il comando che stai eseguendo è un programma esterno o uno script?
  3. A quanto ho capito, in genere gli oggetti stringa non vengono inviati nella pipe fino a quando non viene raggiunto un carattere di fine riga. Il motivo è abbastanza semplice: se non lo facesse, le stringhe parziali (leggi: incomplete) andrebbero giù nel tubo. Teepotrebbe gestire bene le stringhe parziali, ma altri cmdlet gradiscono ForEach-Objecto Select-Objectsicuramente no. Nota che Get-Contentha un interruttore speciale -ReadCountche in qualche modo sovrascrive questo comportamento e rovinerà seriamente un Select-Object -Skip/-First/-Last/-Uniquecomando più in basso nella pipe.

È molto probabile che i programmi esterni in esecuzione non obbediscano alle convenzioni che PowerShell si aspetta. Tee, ad esempio, viene correttamente chiamato Tee-Object, il che dovrebbe dirti il ​​tipo di cose con cui è bravo a lavorare. In tal caso, potresti essere più in là per ottenere tee.exeda GNU Win32 Utils o MSYS che sono progettati per l'inoltro immediato del contenuto.


1. Grazie; 2. Corretto, intendevo alcune situazioni critiche impreviste; 3. Non capisco cosa sia colpevole di stringhe incomplete :) Alla fine i miei comandi eseguono script Python: sono comandi fabric. Ho provato ad usare tee.exe dai programmi di utilità di Linux compilati per Windows - lo stesso risultato, nessun output in alcuni casi. Ciò significa che la mia configurazione concreta e gli script concreti non funzioneranno affatto bene con le utility Tee? Grazie.
gara 1

Mi sembra che la sceneggiatura di Python si stia comportando male.
Pezzi di pancetta
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.