دوره‌ های آموزشی نووا
فوریه 15, 2021

ورودی ها و خروجی های بچ اسکریپت

Avatar photo
برنامه نویس MERN Stack
ورودی ها و خروجی های بچ اسکریپت

یکی از مهمترین مباحث بچ اسکریپت ورودی ها و خروجی ها (I/O) استاندارد است. به طور کلی سه نوع I/O در Batch Script وجود دارد که در ادامه به آنها پرداخته ام. در مقاله آشنایی با ورودی ها و خروجی های بچ اسکریپت همراه با نووا بلاگ باشید.

  1. ورودی های استاندارد یا Standard Input که به اختصار STDIN هم گفته میشود. هر آنچه که شما با کیبورد تایپ میکنید جزو STDIN محسوب میشود. یعنی وارد شده های شما توسط کیبورد.
  2. خروجی استاندارد یا Standard Output که به اختصار STDOUT گفته میشود. هر آنچه که با کیبورد وارد نموده اید و توسط مانیتور نمایش داده میشود را STDOUT میگویند. در واقع آنچه را که از مانیتور به عنوان خروجی میبینید STDOUT گفته میشود.
  3. خروجی خطا یا Standard Error که به اختصار STDERR هم گفته میشود. STDERR هم دقیقا همانند STDOUT است با این تفاوت که به صورت مستقل برای نمایش خطا مورد استفاده قرار میگیرد.

هر کدام از سه استاندارد ذکر شده دارای یک کد انحصاری برای خود میباشند. استاندارد STDIN با کد 0 مرجع شده استاندارد STDOUT با کد 1 مرجع شده و استاندارد STDERR با کد 2 مرجع شده است.

نام کامل استانداردنام مختصر استانداردکد استاندارد
Standard InputSTDIN0
Standard OutputSTDOUT1
Standard ErrorSTDERR2

سوال: کاربرد I/O های استاندار در فایل Batch چیست؟ به طور کلی استاندارد های ورودی و خروجی کاربرد زیادی در ساخت فایل Batch دارند یکی از این کاربرد ها ذخیره نتایج دستورات در فایلهای متنی برای ایجاد فایل LOG است، و یا انتقال نتایج یک دستور به دستور دیگر که به آن عمل Piping نیز گفته میشود.

تغییر مسیر یا Redirection

همانطور که گفتم یکی از کارهای عمومی در فایلهای Batch ارسال خروجی برنامه ها و دستورات به فایلهای متنی میباشد. شما به سادگی میتوانید با علامت > خروجی دستورات و برنامه ها را که STDOUT یا STDERR است را به یک مسیر دیگر ارسال کنید. برای مثال:

DIR >DIRLIST.TXT

همانطور که میدانید دستور DIR فهرستی از فایلها و پوشه های موجود را در CMD به نمایش میگذارد اما با اضافه شدن علامت > بجای نمایش این فهرست در CMD نتایج دستور DIR به مکان دیگری منتقل میشود که در مثال بالا به یک فایل متنی با نام DIRLIST.TXT منتقل شده است.

نکته: در صورتی که فایل DIRLIST.TXT از قبل وجود داشته باشد، این فایل بازنویسی خواهد شد در غیر اینصورت فایل DIRLIST.TXT ساخته میشود. اما در صورتی که نخواهید فایل مورد نظر شما بازنویسی شود باید بجای یک علامت > از دو علامت >> استفاده کنید. تا خروجی های جدید به فایل DIRLIST.TXT اضافه شوند. برای مثال:

DIR >>DIRLIST.TXT

به صورت پیشفرض با استفاده از اپراتور های > و >> خروجی STDOUT ارسال میشود. اما برای ارسال STDERR میتوانید از عدد مرجع آن استفاده کنید. برای مثال:

DIR DOCUMENT.TXT 2>DIRLIST.TXT

برای ارسال STDOUT و STDERR به دو فایل جداگانه دستور به شکل زیر میشود:

DIR DOCUMENT.TXT > DIRLIST.TXT 2>DIRERR.TXT

