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

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

در زبان بچ اسکریپت میتوان برای یک فایل بچ بخشهای متفاوت ایجاد نمود و با دستورات (دستور call و دستور goto) خط فرمان این بخش ها را اجرا و فراخوانی کرد. (مثل ایجاد فانکشن در زبان های برنامه نویسی) در این فصل با انواع روشهای اجرا و فراخوانی در بچ اسکریپت آشنا خواهید شد. همراه با نووا بلاگ باشید.

بخش بندی فایل Batch

اولین کاری که در هر فایل Batch باید انجام دهید بخش بندی نمودن آن است. مثلا فرض کنید یک فایل Bat دارید که برای چند هدف خاص ساخته شده، برای اینکه ساده تر فایل Batch خود را مدیریت کنید بهتر است ابتدا یک بدنه اصلی برای فایل Batch خود بسازید سپس برای هر هدف یک بخش مربوط به آن را در فایل Batch درست کنید. برای بخش بندی کردن یک فایل Batch باید از علامت Colon یا نقل قول : استفاده کنید. به اسکریپت زیر توجه کنید.

@ECHO OFF
 :MAIN
 TITLE MUTIPLE SECTION BATCH FILE
 COLOR 0A
 MODE CON COLS=80 LINES=25
 CD /D %~DP0
 ECHO ITS A MUTIPLE SECTION BATCH FILE
 :BODY
 ECHO ITS MESSAGE SECTION OF BATCH FILE
 START PROGRAM.EXE
 START PROGRAM2.EXE
 ECHO YOU CAN ADD TOO MANY SECTION TO YOUR BATCH FILE AS YOU NEED
 :END
 EXIT 

همانطور که در اسکریپت بالا مشاهده میکنید این اسکریپت از سه بخش مختلف تشکیل شده، یک بخش :MAIN دو بخش :BODY سه بخش :END دستورات که بعد از این بخش ها مشخص شده متعلق به این بخش ها میباشد و در صورت فراخوانی هر بخش فقط دستورات آن بخش اجرا میشود.

رفتن به بخش های مختلف فایل Batch

برای رفتن به بخش های مختلف یک فایل Batch باید از دستور GOTO استفاده کنید. استفاده از دستور GOTO بسیار ساده است کافیست بعد از دستور GOTO نام بخش مورد نظر خود را وارد کنید. برای مثال:

GOTO :MAIN

به نام هر بخش در Batch File برچسب یا Label هم گفته میشود هر Label میتواند نهایتا هشت کاراکتر داشته باشد و حتما هم باید با علامت Colon شروع شود. در صورتی که به یک Label بیش از هشت کاراکتر داده باشید فقط هشت کاراکتر اول آن به عنوان نام آن بخش خوانده میشود. برای مثلا از نگاه Shell کلیه Label های زیر یکی میباشند:

:TMLMANAGER01

:TMLMANAGER02

:TMLMANAGER03

یکی از برچسب های پیشفرض در فایلهای Batch برچسب :EOF یا End Of File میباشد. در صورتی که از دستور GOTO به همراه برچسب :EOF استفاده کنید فایل Batch شما به خط پایان میرسد و به صورت خودکار بسته میشود. معمولا از برچسب :EOF در آخر فایل Batch استفاده میشود. برای مثال:

GOTO :EOF

ساخت منو با دستور IF و GOTO و SET

شما میتوانید با دستورات IF و GOTO و SET به همراه بخش بندی نمودن فایل Batch یک منو برای Batch Script خود بسازید. فرایند ساخت به این صورت است ابتدا باید بخش های مختلف فایل Batch خود را با علامت Colon مشخص کنید سپس در بخش اول، منوی خود را با دستورات IF و GOTO و SET بسازید. به اسکریپت زیر توجه کنید:

