PowerShell i Tee

10

Używam tego polecenia, aby zobaczyć dane wyjściowe zarówno w konsoli, jak i pliku:

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

Nie działa tak dobrze, jak się spodziewałem i mam kilka pytań:

  1. Jak przekierować stderr również do pliku?
  2. Wyjście działa bardzo dziwnie. W przypadku niektórych poleceń istnieje duże opóźnienie między drukowaniem tekstu a aktualizacją konsoli / pliku. W przypadku niektórych innych poleceń dane wyjściowe wydają się być aktualizowane po wydrukowaniu tekstu (uruchamiam polecenia bez tee i wiem, co powinien wydrukować). To opóźnienie sprawia, że ​​ta koszulka jest prawie bezużyteczna - co jeśli wydrukowany zostanie jakiś krytyczny błąd, więc muszę przerwać polecenie, ale nic nie zobaczę, dopóki nie będzie za późno?

    W przypadku niektórych poleceń dane wyjściowe są drukowane dopiero po wykonaniu pełnego polecenia.

  3. Co więcej, nawet jeśli polecenie prosi użytkownika o podanie danych, dane wyjściowe konsoli / pliku są puste! W przypadku tego polecenia wiem, czego się spodziewa i ślepo drukuje potrzebny tekst i zadziałało, ale dla innych - bez wyjścia poczekam, aż coś się wydarzy nieskończenie, podczas gdy polecenie będzie czekać na moje wejście!

Czy są rozwiązania tych problemów? Jeśli nie, to tee w PowerShell jest całkowicie bezużyteczne.

wyścig 1
źródło
Z wahaniem wierzę, że narzędzie używane w tysiącach skryptów jest „całkowicie bezużyteczne” tylko dlatego, że może nie spełniać określonych wymagań.
Stephen Jennings,
Racja, mam na myśli, że w tym konkretnym przypadku jest to bezużyteczne :) Lepiej zostawię tee w spokoju, niż będą miały takie złe problemy.
wyścig1

Odpowiedzi:

7
  1. My-Command 2>&1 | Tee-Object 'myfile.log'. Zobaczyć Get-Help about_Redirection.
  2. Powinieneś wychwytywać błędy, a nie polegać na Ctrl+ C. Zobaczyć Get-Help about_Try_Catch_Finally. Czy polecenie, które uruchamiasz zewnętrzny program lub skrypt?
  3. Jak rozumiem, zazwyczaj obiekty łańcuchowe nie są przesyłane w dół potoku, dopóki nie zostanie osiągnięty znak końca linii. Powód jest dość prosty: gdyby tego nie zrobił, częściowe (przeczytane: niekompletne) ciągi szłyby po rurze. Teemoże dobrze obsługiwać częściowe łańcuchy, ale inne polecenia cmdlet lubią je, ForEach-Objecta na Select-Objectpewno nie. Zauważ, że Get-Contentma specjalny przełącznik, -ReadCountktóry nieco zastępuje to zachowanie, i poważnie zepsuje się Select-Object -Skip/-First/-Last/-Uniquepoleceniem w dalszej części potoku.

Może się zdarzyć, że uruchomione programy zewnętrzne nie będą przestrzegać konwencji, których oczekuje PowerShell. Tee, na przykład, jest poprawnie nazywany Tee-Object, co powinno ci powiedzieć, z czym dobrze jest pracować. W takim przypadku możesz być dalej, aby uzyskać tee.exez GNU Win32 Utils lub MSYS, które są zaprojektowane do natychmiastowego przesyłania treści.

Kawałki bekonu
źródło
1. Dzięki; 2. Zgadza się, miałem na myśli pewne krytyczne nieprzewidziane sytuacje; 3. Nie rozumiem, co jest winne za niekompletne ciągi :) W końcu moje polecenia uruchamiają skrypty w języku Python - są to polecenia w sieci szkieletowej. Próbowałem użyć tee.exe z linux utils skompilowanych dla systemu Windows - ten sam wynik, w niektórych przypadkach brak danych wyjściowych. Czy to oznacza, że ​​moja konkretna konfiguracja i konkretne skrypty w ogóle nie będą dobrze działać z narzędziami tee? Dziękuję Ci.
wyścig1
Wydaje mi się, że skrypt Pythona źle się zachowuje.
Boczek Bity