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

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

همانطور که نتایج اجرای اسکریپت 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 پاسخ به “اجرا و فراخوانی در بچ اسکریپت”
سلام و عرض احترام من یک دستور نوشتم برای اینکه یک فایل بک اپ یک نرم افزار حسابداری است کپی کنم ولی کپی نمی شود و پیغام فایل مورد نظر پیدا نشد را می دهد
در ضمن فایل های دیگه مثل عکس کپی میگیرد ولی فایل مورد نظرم انجام نمیده اگر راهنمایی کنید ممنون میشم
سلام
کد مرتبط با دستور for رو کاملا اشتباه نوشتید، توی بچ اسکرپت باید از دو علامت %% برای متغیر دستور for استفاده کنید. (%%i)
بعد دو سه بار پرانتز رو باز و بسته کردید که معلوم نیست چه کاری رو دارید انجام میدید
@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
سلام
حداقل یک توضیح میدادی این اسکریپت چه کار میکنه
سلام مهندس . بنده یک پوشه دارم که فایلهای بک اپ وجود دارد این فایلها توسط اسکریپت ریستور میشود داخل sql
سوال
چطور میتونم حلقه درست کنم که نام فایل ها رو تک تک صدا کنه
و دوم اینکه چطور میتون سینک کنم بک اپ تاریخ جدیدو با تاریخ قدیم یعنی اگر ناریخ فایل در داخل پوشه اول جدید امد پوشه دوم تاریخ جدید کپی کنه (تاریخ و ساعت)
سلام
با چه زبانی نوشته شده؟ با بچ اسکریپت بکاپ در SQL ریستور میشه؟
سلام مجدد
به طور مثال
سلام
برنامه تون نیاز داره کمی زمان بزارم روش، سعی میکنم تو این هفته حتما بهتون پاسخ بدم
باسپاس فراوان
سلام، عذرخواهی میکنم بابت تاخیر
برای بدست اوردن اسم فایلها میتونی از دستور for /f با ترکیب دستور dir /b استفاده کنی، برای مثال:
در دستور بالا کلیه فایلهای که پسوند .zip دارن اسمشون گرفته شده و با دستور echo به نمایش در میان، شما میتونید از همین روش برای فراخوانی اسمشون استفاده کنید.
برای مورد دوم هم باید از دستور xcopy با پارامتر /d استفاده کنید و اگر بخواهید به صورت خودکار این فراید اتفاق بیافته باید از دستور robocopy استفاده کنید. برای مثال:
عرض سلام و ادب
ممنون از محبتون
بنده ازاین دستور استفاده کردم
FOR /F “tokens=*” %%I IN ( ‘dir /b *.bak’) DO (ECHO Backing up database: %%I
ولی زمانی که روی فایل نام گذاری میشود تعداد فاصله تا انتها بسیار زیاد است حدود 50 اسپیس تا پسوند فایل دارد
با تشکر
سلام
از گزینه delims استفاده کنید و یک یا چند جداکننده در جلوش مشخص کنید. بعلاوه اینکه با توکن ستاره کل خط برداشته میشه، میتونید از دستور findstr برای حذف فاصله های اضافی استفاده کنید.
سلام استاد خیلی ممنون از آموزش خوبتون.
میشه یه کتاب تمرینات بچ معرفی کنید. مثل question bank.
خیلی ممنون
سلام محمد
کتاب خاصی رو در این زمینه نمیشناسم، سعی کنید هر ابزاری که به ذهن تون میرسه رو درست کنید.
مثلا ایجاد IP Scanner – ابزار بررسی شبکه و …
با تشکر
خواهش میکنم
سلام بر مهندس برغمدی ممنون از راهنمایتون
مهندس به چه صورت می توان یک اسم که در متن ذخیره شده است یامیخواهیم ذخیره کنیم تغییر دهیم یا بتوانم چهار حرف اخر بردارم
مثال :
ACC_MCC_DATA==>ACC_MCC
ACC_NCC_DATA==>ACC_NCC
و یا میتوانم این لیست اسامی را فهرست کنم به مانند ایندکس
سلام
این مطلب رو مطالعه کنید: https://novablog.ir/string-in-batch-script
سلام
بله این قسمت از کتاب مطالعه نکردم
ممنون از راهنمایتون
سلام چطور میتونم فایل batch بسازم تا وقتی در یک پوشه با چند داکیومنت ران شد بتواند یک کلمه خاص را از هر داکیومنت بطور جداگانه شمارش کرده و در یک فایل تکست گزارشی از تعداد اون کلمه خاص در هر داکیومنت را به ردیف به من ارایه دهد .
سلام
با تشکر از شما و آموزش های خوب شما
یک نکته ای رو میخواستم عرض کنم
اگه میشه شما آموزش بچ اسکریپت را به صورت فیلم در سایت قرار دهید .
این جوری یاد گیری برای من سریع تر و راحت تر میشه .
با تشکر.
سلام
بله حتما
سلام
فقط من منظورم کل آموزش بچ اسکریپت بود نه فقط این بخش
ممنون بابت پاسخ گویی
سلام
بله حتما، ان شا الله فصل به فصل ایجاد میکنم
سلام مجدد
اگر جواب بدید ممنون میشم
بچ فایلی میخوام داشته باشم تا در کامپیوتر ران شد (یک کلمه خاص) رو از فایل های با پسوند txt. بگرده پیدا کنه بعد بصورت لیست شده تعداد این کلمه در هر فایل رو در قالب یک فایل txt. بصورت سطر به سطر در اختیار کاربر قرار بده.
اگر میتوانید کمک کنید تا دستورش رو داشته باشم.
یک دنیا ممنون از سایت خوبتون
سلام محمد
اگر بخوام به صورت کلی پاسخ بدم باید از دستورات for و findstr باهم استفاده کنید با for /f در فایل های متن بچرخید و با دستور findstr کلمات مد نظر رو پیدا کنید
ولی برای پاسخ جزپی باید وقت گذاشته بشه، اگر تونستم تا سه روز دیگه یک چنین اسکریپتی رو مینویسم و به عنوان مطلب در سایت قرار میدم
خیلی ممنونم از شما فقط من تازه با این سایت آشنا شدم این مطلب رو اگر گذاشتید دقیقا کدوم قسمت سایت میتونم پیداش کنم .
باز هم تشکر یک دنیا ممنونم
سلام خدمت همه دوستان و عزیزان زحمت کش این سایت از عزیزان خواهشی دارم من یک سری فایل تکست دارم که می خوام به اول و آخر هر متنی که داخل آن تکست ها هستند یک اسپیس اضافه بشه . آیا کسی هست که بتواند به من کمک کند تا آن را بسازم۰ممنونم
سلام
من یه بچ فایل دارم که با اجرا کردن این بچ فایل اپدیت جدید یک برنامه را از اینترنت میگیره و داخل یک پوشه میریزه ولی به دلیل مشکلات اینترنت بعضی موقع ها این بچ فایل به کارش ادامه نمیده و باید با زدن کلید های CTR+C برنامه رو متوف کنم و مجددا اجرا کنم
حالا میخوام یه بچ فایل بسازم که این کار رو به صورت اتوماتیک هر یک ساعت انجام بده
چطور میتونم این کار رو بکنم ؟
سلام
از دستور schtasks استفاده کن و یک وظیفه ایجاد کن که هر یک ساعت یکبار برنامه تو اجرا کنه و بعد مجددا ببنده، موفق باشید.