برای ارسال هر دو استاندارد STDERR و STDOUT به یک فایل میتوانید از دستور زیر استفاده کنید:

DIR DOCUMENT.TXT > DIRLIST.TXT 2>&1

تا اینجا از علامت های > و >> برای خروجی گرفتن از دستورات استفاده شده اما برای ورودی گرفتن یا STDIN باید از علامت < استفاده کنید. در واقع بجای ورودی گرفتن از کیبورد میتوانید از یک فایل متنی با علامت < ورودی بگیرید. به مثال زیر توجه کنید:

SORT < DIRLIST.TXT

در مثال بالا دستور SORT ورودی یا STDIN خود را از فایل متنی DIRTLIST.TXT دریافت میکند.

سرکوب نمودن خروجی برنامه ها

شما به سادگی میتوانید خروجی برنامه ها را سرکوب کنید یا از بین ببرید. یعنی نه خروجی از مانیتور نمایش داده شود نه به فایل خاصی منتقل شود. برای سرکوب نمودن خروجی برنامه ها باید از علامت > به همراه کلمه NUL استفاده کنید. به مثال زیر توجه کنید:

PING 4.2.2.4 >NUL

در دستور بالا فرایند Ping گرفتن از آدرس 4.2.2.4 انجام میشود اما هیچ خروجی از آن نمایش داده نمیشود.

انتقال خروجی یک برنامه به ورودی یک برنامه دیگر

یکی دیگر از ویژگیهای که در CMD و فایلهای Batch وجود دارد انتقال STDOUT یک برنامه به STDIN یک برنامه دیگر میباشد. مثلا شما میتوانید خروجی برنامه DIR را به صورت مستقیم به برنامه More ارسال کنید. تا بتوانید نتایج دستور DIR را به درستی و به اندازه صفحه خط فرمان مشاهده کنید. برای انتقال STDOUT به STDIN باید از علامت | استفاده کنید. به مثال زیر توجه کنید:

DIR /S | MORE

به فرایند انتقال خروجی یک برنامه (STDOUT) به ورودی یک برنامه (STDIN) دیگر Piping گفته میشود.

عمل Piping در CMD و فایل Batch محدود به یک بار استفاده در یک خط نمیباشد یعنی شما میتوانید در یک خط چندین بار عمل Piping را انجام دهید تا نتایج مطلوب تری را از دستور دریافت کنید. به مثال زیر توجه کنید:

DIR /A /S C:\ | FIND /I "DISPLAY" | MORE

در سطر بالا گفته شده ابتدا دستور DIR فهرستی از کلیه فایلهای درایو C:\ درست کند سپس با علامت Pipe مشخص شده نتایج دستور DIR باید به دستور Find منتقل شوند تا دستور Find به دنبال کلمه Display بگردد سپس دوبار با علامت Pipe گفته شده نتایج دستور Find باید به دستور More منتقل شوند تا دستور More به اندازه سایز صفحه CMD نتایج را نمایش دهد.

جدا از اینکه میتوانید چندین بار از عمل Piping در یک خط استفاده کنید میتوانید بعد از عمل Piping از عمل Redirection هم استفاده کنید. برای مثال به دستور زیر توجه کنید:

DIR /A /S C:\ | FIND /I "DISPLAY" > REVERSLIST.TXT

ساخت فایل متن با ورودی CON

شما به سادگی میتوانید با ارسال STDIN کیبورد به STDIN برنامه CMD که CON نام دارد یک فایل متنی بسازید. برای مثال:

TYPE CON > Documents.txt
Hello World

پس از نوشتن محتوای خود با فشردن کلید F6 و زدن کلید Enter خروجی برنامه خود را در فایل متنی Documents.txt ذخیره کنید.

مثال اول: ارسال STDOUT به یک فایل متن

در این اسکریپت قصد دارم کلیه خروجی ها را به یک فایل متنی با نام STDOUT.TXT ارسال کنم.

