Windows cmd stdout ve stderr'i tek bir dosyaya yeniden yönlendirin


688

Bir DOS komutunun tüm çıktısını (stdout + stderr) tek bir dosyaya yönlendirmeye çalışıyorum :

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

Mümkün mü yoksa iki ayrı dosyaya mı yönlendirmeliyim?


14
TechNet: Komut yeniden yönlendirme işleçlerini kullanma (bunu buradaki yanıtlardan daha iyi yanıtlar).
Martin Prikryl

1
2> & 1 aynı dosyayı yeniden
Luke

Yanıtlar:


1090

İstediğiniz:

dir > a.txt 2>&1

Sözdizimi (stderr) öğesini (stdout) konumuna 2>&1yönlendirir . Ayrıca MSDN'de yönlendirerek , daha fazla açıklama ve örnek vererek iletileri gizleyebilirsiniz .21NUL


32
bunun için teşekkürler, bu unix kabuk sözdiziminin DOS için de çalıştığını bilmiyordum!
chaindriver

20
Bu tüm çıktıları gizlemek için harika .. net stop w3svc >NUL 2>&1.. teşekkürler!
wasatchwizard

3
@wasatchwizard Ithink Bununla ilgili sorunum vardı, ama> NUL 2> NUL iyi çalıştı
FrinkTheBrave

13
Bir Tutamaç varsa, Tutamaç (yani 2) ile yönlendirme operatörü (yani>) arasında boşluk olamaz. Bu nedenle 2> 2.txtçalışır (veya 2> &1) 2 > 2.txtyapmaz; 2 > &1değil.
Kırmızı Bezelye

9
Ben çok seviyorum. "Ah, bu küçük bir defalık problem bir saat kadar sürecek". Bu yorumu yazmak bu cevabı bulmaktan daha uzun sürdü.
Brandon

195

Anders Lindahl cevabı doğrudur, ancak unutulmamalıdır bir dosyaya stdout'u yönlendirme ve iyi o zaman emin GEREKİR olarak stderr'yi yönlendirmek istiyorum eğer o 2>&1belirtilirse SONRA1> , yönlendirme aksi takdirde iş olmaz.

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

10
SONRAKİ Neyin yanlış olduğunu anlamak için saatlerime mal olan DelboyJay! Teşekkür ederim!
Nam G VU

4
Neden 2> & 1'in 1> önüne konmasının amaçlanan etkiyi elde edemeyeceği herhangi bir yerde açıklanıyor mu? Bunun "cmd" nin, yeniden yönlendirmeyi belirttiğiniz sıraya bağlı olarak iki farklı anlam veren komutları ayrıştırma şekliyle ilgili olduğundan şüpheleniyorum. Ama semantik kurallar herhangi bir yerde belgeleniyor, çünkü bunun saatlerce harcanabileceği için öğrenmeye değer bir şey olduğunu düşünüyorum.
igbgotiz

12
@ igbgotiz 2> & 1 'akış 2'yi akış 1'e yönlendir' anlamına gelir. Bu yüzden önce akış 1'i ayarlamanız gerekir
FrinkTheBrave

3
@FrinkTheBrave ancak akış 1, açıkça belirtilmezse standart çıktıdır (örn. Konsol). Bu hala açıklamıyor imho.
MarioDS

1
@MDeSchaepmeester, eğer öyleyse, dir 2>&1 > a.txtönce >akış 2'yi (stderr) akış 1'e (stdout) yönlendirirsiniz. Ardından, her ikisi de zaten birleştirildikten sonra, stdout'u ( >belirteç olmadan) dosyaya yönlendiriyorsunuz. Stderr'ın başka bir yere gitmesini istiyorsanız, önce stdout ile katılamazsınız.
cp.engr

80

MSKB'den arka plan bilgisi

Bu soruya kabul edilen cevap doğru olsa da, neden işe yaradığını açıklamak için çok fazla bir şey yapmıyor ve sözdizimi hemen net olmadığından, neler olup bittiğini öğrenmek için hızlı bir google yaptım. Bu bilgilerin başkalarına yardımcı olması umuduyla, burada paylaşıyorum.

Alındığı MS Destek KB 110930 .


Gönderen MSKB110930

Hata Mesajlarını Komut İsteminden Yeniden Yönlendirme: STDERR / STDOUT

özet