@ECHO OFF
 :MAIN
 TITLE BATCH FILE WITH MENU
 COLOR 0A
 MODE CON COLS=80 LINES=25
 CD /D %~DP0
 ECHO ITS A TEST BATCH FILE WITH MENU
 ECHO FOR START NOTEPAD INSERT N AND PRESS ENTER
 ECHO FOR START CALCULATOR INSERT C AND PRESS ENTER
 ECHO FOR EXIT FROM BATCH FILE INSERT E AND PRESS ENTER
 SET /P MENU=
 IF /I %MENU% == N GOTO :NOTEPAD
 IF /I %MENU% == C GOTO :CALCULATOR
 IF /I %MENU% == E GOTO :EOF
 GOTO :MAIN
 :NOTEPAD
 START NOTEPAD
 EXIT
 :CALCULATOR
 START CALC
 EXIT 

همانطور که در اسکریپت بالا مشاهده میکنید ابتدا با دستورات ECHO گزینه منو ها را برای کاربران پایانی مشخص کردیم سپس با دستور SET /P یک Variable درست میشود که محتوای آنرا باید کاربر پایانی وارد کند و پس از آن با دستورات IF مشخص میکنیم اگر مقدار وارد شده توسط کاربر پایانی با مقدار مشخص شده در جلوی دستور IF یکی بود دستور GOTO به بخش مشخص شده از فایل Batch برود که در اسکریپت بالا سه بخش وجود دارد. یک بخش Main که کلا در بین دستورات IF مشخص نشده است. دو بخش Notepad که در آن دستور Start Notepad به همراه دستور Exit وجود دارد. سه بخش Calculator که در آنهم دستور Start Calc به همراه دستور Exit وجود دارد.

فراخوانی بخش های مختلف یک فایل بچ

شما میتوانید به سادگی با دستور call بخشهای مختلف یک فایل Batch را فراخوانی کنید. عمل فراخوانی با دستور CALL کاملا با عملکرد دستور GOTO متفاوت است. چراکه دستور CALL میتواند یک بخش از فایل Batch را در حین اینکه در یک بخش دیگر میباشد فراخوانی کند. اما دستور GOTO بخشی که در آن هست را ترک کرده و به بخش مشخص شده میرود. به اسکریپت زیر توجه کنید:

@ECHO OFF
 :MAIN
 TITLE CALL COMMAND
 COLOR 0A
 MODE CON COLS=80 LINES=25
 CALL :BODY
 EXIT
 :BODY
 ECHO YOU CAN RUN A FUNCTION WITH CALL COMMAND
 PAUSE 

اسکریپت بالا از دو بخش کلی MAIN و BODY تشکیل شده که در بخش MAIN دستور CALL بخش BODY را فراخوانی میکند. بدین معنا که کلیه دستورات بخش BODY باید در بخش MAIN اجرا شوند. به مثال بعدی توجه کنید:

@ECHO OFF
 :MAIN
 TITLE CALL FUNCTION
 COLOR 0A
 MODE CON COLS=80 LINES=25
 CALL :BODY
 ECHO %VAR1%
 ECHO %VAR2%
 :BODY
 SET VAR1=FIRST VARIABLE
 SET VAR2=SECOND VARIABLE
 EXIT /B 0 

در اسکریپت بالا همانند اسکریپت قبل با دستور Call بخش Body فراخوانی شده، همانطور که در بخش Body مشاهده میکنید دو Variable با نام های VAR1 و VAR2 ساخته شده که محتوای آنها در بخش Main با دستور Echo نمایش داده میشوند.

اجرا و فراخوانی در بچ اسکریپت با Argument

همانطور که تا اینجا متوجه شدید شما میتوانید بخشهای مختلف یک فایل Batch را با دستور Call فراخوانی کنید همچنین میتوانید هر بخش را با یک یا چند Argument صدا بزنید. بگذارید قبل از توضیح فراخوانی بخش های مختلف فایل Batch با Argument ، کاربرد خود Argument ها را توضیح دهم. همانطور که میدانید میتوان برای اکثر دستورات CMD مثل دستور DIR یک هدف را مشخص نمود تا دستور رو آن هدف کار کند. برای مثال:

