دوره‌ های آموزشی نووا
مارس 8, 2021

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

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

در زبان بچ اسکریپت میتوان برای یک فایل بچ بخشهای متفاوت ایجاد نمود و با دستورات (دستور 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 اجرا میشود.

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

  1. Avatar photo سامان گفت:

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

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

  2. Avatar photo سامان گفت:

    @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

  3. Avatar photo سلمان گفت:

    سلام مهندس . بنده یک پوشه دارم که فایلهای بک اپ وجود دارد این فایلها توسط اسکریپت ریستور میشود داخل sql
    سوال
    چطور میتونم حلقه درست کنم که نام فایل ها رو تک تک صدا کنه
    و دوم اینکه چطور میتون سینک کنم بک اپ تاریخ جدیدو با تاریخ قدیم یعنی اگر ناریخ فایل در داخل پوشه اول جدید امد پوشه دوم تاریخ جدید کپی کنه (تاریخ و ساعت)

  4. Avatar photo سلمان گفت:

    سلام مجدد
    به طور مثال

    @echo off
    title restor
    cd\
    cd /d D:\Backup\
    dir /b  *.bak 
    (حلقه برای بدست اوردن اسم فایل ( nfml) از مسیر بکاپ) 
    echo.
    echo USE [master] > res.sql
    echo RESTORE DATABASE [%NFML%] >>res.sql
    echo FROM  DISK = N'%PFBAK%\%NFBAK%.bak' WITH  FILE = 1,  >>res.sql
    echo MOVE N'%NFML%'  	TO N'%PFML%\%NFML%_Data.mdf',  >>res.sql
    echo MOVE N'%NFML%_log' TO N'%PFML%\%NFML%_log.ldf', >>res.sql
    echo NOUNLOAD,  STATS = 5 >>res.sql
    echo GO >>res.sql
    sqlcmd -S %SNSQL% -U %UName% -P %Pwd% -b -i res.sql	-o RESTORE.txt
    if 	%errorlevel% equ 0 del res.sql && goto correct
    goto error
    
  5. Avatar photo سلمان گفت:

    باسپاس فراوان

  6. سلام، عذرخواهی میکنم بابت تاخیر
    برای بدست اوردن اسم فایلها میتونی از دستور for /f با ترکیب دستور dir /b استفاده کنی، برای مثال:

    for /f "usebackq" %a in (`dir /b *.zip`) do echo File name: %a
    

    در دستور بالا کلیه فایلهای که پسوند .zip دارن اسمشون گرفته شده و با دستور echo به نمایش در میان، شما میتونید از همین روش برای فراخوانی اسمشون استفاده کنید.
    برای مورد دوم هم باید از دستور xcopy با پارامتر /d استفاده کنید و اگر بخواهید به صورت خودکار این فراید اتفاق بیافته باید از دستور robocopy استفاده کنید. برای مثال:

    xcopy /d source-dir destination-dir
    
  7. Avatar photo سلمان گفت:

    عرض سلام و ادب
    ممنون از محبتون
    بنده ازاین دستور استفاده کردم
    FOR /F “tokens=*” %%I IN ( ‘dir /b *.bak’) DO (ECHO Backing up database: %%I
    ولی زمانی که روی فایل نام گذاری میشود تعداد فاصله تا انتها بسیار زیاد است حدود 50 اسپیس تا پسوند فایل دارد
    با تشکر

    • سلام
      از گزینه delims استفاده کنید و یک یا چند جداکننده در جلوش مشخص کنید. بعلاوه اینکه با توکن ستاره کل خط برداشته میشه، میتونید از دستور findstr برای حذف فاصله های اضافی استفاده کنید.

  8. Avatar photo محمد گفت:

    سلام استاد خیلی ممنون از آموزش خوبتون.
    میشه یه کتاب تمرینات بچ معرفی کنید. مثل question bank.
    خیلی ممنون

    • سلام محمد
      کتاب خاصی رو در این زمینه نمیشناسم، سعی کنید هر ابزاری که به ذهن تون میرسه رو درست کنید.
      مثلا ایجاد IP Scanner – ابزار بررسی شبکه و …

  9. Avatar photo سلمان گفت:

    با تشکر

  10. Avatar photo سلمان گفت:

    سلام بر مهندس برغمدی ممنون از راهنمایتون
    مهندس به چه صورت می توان یک اسم که در متن ذخیره شده است یامیخواهیم ذخیره کنیم تغییر دهیم یا بتوانم چهار حرف اخر بردارم
    مثال :
    ACC_MCC_DATA==>ACC_MCC
    ACC_NCC_DATA==>ACC_NCC
    و یا میتوانم این لیست اسامی را فهرست کنم به مانند ایندکس

  11. Avatar photo سلمان گفت:

    سلام
    بله این قسمت از کتاب مطالعه نکردم
    ممنون از راهنمایتون

  12. Avatar photo محمد گفت:

    سلام چطور میتونم فایل batch بسازم تا وقتی در یک پوشه با چند داکیومنت ران شد بتواند یک کلمه خاص را از هر داکیومنت بطور جداگانه شمارش کرده و در یک فایل تکست گزارشی از تعداد اون کلمه خاص در هر داکیومنت را به ردیف به من ارایه دهد .

  13. Avatar photo محمد طه گفت:

    سلام
    با تشکر از شما و آموزش های خوب شما
    یک نکته ای رو میخواستم عرض کنم
    اگه میشه شما آموزش بچ اسکریپت را به صورت فیلم در سایت قرار دهید .
    این جوری یاد گیری برای من سریع تر و راحت تر میشه .
    با تشکر.

  14. Avatar photo محمد گفت:

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

    • سلام محمد
      اگر بخوام به صورت کلی پاسخ بدم باید از دستورات for و findstr باهم استفاده کنید با for /f در فایل های متن بچرخید و با دستور findstr کلمات مد نظر رو پیدا کنید
      ولی برای پاسخ جزپی باید وقت گذاشته بشه، اگر تونستم تا سه روز دیگه یک چنین اسکریپتی رو مینویسم و به عنوان مطلب در سایت قرار میدم

      • Avatar photo محمد گفت:

        خیلی ممنونم از شما فقط من تازه با این سایت آشنا شدم این مطلب رو اگر گذاشتید دقیقا کدوم قسمت سایت میتونم پیداش کنم .
        باز هم تشکر یک دنیا ممنونم

  15. Avatar photo حسام گفت:

    سلام خدمت همه دوستان و عزیزان زحمت کش این سایت از عزیزان خواهشی دارم من یک سری فایل تکست دارم که می خوام به اول و آخر هر متنی که داخل آن تکست ها هستند یک اسپیس اضافه بشه . آیا کسی هست که بتواند به من کمک کند تا آن را بسازم۰ممنونم

  16. Avatar photo امین گفت:

    سلام
    من یه بچ فایل دارم که با اجرا کردن این بچ فایل اپدیت جدید یک برنامه را از اینترنت میگیره و داخل یک پوشه میریزه ولی به دلیل مشکلات اینترنت بعضی موقع ها این بچ فایل به کارش ادامه نمیده و باید با زدن کلید های CTR+C برنامه رو متوف کنم و مجددا اجرا کنم
    حالا میخوام یه بچ فایل بسازم که این کار رو به صورت اتوماتیک هر یک ساعت انجام بده
    چطور میتونم این کار رو بکنم ؟

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

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