'>' Sembolünü kullanarak bir uygulamadan çıktıyı yeniden yönlendirirken, hata mesajları yine de ekrana yazdırılır. Bunun nedeni, hata iletilerinin genellikle Standart Çıkış akışı yerine Standart Hata akışına gönderilmesidir.

Bir konsol (Komut İstemi) uygulamasından veya komutundan çıktı genellikle iki ayrı akışa gönderilir. Normal çıkış Standart Çıkış (STDOUT) 'a ve hata mesajları Standart Hata (STDERR)' a gönderilir. Konsol çıkışını ">" simgesini kullanarak yeniden yönlendirdiğinizde, yalnızca STDOUT'u yeniden yönlendirirsiniz. STDERR'ı yeniden yönlendirmek için yönlendirme sembolü için '2>' belirtmeniz gerekir. Bu, STDERR olan ikinci çıkış akımını seçer.

Misal

Komut dir file.xxx( file.xxxmevcut olmayan yerlerde) aşağıdaki çıktıyı görüntüler:

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

File Not Found

Çıkışı NULkullanarak cihaza yeniden yönlendirirseniz, dir file.xxx > nulyine de çıkışın hata mesajı kısmını göreceksiniz:

File Not Found

Hata iletisini adresine (yalnızca) yönlendirmek NULiçin aşağıdaki komutu kullanın:

dir file.xxx 2> nul

Veya çıktıyı bir yere, hataları başka bir yere yönlendirebilirsiniz.

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

"& 1" komutunu kullanarak çıktıyı STDERR'a STDOUT'a yönlendirmek ve daha sonra çıktıyı STDOUT'tan bir dosyaya göndermek için hataları ve standart çıktıyı tek bir dosyaya yazdırabilirsiniz:

dir file.xxx 1> output.msg 2>&1

29

Bir komut dosyasının genel günlük dosyasına stdout ve stderr eklemek için:

dir >> a.txt 2>&1

9
>>Dosyaya ekler >dosyanın üzerine yazar.
delliottg

13

Doğru, işlem için dosya tanıtıcısı 1 STDOUT, tarafından 1>veya tarafından yeniden yönlendirilir >(1, kural olarak, komut yorumlayıcısı [cmd.exe] bunu işlemek için bilir). Dosya tanıtıcısı 2 STDERR, tarafından yönlendirilir 2>.

Bunları günlük dosyaları yapmak için kullanıyorsanız, çıktıyı _uniquely_named_ (örneğin tarih ve saat damgalı) günlük dosyalarına göndermediğiniz sürece, aynı işlemi iki kez çalıştırırsanız, yeniden yönlendirilenin üzerine yazılır ( değiştirin).

>>(STDOUT veya STDERR biri için) APPEND dosyayı DEĞİŞTİR olmayacaktır. Böylece, sürecin tüm çalışmalarından elde edilen sonuçları gösteren toplu bir günlük dosyası elde edersiniz - genellikle daha kullanışlıdır.

Mutlu yollar ...


2

Bununla birlikte, yeniden yönlendirme birleştirme sözdizimi kullanılarak çıktıların satır sıra satırlar halinde zamanlanmış SDTOUTve STDERRiç içe geçme garantisi yoktur POSIX.

Bir uygulama arabelleğe alınmış çıktı kullanıyorsa, bir akışın metninin diğerine metin satırının ortasında görünebilecek bir tampon sınırına eklenmesi olabilir.

Özel bir konsol çıkış günlüğü (yani "StdOut/StdErr Logger"by 'LoRd MuldeR') böyle bir görev için daha güvenilir olabilir.

Bakınız: MuldeR'nin Açık Kaynak Projeleri


0

Bir toplu iş dosyasında (Windows 7 ve üstü) bu yöntemi en güvenilir buldum

Call :logging >"C:\Temp\NAME_Your_Log_File.txt" 2>&1
:logging
TITLE "Logging Commands"
ECHO "Read this output in your log file"
ECHO ..
Prompt $_
COLOR 0F

Açıkçası, istediğiniz komutları kullanın ve çıktı metin dosyasına yönlendirilecektir. Bu yöntemi kullanarak bir ANCAK ekranda NO çıkış yoktur güvenilir.


(temelde aynı cevabı yıl önce bir kaç kez verilen.) Sen ile ekrana çıktı zorlayabilir >con echo This goes to screenkullanıcı girişi için de yararlıdır >con set /p "var="Input: "Not: Bu satırları olacak sadece ekranda görünen ve olmayan dosyaya yönlendirilebilir.
Stephan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.