DIR /A /S %WINDIR%

در دستور بالا متغیر %WINDIR% در واقع یک Argument میباشد چرا که مورد هدف دستور DIR /A /S قرار گرفت است. شما میتوانید همانند دستور بالا، در فایلهای Batch هم از Argument ها استفاده کنید. البته ابتدا باید برای فایل Batch خود این Argument ها را با علامت Percent Sign به همراه عدد 1-9 بسازید. به اسکریپت زیر توجه کنید:

@ECHO OFF
 TITLE MAKE ARGUMENTS
 ECHO CHECKING ACCESS TO %1
 PING %1 >NUL && ECHO YOU HAVE SUCCESSFULLY ACCESS TO %1
 ECHO CHECKING ACCESS TO %2
 PING %2 >NUL && ECHO YOU HAVE SUCCESSFULLY ACCESS TO %2
 ECHO CHECKING ACCESS TO %3
 PING %3 >NUL && ECHO YOU HAVE SUCCESSFULLY ACCESS TO %3 

همانطور که در اسکریپت بالا مشاهده میکنید %1  همان Argument اول میباشد و %2 هم Argument دوم و %3 هم Argument سوم است. حال اگر اسکریپت بالا را مثلا با نام 3PING.BAT ذخیره کنیم میتوانیم آدرس سه سایت را در جلوی 3PING.BAT تایپ کرده تا دستور PING دسترسی به این سه سایت بررسی کند. برای مثال:

MAKE ARGUMENTS
 C:\>3PING.BAT GOOGLE.COM CISCO.COM TML-MANAGER.IR
 CHECKING ACCESS TO GOOGLE.COM
 YOU HAVE SUCCESSFULLY ACCESS TO GOOGLE.COM
 CHECKING ACCESS TO CISCO.COM
 YOU HAVE SUCCESSFULLY ACCESS TO CISCO.COM
 CHECKING ACCESS TO TML-MANAGER.IR
 YOU HAVE SUCCESSFULLY ACCESS TO TML-MANAGER.IR 

به طور عادی نمیتوان عدد 9 به بالا را برای مشخص کردن Argument ها استفاده نمود چرا که CMD عدد 10 را عدد 0 میخواند به همین خاطر استفاده از عدد 10 و اعداد بالاتر از آن برای مشخص نمودن Argument ها ممکن نمیباشد. اما در صورتی که بیش از نه Argument داشته باشید میتوانید از راه چاره دیگری استفاده کنید. آنهم استفاده از دستور Shift میباشد.

کار دستور Shift انتقال مقدار واحد Argument ها به یک Argument قبل میباشد. مثلا در صورتی که بعد از Argument پنجم از دستور Shift استفاده کنید مقدار Argument پنجم به Argument چهارم منتقل میشود. و مقدار Argument ششم روی Argument پنجم نمایش داده میشود. برای درک بهتر این موضوع به اسکریپت زیر توجه کنید:

@ECHO OFF
 TITLE SHIFTING ARGUMENTS
 ECHO THE FIRST ARG WAS %1
 ECHO THE SECOND ARG WAS %2
 ECHO THE THIRD ARG WAS %3
 SHIFT
 ECHO.
 ECHO THE FIRST ARG WAS %1
 ECHO THE SECOND ARG WAS %2
 ECHO THE THIRD ARG WAS %3 

در صورتی که نام اسکریپت بالا را مثلا ARG.BAT بگذاریم و در جلوی آن حروف  A B C را تایپ کنیم نتایج اجرای آن به شکل زیر میشود:

اجرا و فراخوانی در بچ اسکریپت با دستور call و دستور goto
اجرا و فراخوانی در بچ اسکریپت

