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ń:
- Jak przekierować stderr również do pliku?
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.
- 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.
źródło
Odpowiedzi:
My-Command 2>&1 | Tee-Object 'myfile.log'
. ZobaczyćGet-Help about_Redirection
.Get-Help about_Try_Catch_Finally
. Czy polecenie, które uruchamiasz zewnętrzny program lub skrypt?Tee
może dobrze obsługiwać częściowe łańcuchy, ale inne polecenia cmdlet lubią je,ForEach-Object
a naSelect-Object
pewno nie. Zauważ, żeGet-Content
ma specjalny przełącznik,-ReadCount
który nieco zastępuje to zachowanie, i poważnie zepsuje sięSelect-Object -Skip/-First/-Last/-Unique
poleceniem 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 nazywanyTee-Object
, co powinno ci powiedzieć, z czym dobrze jest pracować. W takim przypadku możesz być dalej, aby uzyskaćtee.exe
z GNU Win32 Utils lub MSYS, które są zaprojektowane do natychmiastowego przesyłania treści.źródło