کدهای برگشتی در بچ اسکریپت
در فصل قبل (شرطی سازی در بچ اسکریپت) اندکی با کدهای برگشتی یا همان Return Code ها آشنا شدید و فهمیدید هر دستور یا برنامه ای که در CMD یا Batch File اجرا میشود، یک کد برگشتی دارد و آن کد مشخص میکند که برنامه یا دستور اجرا شده به درستی عمل کرده یا با خطا مواجه شده است. در این فصل به صورت کامل در مورد کدهای برگشتی در بچ اسکریپت صحبت خواهیم نمود. همراه با نووا بلاگ باشید.
کدهای برگشتی یا Return Code ها چیستند؟
به طور کلی زمانیکه در CMD یک برنامه را اجرا میکنید یا برنامه به درستی اجرا میشود یا اینکه با خطا مواجه شده و عمل آن متوقف میشود. کد های برگشتی یا Return Code ها به شما کمک میکنند تا از عملکرد صحیح برنامه ها آگهی پیدا کنید و طبق این کدها دستوراتی را برای هوشمند سازی بیشتر فایل Batch خود اضافه کنید. تا مثلا در صورت بروز هر گونه خطا در عملکرد برنامه، دستور و یا برنامه مکمل اجرا شود و مشکلات پیش آمده را برطرف سازد.
در واقع شما میتوانید با استفاده از کدهای برگشتی عملکرد برنامه خود را حدس بزنید و اقداماتی را برای هوشمند سازی بیشتر فایل Batch خود انجام دهید.
زمانیکه یک دستور به درستی و با موفقیت اجرا میشود کد برگشتی آن عدد صفر است ولی در صورتی که عملکرد آن با مشکل مواجه شود کد برگشتی آن عددی غیر از صفر میباشد. یعنی عدد صفر بیانگر صحت عملکرد برنامه ها است. در فهرست زیر مجموعه از کدهای برگشتی را به همراه توضیحات آنها مشاهده میکنید:
کد برگشتی | توضیحات |
0 | اجرای موفقیت آمیز برنامه، یعنی برنامه به درستی و با موفقیت اجرا شده است. |
1 | عملکرد غلط، زمانیکه سعی میشود یک برنامه اجرا شود اما آن برنامه در CMD تشخیص داده نمیشود. |
2 | زمانیکه فایل مشخص شده پیدا نشود. یعنی فایل مشخص شده در آدرس مذکور وجود نداشته است. |
3 | زمانیکه مسیر مشخص شده پیدا نشود. یعنی مسیر مشخص شده پیدا نشده است. |
5 | ممنوعیت در دسترسی (Access Denied) یعنی کاربر مجوز کافی برای اجرای برنامه را ندارد. |
9009 0x2331 | برنامه ذکر شده به عنوان یک دستور داخلی و یا خارجی تشخیص داده نشده است. یعنی برنامه و یا دستور که مشخص شده، نام و یا مسیر آن به درستی نوشته نشده است. |
22122525495 0xc0000017 -1073741801 | به اندازی کافی RAM مجازی وجود ندارد. یعنی کل فضای حافظه RAM ویندوز پر شده است. |
3221225786 0xc000013A -1073741510 | برنامه توسط کلیدهای Ctrl+C متوقف شده است. نشان میدهد کاربر برنامه را یا با کلیدهای Ctrl+C بسته است یا با کلید های Ctrl+Break یا اینکه کلا پنجره Command Prompt را بسته است. |
3221225794 0xc0000142 -1073741502 | برنامه نتوانست به درستی مقدار دهی اولیه را انجام دهد. یعنی برنامه ای که اجرا شده یا کاربر مجوز کافی برای اجرای آنرا نداشته یا gdi32.dll و user32.dll نتوانسته اند به درستی مقدار دهی اولیه داشته باشند. |
استفاده از کدهای برگشتی در Batch File
همانطور که در فصل قبل هم گفته شد برای بررسی عملکرد برنامه ها با کد های برگشتی هم میتوانید از Variable مخصوص این عمل یعنی %ERRORLEVEL% استفاده کنید هم میتوانید دستور IF را به همراه عنصر ERRORLEVEL استفاده کنید. Variable یا متغیر %ERRORLEVEL% شامل آخرین کد برگشتی از برنامه یا Script اجرا شده میباشد. اکثر دستورات خط فرمان مثل Echo و IF و Set مقدار موجود %ERRORLEVEL% را به خاطر میسپارند تا شما بتوانید از کد برگشتی آن برای خطا یابی از دستور اجرا شده استفاده کنید.
نکته: برای دریافت اطلاعات بیشتر در مورد Variable ها به فصل دوم یعنی استفاده از Variable ها در فایل Batch مراجعه کنید.
همانطور که در فصل قبل هم به آن اشاره نمودم مرسوم ترین تکنیک برای بررسی عملکرد برنامه ها و دریافت کدهای برگشتی استفاده از Compare-OP یا اپراتور NEQ در دستور IF میباشد. به مثال زیر توجه کنید:
Program.exe IF %ERRORLEVEL% NEQ 0 ( Echo Do Something Here to Address the Error )
در دستور بالا گفته شده اگر کد برگشتی برنامه Program.exe برابر با عدد 0 نبود پیام Do Something Here to Address the Error با دستور Echo نمایش داده شود.
یکی دیگر از راههای که میتوان صحت عملکرد برنامه قبلی را بررسی نمود استفاده از عنصر ERRORLEVEL با دستور IF میباشد. برای مثال:
Program.exe IF ERRORLEVEL 1 Echo Do Something Here to Address the Error )
استفاده کردن از روش بالا برای اشکال زدایی از برنامه ها و دستورات صحیح است اما مشکلی هم در آن وجود دارد، آنهم منظور از IF ERRORLEVEL 1 فقط عدد 1 نیست بلکه عدد یک به بالا است یعنی اگر کد برگشتی با عدد 1 و 2 و 3 و … برابر بود باید دستور مشخص شده اجرا شود. بهترین روش برای بررسی و اشکال زدایی از برنامه ها و دستورات استفاده از متغیر %ERRORLEVEL% میباشد. تا دقیقا فقط کد برگشتی مشخص شده تطابق داده شود.
برای بررسی نمودن یک کد برگشتی خاص باید آن را با اپراتور EQU یا NEQ وارد کنید. مثلا میتوانید یک برنامه یا Script را اجرا کنید و کد خروجی 9009 را با اپراتور EQU بررسی کنید.
Program.exe IF %ERRORLEVEL% EQU 9009 ( ECHO Error – Program.exe Not Found in Your Path )
در دستور بالا گفته شده اگر برنامه Program.exe با کد 9009 مواجه شد پیام Program.exe Not Found In Your Path را نمایش بده.
اجرای شرطی دستورات با استفاده از علامت های || و &&
همانطور که تا اینجا متوجه شدید به سادگی میتوان با استفاده از دستور IF طبق کد برگشتی مشخص شده برنامه یا دستور خاصی را اجرا نمود. یکی دیگر از راههای که میتوان طبق کد برگشتی دستورات یا برنامه ها را اجرا کرد استفاده از علامت ها میباشد.
مثلا شما میتوانید با استفاده از دو علامت && پشت سر هم از صحت عملکرد یک برنامه مطمئن شوید و طبق آن یک برنامه یا دستور دیگر را اجرا کنید. برای اینکار کافیست بعد از دستور دوبار علامت && را پشت سر هم تایپ کنید سپس دستور مور نظر خود را پس از آن وارد کنید. برای مثال:
Program.exe && Echo Your Program Work Successfully
به صورت کلی از علامت & برای اجرای چند دستور در یک Line استفاده میشود. ولی در بالا از دو علامت && پشت سر هم استفاده شده که به معنای بررسی صحت عملکرد دستور قبل و اجرای دستور بعد میباشد. در صورتی که برنامه Program.exe بدون مشکل اجرا شود دستور Echo اجرا شده و پیام ذکر شده را نمایش میدهد. در غیر این صورت عملی انجام نخواهد شد. در واقع دو علامت && بیانگر این موضوع است که اگر کد برگشتی برنامه قبل برابر با عدد 0 بود دستور مشخص شده اجرا شود.
پس متوجه شدید برای اجرای شرطی یک برنامه در صورت صحت عملکرد برنامه قبل، میتوان از دو علامت && استفاده نمود اما برای اجرای شرطی یک برنامه در صورت مواجه شدن برنامه قبل با خطا باید از دو علامت || استفاده کنید. برای مثال:
Program.exe || Echo Program.exe Failed with Return Code %ERRORLEVEL%
در دستور بالا گفته شده اگر برنامه Program.exe با خطا مواجه شد پیغام Program.exe Failed with Return Code %ERRORLEVEL% نمایش داده شود.
یکی از روشهای ساده برای جلوگیری از خطا استفاده از دستور Exit به همراه پارامتر /B میباشد. (این دستور برای خروج از فایل Batch مورد استفاده قرار میگیرید نه اجرای عادی CMD) پس از پارامتر /B باید کد مشخص کننده خطا را درج کنید. برای مثال:
Program.exe || Exit /B 1
اگر بخواهم یک روش دیگر همانند تکنیک بالا را برایتان توضیح دهم استفاده از دستور goto به همراه برچسب :EOF میباشد. EOF از سه کلمه End Of File تشکیل شده و باعث خروج یا بسته شدن فایل Batch میشود. به مثال توجه کنید:
Program.exe || GOTO :EOF
به طور کلی از روشهای بالا برای جلوگیری از خطا در فایل Batch استفاده میکنند.
4 پاسخ به “کدهای برگشتی در بچ اسکریپت”
سلام میشه ایراداین دستور رو بگی بهم
@echo off
Title Welcom To Simple Mover
Color a
set /p pt = %Cd%
echo %pt%
pause
هر کاری میکنم خروجی ECHO is On میده در حالی که سورس کد میگه همش مسیر داعم داشته باشه ینی مسیر جاری رو ریختم تو یه متغیر بعد اونو چاپ کردم بعد اینکه اینتر میزنم میاد بیرون
ممنون 🙂
سلام مهدی جان
چند تا اشباه داشتی
1- بعد از دستور set از پارامتر /p استفاده کرده بودی که برای وارد کردن محتوای Variable به صورت دستی استفاده میشه (مثلا ساخت منو)
2- بعد از نام Variable و علامت مساوی و محتوای Variable فاصله اضافی گذاشتی
نسخه ویرایش شده فایل Batch شما:
@ECHO OFF
Title Welcome to the Mover
Color a
set pt=%Cd%
echo %pt%
pause
بعد من وقتی میخام یه فایلو انتقال بدم با سی ام دی مسیر فایل اولو میزارم تو یه متغغیر مسیر درایوی که میخام فایل بره را هم میزارم تو یه متغییر دیگه بعد تو دستور به جای نوشتن ادرس میدم ولی ارور میده میشه راهنمایی کنی ممنون
مسیر های که مشخص میکنید رو باید در بین علامت (“”) Quotation Mark قرار بدید تا در صورت وجو نام های چند کلمه ای قعطی در بین آدرسهای مشخص شده به وجود نیاد.
برای اینکه بتونم اطلاعات بیشتری رو بدم باید محتوای فایل batch رو ببینم 🙂
موفق باشید!