همانطور که نتایج اجرای اسکریپت ARG.BAT را مشاهده میکنید این اسکریپت با چهار Argument اجرا شد است که فقط Argument های اول تا سوم توسط دستورات ECHO نمایش داده میشوند. اما پس از دستور Shift جای Argument ها تغییر کرده و کلیه Argument ها به یک واحد قبل خود باز گشتند به همین خاطر Argument چهارم بجای Argument سوم نمایش داده میشود.

شما میتوانید با استفاده از دستور Call بخشهای مختلف یک فایل Batch را به همراه یک یا چند Argument فراخوانی کنید. برای فراخوانی بخشهای مختلف یک فایل Batch به همراه Argument، باید Argument ها را با علامت %~n در بخش مورد نظر خود مشخص کنید. برای مثال:

@ECHO OFF
 :MAIN
 TITLE CALL FUNCTION WITH PARAMETERS
 COLOR 0A
 MODE CON COLS=80 LINES=25
 CALL :BODY PARM1 PARM2 PARM3
 PAUSE
 EXIT
 :BODY
 ECHO %~1
 ECHO %~2
 ECHO %~3
 EXIT /B 0

در اسکریپت بالا دستور Call بخش Body را با پارامترهای Parm1 تا Parm3 فراخوانی میکند. همانطور که در جلوی دستورات ECHO در بخش Body مشاهده میکنید به ترتیب %~1 %~2 %~3 نوشته شده که منظور همان پارامترهای اول تا سوم است.

اجرای دیگر فایلهای Batch با دستور Call

جدا از فراخوانی بخشهای مختلف یک فایل Batch با دستور Call شما میتوانید با استفاده از همین دستور فایلهای Batch دیگر را هم در همان بخش جاری فایل Batch خود اجرا کنید. به مثال زیر توجه کنید:

@ECHO OFF
 :MAIN
 TITLE CALL ANOTHER BATCH FILE
 COLOR 0A
 MODE CON COLS=80 LINES=25
 CALL BATCH.BAT
 IF ERRORLEVEL EQU 0 ECHO YOUR BATCH FILE RUN Successfully
 EXIT 

در اسکریپت بالا فایل BATCH.BAT توسط دستور Call فراخوانی شده و در همین فایل Batch اجرا میشود.

اجرای اسکریپت ها و برنامه ها با دستور Start

جدا از دستور Call که یک اسکریپت را در یک اسکریپت دیگر اجرا میکند شما میتوانید اسکریپت ها و برنامه ها را به صورت کاملا جدا گانه با دستور Start اجرا کنید. برای مثال:

@ECHO OFF
 TITLE START COMMAND
 COLOR 0A
 MODE CON COLS=80 LINES=25
 START /MAX BATCH.BAT 

در اسکریپت بالا با استفاده از دستور Start اسکریپت Batch.bat به صورت مستقل و Maximize اجرا میشود.

4 دیدگاه دربارهٔ «اجرا و فراخوانی در بچ اسکریپت»

  1. Avatar

    سلام و عرض احترام من یک دستور نوشتم برای اینکه یک فایل بک اپ یک نرم افزار حسابداری است کپی کنم ولی کپی نمی شود و پیغام فایل مورد نظر پیدا نشد را می دهد
    در ضمن فایل های دیگه مثل عکس کپی میگیرد ولی فایل مورد نظرم انجام نمیده اگر راهنمایی کنید ممنون میشم

    1. محمد برغمدی

      سلام
      کد مرتبط با دستور for رو کاملا اشتباه نوشتید، توی بچ اسکرپت باید از دو علامت %% برای متغیر دستور for استفاده کنید. (%%i)
      بعد دو سه بار پرانتز رو باز و بسته کردید که معلوم نیست چه کاری رو دارید انجام میدید

  2. Avatar

    @ECHO OFF
    TITLE IF IN FOR COMMAND
    COLOR 0A
    MODE CON COLS=80 LINES=25
    @@ for %i in (D:\Backup\Backup (1399-01-01)\Market1 1399.12.13 15.54 (3.9.4.0).Siba) do copy i c:\jalil123\
    PAUSE

دیدگاه‌ خود را بنویسید

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