Próbuję przekierować wszystkie dane wyjściowe (stdout + stderr) systemu DOS polecenia 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 powinienem po prostu przekierować do dwóch osobnych plików?
windows
command-line
cmd
pipe
ripper234
źródło
źródło
Odpowiedzi:
Chcesz:
Składnia
2>&1
przekieruje2
(stderr) na1
(stdout). Możesz także ukryć wiadomości, przekierowując naNUL
, więcej wyjaśnień i przykładów na MSDN .źródło
net stop w3svc >NUL 2>&1
.. dzięki!2> 2.txt
działa (lub2> &1
)2 > 2.txt
nie;2 > &1
nie.Anders Lindahl odpowiedź jest poprawna, ale należy zauważyć, że jeśli przekierowanie stdout do pliku i chcesz przekierować stderr, jak również wtedy należy upewnić się, że
2>&1
jest określona PO z1>
przekierowaniem, inaczej nie zadziała.źródło
dir 2>&1 > a.txt
, najpierw przekierowujesz (>
) strumień 2 (stderr) do strumienia 1 (stdout). Następnie, gdy oba z nich są już połączone, przekierowujesz stdout (>
bez specyfikatora) do pliku. Jeśli chcesz, aby stderr poszedł gdzie indziej, nie możesz najpierw dołączyć do niego ze stdout.Informacje podstawowe z MSKB
Chociaż zaakceptowana odpowiedź na to pytanie jest prawidłowa, tak naprawdę niewiele robi, aby wyjaśnić, dlaczego to działa, a ponieważ składnia nie jest od razu jasna, zrobiłem szybkie google, aby dowiedzieć się, co się właściwie dzieje. W nadziei, że informacje te będą pomocne dla innych, zamieszczam je tutaj.
Zaczerpnięte z MS Support KB 110930 .
Od MSKB110930
źródło
Aby dodać stdout i stderr do ogólnego pliku dziennika skryptu:
źródło
>>
Dopisuje do pliku gdzie>
nadpisuje plik.Prawidłowo, uchwyt pliku 1 dla procesu to STDOUT, przekierowany przez
1>
lub>
(1 można zwyczajowo pominąć, interpreter poleceń [cmd.exe] wie, że to obsługuje). Uchwyt pliku 2 to STDERR, przekierowany przez2>
.Pamiętaj, że jeśli używasz ich do tworzenia plików dziennika, to o ile nie wysyłasz danych wyjściowych do plików dziennika _uniquely_named_ (np. Ze znacznikiem daty i godziny), to jeśli uruchomisz ten sam proces dwukrotnie, przekierowane nadpisze ( zamień) poprzedni plik dziennika.
The
>>
(Dla obu STDOUT i STDERR) nie doda zastąpić plik. Otrzymujesz skumulowany plik dziennika, pokazujący wyniki ze wszystkich przebiegów procesu - zwykle bardziej użyteczny.Wesołe szlaki ...
źródło
Nie ma jednak żadnej gwarancji, że dane wyjściowe
SDTOUT
iSTDERR
są przeplatane linia po linii w odpowiednim czasie, przy użyciuPOSIX
składni scalania przekierowań.Jeśli aplikacja korzysta z buforowanych danych wyjściowych, może się zdarzyć, że tekst jednego strumienia zostanie wstawiony do drugiego na granicy bufora, co może pojawić się na środku wiersza tekstu.
Rejestrator wyjście dedykowane konsoli (Tj
"StdOut/StdErr Logger"
przez'LoRd MuldeR'
) może być bardziej niezawodny w przypadku takiego zadania.Zobacz: Projekty OpenSource MuldeR
źródło
W pliku wsadowym (Windows 7 i wyżej) uznałem tę metodę za najbardziej niezawodną
Oczywiście użyj dowolnych poleceń, a dane wyjściowe zostaną przekierowane do pliku tekstowego. Korzystanie z tej metody jest niezawodne JEDNAK NIE ma wyjścia na ekranie.
źródło
>con echo This goes to screen
Przydatne również do wprowadzania przez użytkownika>con set /p "var="Input: "
Uwaga: te linie pojawią się tylko na ekranie i nie zostaną przekierowane do pliku.