@ECHO OFF
 TITLE STANDARD OUTPUT
 COLOR 0A
 CD /D %~DP0
 MODE CON COLS=80 LINES=25
 ECHO HELLO > STDOUT.TXT
 ECHO ITS A TEXT MESSAGE >> STDOUT.TXT
 ECHO WOULD YOU KNOW HOW MANY FILE WAS THERE? >> STDOUT.TXT
 ECHO ------------------------------------------------------------------------------------------------------------------------ >>STDOUT.TXT
 DIR >> STDOUT.TXT
 ECHO ------------------------------------------------------------------------------------------------------------------------ >>STDOUT.TXT
 ECHO AND WOULD YOU SEE SYSTEM INFORMATION? >> STDOUT.TXT
 ECHO ------------------------------------------------------------------------------------------------------------------------ >>STDOUT.TXT
 SYSTEMINFO >> STDOUT.TXT
 ECHO ------------------------------------------------------------------------------------------------------------------------ >>STDOUT.TXT
 ECHO WHAT IS YOUR IP ADDRESS? >> STDOUT.TXT
 ECHO ------------------------------------------------------------------------------------------------------------------------ >>STDOUT.TXT
 IPCONFIG >> STDOUT.TXT
 ECHO ------------------------------------------------------------------------------------------------------------------------ >>STDOUT.TXT
 ECHO WOULD YOU SEE LIST OF USERS? >> STDOUT.TXT
 ECHO ------------------------------------------------------------------------------------------------------------------------ >>STDOUT.TXT
 NET USER >> STDOUT.TXT
 ECHO ------------------------------------------------------------------------------------------------------------------------ >>STDOUT.TXT 

15 پاسخ به “ورودی ها و خروجی های بچ اسکریپت”

  1. Avatar photo alireza گفت:

    سلام…
    مرسی از اطلاعات خوبی که تو سایتتون گذاشتید..
    یه سوال داشتم
    وقتی بصورت sort شده dir میگیرم میخوام فقط ۵تا فایل اخر رو نشون بده
    میشه راهنماییم کنید؟

    • سلام
      چنین کاری فقط از پس سیستم عامل لینوکس بر میاد. (دستور tail و دستور head)
      متاسفانه در ویندوز دستوری مثل tail نداریم که باهاش تعداد مشخصی از آخرین خطوط رو مشاهده کنید.
      اما فکر میکنم بشه چنین دستوری رو با دستور for درست کرد.

  2. Avatar photo alireza گفت:

    میشه بگین چجوری؟

    • باید یک فایل Bat درست کنید مثلا با نام tail.bat
      بعد دو تا Argument برای این فایل مشخص کنید که یکیش مربوط به پارامتر تعداد خطوطه و دیگری مربوط به آدرس باشه
      دستور dir رو در دستور for قرار بدیم و خروجی دلخواه رو ازش بگیریم.
      البته کمی کار داره و به سادگی هم قابل ساخت نیست.

  3. Avatar photo alireza گفت:

    بعید میدونم بتونم…
    یک دنیا ممنون بخاطر راهنمایی و سایت خوبتون

  4. Avatar photo alireza گفت:

    شما لطف دارید…
    یه سوال دیگه، لیستی که با dir یا هرچیزه دیگه ای بهمون نشون میده رو میتونیم منتقل کنیم به فایل اکسل یا همچین چیزی؟

  5. Avatar photo alireza گفت:

    بنظرت بهتر نیست از powershell استفاده کنم؟ البته بلد نیستم کار باهاش رو، ولی میخونم.

  6. Avatar photo amin007 گفت:

    سلام خسته نباشید
    میخوام کاربر هر چیزیو که تایپ می کنه براش در صفحه دیده نشه اما انجام بشه
    مثلا با کلیک کردن کلید C دستور تعیین شده انجام بشه اما کاربر نبینه که C رو وارد کرده و براش دیده نشه
    چیکار کنم ؟؟

  7. Avatar photo r.ahmadi89 گفت:

    عالی بود

  8. Avatar photo وحید گلستان گفت:

    عالی بود این بخش
    خدا بهت عزت و ابرو بده

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *