سؤال

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

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

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

هل كانت مفيدة؟

المحلول

وأنت تريد:

dir > a.txt 2>&1

وو2>&1 جملة وتوجيه 2 (ستدير) ل1 (المعياري). يمكنك أيضا إخفاء الرسائل من خلال إعادة توجيه إلى NUL، <وأ href = "https://support.microsoft.com/en-us/help/110930/redirecting-error-messages-from-command-prompt-stderr-stdout" يختلط = "noreferrer"> المزيد من الشرح والأمثلة على MSDN .

نصائح أخرى

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

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

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

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

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

دعم KB MS 110930 .


تحليل من MSKB110930

<اقتباس فقرة>   

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

     

موجز

     

عند إعادة توجيه الإخراج من تطبيق باستخدام رمز '>'، رسائل الخطأ لا تزال الطباعة إلى الشاشة. وذلك لأن كثير من الأحيان يتم إرسال رسائل الخطأ إلى تيار الخطأ القياسي بدلا من تيار ستاندرد خارج.

     

وغالبا ما يتم إرسال الناتج من (موجه الأوامر) تطبيق وحدة التحكم أو الأمر إلى تيارين منفصلة. إرسال الإخراج العادي ستاندرد خارج (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

لإضافة المعياري و stderr إلى ملف السجل العام للبرنامج نصي:

dir >> a.txt 2>&1

وتصحيح، وSTDOUT، إعادة توجيه من قبل 1> أو > التعامل مع ملف 1 لعملية (1 يمكن حذفها، من خلال اتفاقية، مترجم الأوامر [CMD.EXE] يعرف للتعامل مع ذلك). التعامل مع ملف 2 هو STDERR، إعادة توجيه بواسطة 2>.

لاحظ أنه إذا كنت تستخدم هذه لجعل ملفات السجل، ثم ما كنت ترسل outut إلى _uniquely_named_ (مثل التاريخ والوقت ختمها) ملفات السجل، ثم إذا قمت بتشغيل نفس العملية مرتين، وإعادة توجيه والكتابة (استبدال) ملف السجل السابق.

وو>> (إما STDOUT أو STDERR) سيتم إلحاق لا يستبدل الملف. حتى تحصل على ملف السجل التراكمي، showwing النتائج من كل من يدير العملية - عادة أكثر فائدة

ومسارات سعيدة ...

وأنا فقط المفروم من الجواب فيAnders نشره فقط، ولكن ...

من وجهة نظري ويندوز مساعدة، ولقد بحثت في إعادة توجيه (URL <لأ href = "HTTP: // MS-في: C:٪ 5CWINDOWS٪ 5CHelp٪ 5Cntcmds.chm :: /redirection.htm" يختلط = "نوفولو noreferrer" > MS-في: C: \ WINDOWS \ مساعدة \ ntcmds.chm :: / redirection.htm )

ويمكنك أن تقرأ عن >> و| (الأنابيب)، أيضا.

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

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

وA مخصص مسجل حدة الانتاج (مثل "المعياري / ستدير المسجل" من قبل "اللورد مولدر ') قد يكون أكثر موثوقية لهذه المهمة. انظر: مشاريع مفتوحة المصدر مولدر في

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top