إعادة توجيه Windows cmd stdout و stderr إلى ملف واحد




command-line pipe (5)

أحاول إعادة توجيه كل الإخراج (stdout + stderr) لأمر DOS إلى ملف واحد:

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

هل من الممكن ، أم يجب فقط إعادة توجيه إلى ملفين منفصلين؟


معلومات الخلفية من MSKB

في حين أن الإجابة المقبولة على هذا السؤال صحيحة ، إلا أنها في الواقع لا تفعل الكثير لتفسير سبب نجاحها ، وبما أن بناء الجملة ليس واضحًا على الفور ، فقد أجريت بحثًا سريعًا في google لاكتشاف ما يحدث في الواقع. على أمل أن تكون هذه المعلومات مفيدة للآخرين ، فأنا نشرها هنا.

مأخوذ من MS Support KB 110930 .

من MSKB110930

إعادة توجيه رسائل الخطأ من موجه الأوامر: STDERR / STDOUT

ملخص

عند إعادة توجيه الإخراج من تطبيق ما باستخدام الرمز ">" ، لا تزال رسائل الخطأ تطبع على الشاشة. ويرجع ذلك إلى أن رسائل الخطأ غالبًا ما يتم إرسالها إلى دفق الخطأ القياسي بدلاً من دفق Out Standard.

غالبًا ما يتم إرسال الإخراج من تطبيق وحدة التحكم (موجه الأوامر) أو الأمر إلى قسمين منفصلين. يتم إرسال الإخراج العادي إلى قياسي خارج (STDOUT) ويتم إرسال رسائل الخطأ إلى خطأ قياسي (STDERR). عند إعادة توجيه إخراج وحدة التحكم باستخدام الرمز ">" ، فأنت تقوم فقط بإعادة توجيه STDOUT. لإعادة توجيه STDERR ، يجب تحديد "2>" لرمز إعادة التوجيه. هذا يحدد تيار الإخراج الثاني وهو STDERR.

مثال

سيعرض الأمر dir file.xxx (حيث file.xxx غير موجود) الإخراج التالي:

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

File Not Found

إذا قمت بإعادة توجيه الإخراج إلى جهاز NUL باستخدام dir file.xxx > nul ، فستظل ترى جزء رسالة الخطأ من الإخراج ، كما يلي:

File Not Found

لإعادة توجيه (فقط) رسالة الخطأ إلى NUL ، استخدم الأمر التالي:

dir file.xxx 2> nul

أو ، يمكنك إعادة توجيه الإخراج إلى مكان واحد ، والأخطاء إلى مكان آخر.

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

يمكنك طباعة الأخطاء والمخرجات القياسية إلى ملف واحد باستخدام الأمر "& 1" لإعادة توجيه الإخراج لـ STDERR إلى STDOUT ثم إرسال الإخراج من STDOUT إلى ملف:

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



جواب Anders Lindahl صحيح ، ولكن تجدر الإشارة إلى أنه إذا كنت تعيد توجيه المعيار إلى ملف وتريد إعادة توجيه stderr أيضًا ، فيجب عليك التأكد من أن 2>&1 تم تحديده بعد 1> إعادة التوجيه ، وإلا فإنه لن يعمل.

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

الطريقة الصحيحة: dir > a.txt 2>&1 . لإلحاق ، استخدم >> .


ومع ذلك ، لا يوجد أي ضمان بأن مخرجات SDTOUT و STDERR متداخلة مع بعضها البعض في الوقت المناسب ، وذلك باستخدام بنية دمج إعادة التوجيه POSIX.

إذا كان التطبيق يستخدم مخزناً ، قد يحدث أن يتم إدخال نص دفق واحد في الآخر عند حد المخزن المؤقت ، والذي قد يظهر في منتصف سطر النص.

قد يكون مسجل إخراج وحدة التحكم مخصص (مثل "StdOut / StdErr Logger" بواسطة 'LoRd MuldeR') أكثر موثوقية لمثل هذه المهمة. انظر: MuldeR's OpenSource Projects





pipe