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?
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 .
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 >>
.
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
(Gdziefile.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
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
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...
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).
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
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