Przekierowanie Windows cmd stdout i stderr do jednego pliku

Próbuję przekierować wszystkie wyjścia (stdout + stderr) DOS do jednego pliku:

C:\>dir 1> a.txt 2> a.txt
The process cannot access the file because it is being used by another process.

Czy to możliwe, Czy mam po prostu przekierować do dwóch oddzielnych plików?

Author: davidism, 2009-09-14

7 answers

Chcesz:

dir > a.txt 2>&1

Składnia 2>&1 przekieruje 2 (stderr) do 1 (stdout). Możesz także ukryć wiadomości, przekierowując do NUL, więcej wyjaśnień i przykładów na MSDN .

 893
Author: Anders Lindahl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-19 10:26:36

Odpowiedź Andersa Lindahla jest poprawna, ale należy zauważyć, że jeśli przekierowujesz stdout do pliku i chcesz przekierować stderr, musisz upewnić się, że 2>&1 jest określone po przekierowaniu 1>, w przeciwnym razie nie zadziała.

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt

Poprawny sposób: dir > a.txt 2>&1. Aby dodać, użyj >>.

 171
Author: DelboyJay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-19 09:53:23

Informacje podstawowe z MSKB

Chociaż przyjęta odpowiedź na to pytanie jest poprawna, to naprawdę nie robi wiele, aby wyjaśnić Dlaczego to działa, a ponieważ składnia nie jest od razu jasna, zrobiłem szybkie google, aby dowiedzieć się, co tak naprawdę się dzieje. W nadziei, że te informacje będą pomocne dla innych, zamieszczam je tutaj.

Zaczerpnięte z MS Support KB 110930 .


Od MSKB110930

Przekierowywanie Komunikatów O Błędach z wiersza polecenia: STDERR / STDOUT

Podsumowanie

Podczas przekierowywania wyjścia z aplikacji za pomocą symbolu " > " komunikaty o błędach są nadal wyświetlane na ekranie. Dzieje się tak, ponieważ komunikaty o błędach są często wysyłane do standardowego strumienia błędów zamiast standardowego strumienia wyjściowego.

Wyjście z konsoli (Wiersz polecenia) jest często wysyłane do dwóch oddzielnych strumieni. Standardowe wyjście jest wysyłane do standardowego wyjścia (STDOUT) i wysyłane są komunikaty o błędach do błędu standardowego (STDERR). Przekierowanie wyjścia konsoli za pomocą symbolu " > " powoduje jedynie przekierowanie wyjścia standardowego. Aby przekierować STDERR, musisz podać "2>" dla symbolu przekierowania. To wybiera drugi strumień wyjściowy, którym jest STDERR.

Przykład

Polecenie dir file.xxx (Gdzie file.xxx nie istnieje) wyświetli następujące wyjście:

Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876

File Not Found

Jeśli przekierujesz wyjście na urządzenie NUL za pomocą dir file.xxx > nul, nadal zobaczysz komunikat o błędzie część wyjścia, jak to:

File Not Found

Aby przekierować (tylko) komunikat o błędzie do NUL, Użyj następującego polecenia:

dir file.xxx 2> nul

Lub, można przekierować wyjście do jednego miejsca, a błędy do innego.

dir file.xxx > output.msg 2> output.err

Możesz wydrukować błędy i standardowe wyjście do pojedynczego pliku za pomocą polecenia "&1", aby przekierować wyjście dla STDERR na STDOUT, a następnie wysłać wyjście ze STDOUT do pliku:

dir file.xxx 1> output.msg 2>&1
 72
Author: StormeHawke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-21 13:08:11

Aby dodać stdout i stderr do ogólnego pliku dziennika skryptu:

dir >> a.txt 2>&1
 22
Author: Henk Wiersema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-22 14:24:05

Poprawnie, uchwyt pliku 1 dla procesu to STDOUT, przekierowany przez 1> lub przez > (1 może być pominięty, przez Konwencję, interpreter poleceń [cmd.exe] wie, jak sobie z tym poradzić). Uchwyt pliku 2 to STDERR, przekierowany przez 2>.

Zauważ, że jeśli używasz ich do tworzenia plików logów, to chyba że wysyłasz outut do _uniquely_named_ (np. z oznaczeniem daty i godziny) plików logów, to jeśli uruchomisz ten sam proces dwa razy, przekierowany zastąpi (zastąpi) poprzedni dziennik plik.

>> (dla STDOUT lub STDERR) dopisze plik nie zastępując go. Otrzymujesz więc skumulowany plik dziennika, pokazujący wyniki ze wszystkich przebiegów procesu-zazwyczaj bardziej użyteczny.

Happy trails...

 12
Author: Max Vitesse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-06 04:48:24

Po prostu wyciąłem odpowiedź, jak @Anders właśnie ją opublikował, ale...

Z mojej pomocy Windows, szukałem na przekierowanie (URL ms-its: C: \ WINDOWS \ Help \ ntcmds.chm:: / przekierowanie.htm ).

Możesz też poczytać o > > i | (pipe).

 4
Author: ericp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-09 19:40:20

Nie ma jednak gwarancji, że wyjście SDTOUT i STDERR będzie przeplatane linia po linii w odpowiednim czasie, używając składni POSIX redirect merge.

Jeśli aplikacja korzysta z buforowanego wyjścia, może się zdarzyć, że tekst jednego strumienia zostanie wstawiony do drugiego na granicy bufora, która może pojawić się w środku linii tekstu.

Dedykowany rejestrator wyjścia konsoli (jak "StdOut / stderr Logger" Lorda Muldera) może być bardziej niezawodny do takiego zadania. Zobacz też: MuldeR ' s opensource Projects

 0
Author: LigH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-27 13:30:10