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

ایجاد حلقه در بچ اسکریپت

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

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

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

دستور FOR چگونه کار میکند؟

for {%variable|%%variable} in (set) do command [ CommandLineOptions]

در بالا ساختار کلی دستور for را مشاهده میکنید برای درک بهتر نحوه کارکرد دستور for ابتدا باید با بخشهای این دستور آشنا شوید.  بعد از خود دستور for اولین بخش %variable یا %%variable میباشد این بخش یک متغیر (Variable) تک حرفی است که میتواند هر حرفی از حروف الفبای انگلیسی باشد و قبل از این حرف باید از یک یا دو علامت درصد استفاده شود. در صورتی که بخواهید از دستور for در محیط CMD استفاده کنید باید از یک علامت % استفاده کنید اما در صورتی که بخواهید از دستور for در فایل batch استفاده کنید باید از دو علامت %% استفاده کنید.

بعد از مشخص نمودن متغیر، باید در پرانتز set که توسط بخش in مشخص شده است مقدار ها یا فهرست فایلها و یا دستورات مورد نظر خود را بنویسید. این فهرست شامل فایلها یا مقدارهای میباشد که شما میخواهید دستورات مورد نظر خود را روی آنها اعمال کنید.

در جلوی بخش do باید دستور یا دستوراتی که میخواهید روی فهرست مشخص شده در پرانتز set اعمال شوند را مشخص کنید.

پس آنچه که اتفاق میافتد به این صورت است ابتدا مقدارهای مشخص شده در پرانتز SET با متغیر اولیه (%Variable|%%Variable) جایگزین میشوند سپس دستور یا دستورات مشخص شده در جلوی بخش do روی متغیر (%Variable) اعمال میشود. این فرایند برای تک تک فایلهای مشخص شده در پرانتز set انجام میشود و پس از آن کار دستور FOR به پایان میرسد. به مثال زیر توجه کنید:

FOR %A IN (D:\*) DO @ECHO %A

در دستور بالا ابتدا فایلهای مشخص شده در پرانتز SET با متغیر %A جایگزین میشوند سپس بخش DO میگوید دستور @ECHO متغیر %A را به نمایش بگذارد. این فرایند روی یک به یک فایلهای درایو D:\ انجام میشود تا کار دستور FOR به پایان رسد.

در پرانتز SET میتوانید نام یک فایل یا محدوده ای از نامها را با استفاده از علامت * قبل از پسوند فایل مشخص کنید مثلا برای مشخص کردن کلیه فایلهای JPG باید در پرانتز SET کلمه *.JPG را تایپ کنید. مثال های بیشتر:

(*.doc)

(*.doc *.txt *.me)

(jan*.doc jan*.rpt feb*.doc feb*.rpt)

(ar??1991.* ap??1991.*)

استفاده از دستور for برای پردازش روی فایلها

جدا از اینکه میتوانید نام فایلها و پوشه ها را به صورت مستقیم در پرانتز Set قرار دهید میتوانید از متغیر ها نیز در این پرانتز استفاده کنید. برای مثال:

FOR %B IN (%USERPROFILE%\*) DO @ECHO %B

در دستور بالا گفته شده تمام فایلهای موجود در پوشه %USERPROFILE% یک به یک در متغیر %I قرار گیرند سپس با دستور @ECHO %I  این فایلها به نمایش گذاشته میشوند. این فرایند روی همه فایلهای موجود در پوشه %USERPROFILE% انجام میشود تا کار دستور FOR به پایان رسد. به مثال بعدی توجه کنید:

FOR %C IN (%HOMEPATH%\DESKTOP\*.JPG) DO COPY %C F:\SHIFT\

نکته: علامت ستاره * مشخص میکند کلیه فایلهای یک پوشه توسط دستور For مورد پردازش قرار گیرند.

در دستور بالا گفته شده تمام فایلها با پسوند .JPG را از پوشه Desktop به آدرس F:\SHIFT\ کپی کند.

اگر بخواهم فرایند بالا را به زبان ساده بیان کنم: ابتدا دستور FOR یک Variable با نام %I درست میکند که محتوای آن در پرانتز SET مشخص شده است. این محتوا شامل فایلهای JPG در آدرس %HOMEPATH%\DESKTOP میباشند. سپس با DO میگوید دستور Copy داده های دریافت شده از Variable یا متغیر %I را به آدرس F:\SHIFT\ کپی کند.

همانطور که میتوانید یک دستور if را در یک دستور دیگر IF قرار دهید همین عمل را هم میتوانید با دستور FOR انجام دهید یعنی مثلا یک دستور FOR تایپ کنید سپس یک دستور IF در آن قرار دهید. برای مثال:

@ECHO OFF
 TITLE IF IN FOR COMMAND
 COLOR 0A
 CD /
 MODE CON COLS=80 LINES=25
 ECHO FIND AUTORUN VIRUS AND REMOVE FROM HARD DRIVE
 FOR /D %%A IN (C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z:) DO (
     IF /I EXIST %%A\AUTORUN.INF DEL /Q %%A\AUTORUN.INF && @ECHO VIRUS SUCCESSFULLY REMOVED FROM %%A
 )
 PAUSE

در اسکریپت بالا ابتدا با دستور FOR یک به یک درایو های کامپیوتر بررسی شده و با دستور IF گفته شده اگر فایل AUTORUN.INF در این درایو ها وجود داشت آنرا حذف کند.

استفاده از دستور FOR برای دایرکتوری ها

حال اگر بخواهید از دستور FOR برای پردازش پوشه ها استفاده کنید باید از پارامتر /D بعد از دستور For استفاده کنید. به مثال زیر توجه کنید:

FOR /D %I IN (%USERPROFILE%\*) DO @ECHO %I

دستور بالا کلیه پوشه های موجود در آدرس %USERPROFILE% را توسط دستور ECHO به نمایش میگذارد. اگر پارامتر /D را از اول دستور حذف کنید بجای پوشه ها، فایلهای موجود در دایرکتوری %USERPROFILE% به نمایش گذاشته میشوند. این بدان معناست که پارامتر /D مشخص میکند دستور FOR فقط با دایرکتوری ها سرو کار دارد.

@ECHO OFF
 TITLE FOR DIRECTORY
 COLOR 0A
 MODE CON COLS=80 LINES=25
 FOR /D %%A IN (%HOMEPATH%\DESKTOP %HOMEPATH%\DOCUMENTS %HOMEPATH%\VIDEOS) DO (
 DIR /A /S %%A >>%HOMEPATH%\DESKTOP\LISTOFFILES.TXT
 )
 PAUSE

استفاده از دستور FOR برای Root Directory

شما میتوانید از دستور FOR برای Root Directory ها یا همان خود درایو ها مثل درایو D:\ استفاده کنید. برای انجام یک عمل خاص در Root Directory ها باید از پارامتر /R استفاده کنید. برای مثال:

FOR /R D:\ %I IN (.) DO @ECHO %I

نکته: حرف نقطه در بین پرانتز مشخص کننده کلیه پوشه ها ممکن میباشد. اما اگر بخواهید کلیه فایلها را مشخص کنید باید از علامت * استفاده کنید. همچنین برای مشخص نمودن هر دو گزینه باید هر دو علامت را وارد نموده و فقط یک علامت , بین این دو علامت بگذارید. به مثال زیر توجه کنید:

FOR /R D:\ %I IN (.,*) DO @ECHO %I

در دستور بالا گفته شده از مبدا درایو D:\ شروع به  انجام عملیات مشخص شده در جلوی دستور DO شود که در پرانتز حرف نقطه و علامت ستاره گذاشته شده یعنی عملیات مشخص شده هم روی فایلها انجام شود هم روی دایرکتوری ها، این عملیات (@ECHO %I) همان نمایش آدرس فایلها و پوشه های درایو D:\ میباشد.

@ECHO OFF
 TITLE FOR /R ROOT DIRECTORY
 COLOR 0A
 MODE CON LINES=25 COLS=80
 CD /
 ECHO DEFAULT ALL FILE PERMISSION
 FOR /R F:\ %%A IN (.,*) DO (
         ICACLS %%A /Reset /T /Q
 )

در اسکریپت بالا گفته شده مجوز تمام فایلها و پوشه های درایو D:\ را با دستور ICALCS به حالت پیشفرض دربیاورد.

استفاده از دستور FOR برای چرخش بین ارقام

برای چرخش بین اعداد باید از پارامتر /L بعد از دستور for استفاده کنید. فرایند به این صورت است در پرانتز SET باید ابتدا مقدار شروع را مشخص کنید سپس مقدار کاهش یا افزایش را مشخص کنید و در آخر مقدار پایانی را مشخص کنید. به مثال زیر توجه کنید:

FOR /L %G IN (1,1,10) DO @ECHO %G

دستور بالا به ترتیب از عدد 1 تا عدد 10 را پشت سر هم با دستور ECHO نمایش میدهد.

همچنین میتوانید شمارش را به صورت معکوس انجام دهید. به مثال زیر توجه کنید:

FOR /L %G IN (10,-1,0) DO @ECHO %G

به اسکریپت زیر توجه کنید:

@ECHO OFF
 TITLE FOR /L LOOP NUMBERS
 COLOR 0A
 MODE CON COLS=80 LINES=25
 ECHO PLEASE INSERT START NUMBER
 SET /P NUM1=
 CLS
 ECHO PLEASE INSERT STEP NUMBER (FOR DECREASE NUMBER USE DASH BEFORE NUMBER)
 SET /P NUM2=
 CLS
 ECHO PLEASE INSERT END NUMBER
 SET /P NUM3=
 CLS
 ECHO YOUR START NUMBER WAS %NUM1% AND STEP NUMBER WAS %NUM2% AND END NUMBER WAS %NUM3%
 FOR /L %%A IN (%NUM1%,%NUM2%,%NUM3%) DO (
 @ECHO %%A && TIMEOUT /T 1 >NUL
 )
 PAUSE

نتایج اجرای اسکریپت بالا:

ایجاد حلقه در بچ اسکریپت با دستور for
ایجاد حلقه در بچ اسکریپت با دستور for

در اسکریپت بالا ابتدا باید عدد شروع را مشخص نمود سپس عدد کاهش یا افزایش را و در آخر هم عدد پایانی را، همانطور که مشاهده میکنید این سه مقدار (Variable) در دستور FOR قرار گرفته است. عملکرد دستور FOR اینگونه است که ابتدا عدد شروع را دریافت میکند سپس عدد میانه را به آن اینقدر اضافه میکند تا به عدد پایانی برسد و پس از رسیدن به عدد پایانی دستور FOR به صورت خودکار متوقف میشود.

استفاده از دستور FOR برای تجزیه و تحلیل فایلهای متنی و دستورات

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

مثلا فرض کنید شما از نتایج دستور DIR فقط به نام فایلهای آن نیاز دارید نه باقی اطلاعات آن مثل تاریخ ساخت فایلها و یا حجم فایلها، برای اینکه بتوانید فقط نام فایلها را از دستور DIR استخراج کنید باید دستور DIR را در دستور FOR /F قرار دهید تا بتوانید نتیجه مورد نظر خود را دریافت کنید. و یا اینکه مثلا نیاز به بخش خاصی از یک فایل متنی دارید برای اینکار باید از دستور FOR استفاده کنید و مشخص کنید کدام بخش از محتوای فایل متنی باید نمایش داده شود.

همانطور که گفتم برای تجزیه خروجی دستورات و فایلهای متنی باید از دستور FOR به همراه پارامتر /F استفاده کنید. دستور FOR /F خروجی دستورات را به خطوط مختلف تقسیم میکند سپس هر خط را به صفر تا چند Token تبدیل میکند. جدا کننده پیشفرض Token ها جاهای خالی مثل کاراکتر Space و یا Tab است که شما میتوانید این جدا کننده ها (Delimiters) را با Parsing Keyword خاص خود یعنی Delims به هر حرف یا علامت دیگری تغییر دهید. Parsing Keyword ها در واقع Option های هستند که به شما در تجزیه و تحلیل دقیق تر فایلهای متنی و خروجی دستورات کمک میکنند تا ساده تر به آنچه که از خروجی یک دستور و یا فایل متنی نیاز دارید برسید.

به زبان ساده دستور FOR /F ابتدا خروجی دستورات و یا محتوای فایلهای متنی را در خطوط مختلف تقسیم میکند سپس هر خط را به صفر تا چند بخش مختلف تقسیم میکند که به هر بخش یک Token میگویند. جدا کننده این Token ها را شما میتوانید با Parsing Keyword خاص خود یعنی Delmis مشخص کنید اما به صورت پیشفرض این جدا کننده ها جاهای خالی مثل Space یا Tab میباشند سپس میتوانید عدد Token ها را نیز مشخص کنید. که آنرا هم باید با Parsing Keyword خاص خود یعنی کلمه Tokens مشخص کنید. پس از مشخص نمودن موارد بالا دستور FOR فرایند گفته شده شما را روی بخشی از محتوای فایل متنی یا خروجی دستورات انجام میدهد. در ادامه نحوه نوشتن دستور FOR را مشاهده میکنید:

نحوه نوشتن دستور FOR برای تجزیه فایلهای متنی:

FOR /F ["Parsing Keywords"] {%% | %} variable in (filename set) do command [Command Line Options]

نحوه نوشتن دستور FOR برای تجزیه String ها:

FOR /F ["Parsing Keywords"] {%% | %} variable in ("Literal String") do command [Command Line Options]

نحوه نوشتن دستور FOR برای تجزیه خروجی دستورات:

FOR /F ["Parsing Keywords"] {%% | %} variable in ('command') do command [Command Line Options]

همانطور که در دستورات بالا مشاهده میکنید هیچ فرقی بین سه دستور بالا وجود ندارد تنها تفاوت این دستورات در بخش پرانتز IN میباشد که اگر توجه کرده باشید در مثال اول نام فایل متنی در هیچ علامتی قرار نگرفته اما در مثال دوم نام رشته ها یا Variable ها در بین دو علامت Quotation (“”) قرار گرفته و در مثال سوم هم دستور بین دو علامت Single Quote (”) میباشد.

پس از Token بندی خطوط، Token ها روی Variable های تکرار شونده قرار میگیرند و شما میتوانید هر عملی را که خواستید روی آنها انجام دهید. به صورت پیشفرض پارامتر /F در تمام فایلها از Token خالی خط اول رد میشوند. همچنین پردازشی روی خطوط خالی انجام نمیشود.

در بخش filename set میتوان نام یک یا چند فایل را مشخص نمود. در این بخش ابتدا فایلها یکی یکی خوانده شده سپس روی آنها پردازش انجام میشود. برای تغییر روند پیشفرض تجزیه باید از “Parsing Keyword” ها استفاده کنید.

برای اینکه دستور FOR بتواند روی اسم های چند کلمه ای (نام های که از چند کلمه تشکیل شده اند و بین کلمات Space وجود دارد) پردازش انجام دهد باید از کلمه “usebackq” قبل از “Parsing Keywords” ها استفاده شود. تا بتوان از علامت Quotation Mark برای نامهای که در بین آنها Space وجود دارد استفاده نمود. در صورتی که از کلمه usebackq برای اضافه کردن نام های چند کلمه ای استفاده شود نام فایلهای متنی باید در بین دو علامت Quotation Mark قرار گیر و String ها باید در بین دو علامت Single Quote قرار گیرند و دستورات هم باید در بین دو علامت Back Quote قرار گیرد. به دستورات زیر توجه کنید:

FOR /F ["usebackq Parsing Keywords"] {%% | %} variable in ("filename set") do command [Command Line Options]
 FOR /F ["usebackq Parsing Keywords"] {%% | %} variable in ('Literal String') docommand [Command Line Options]
 FOR /F ["usebackq Parsing Keywords"] {%% | %} variable in (`command`) docommand [Command Line Options]

در جدول زیر فهرستی از Parsing Keyword های که میتوانید از آنها برای ایجاد حلقه در بچ اسکریپت استفاده کنید قابل مشاهده است.

نام کلمه تجزیه کنندهعملکرد کلمه کلیدی تجزیه کننده (Parsing Keyword)
EOL=مشخص کننده کاراکتر اول هر خطی که باید نادیده گرفته شوند.
Skip=مشخص کردن تعداد خطوطی که باید از اول یک فایل متنی یا خروجی دستور نادیده گرفته شوند.
Delims=جدا کننده، یا مشخص کردن کاراکتری که Token ها را از هم جدا میکند
Token=مشخص کردن توکن های که قرار است توسط دستور FOR در هر خط بررسی شوند. در صورتی که بعد از عدد توکن از علامت ستاره * استفاده شود ادامه خط پردازش میشود.
usebackqدر صورتی که از کلمه usebackq قبل از Parsing Keyword ها استفاده شود نحوه وارد نمودن نام ها در پرانتز IN متفاوت میشود شما باید نام فایلهای متنی را در بین دو علامت Quotation یا “FILENAME SET” قرار دهید همچنین باید String ها را در بین دو علامت Single Quote یا ‘STRINGS’ قرار دهید و دستورات را هم باید در بین دو علامت Back Quote یا `COMMANDS` قرار دهید.
ایجاد حلقه در بچ اسکریپت

حال بگذارید چند مثال از نحوه تجزیه نمودن فایلهای متنی و خروجی دستورات را با دستور FOR بنویسم تا به سادگی نحوه عملکرد دستور FOR را به همراه پارامتر /F متوجه شوید.

اسکریپت اول: تجزیه فایلهای متنی با دستور FOR

@ECHO OFF
 TITLE PARSING TEXT FILE
 COLOR 0A
 MODE CON COLS=80 LINES=25
 ECHO SHOW RESULT OF PING TO GOOGLE SITE
 PING GOOGLE.COM >PING.TXT
 FOR /F "TOKENS=2 DELIMS=: EOL=R" %%A IN (PING.TXT) DO @ECHO %%A
 DEL /Q PING.TXT
 PAUSE

در اسکریپت بالا ابتدا نتایج دستور PING در یک فایل متنی با نام PING.TXT ذخیره میشود سپس در دستور FOR گفته شده TOKEN دوم هر خط فایل متنی PING.TXT را با دستور @ECHO نمایش بده که جدا کننده TOKEN ها علامت نقل قول : میباشد و با کلمه کلیدی EOL گفته شده هر خط که با کاراکتر R شروع شد نمایش داده نشود.

اسکریپت دوم: تجزیه خروجی دستورات با دستور FOR و استفاده از USEBACKQ

@ECHO OFF
 TITLE PARSING COMMAND OUTPUT
 COLOR 0A
 MODE CON COLS=80 LINES=25
 ECHO SHOW SPECIFIC CONTENT OF PING COMMAND
 FOR /F "USEBACKQ TOKENS=2 DELIMS=: EOL=R" %A IN (`PING GOOGLE.COM`) DO @ECHO %A
 PAUSE 

عملکرد اسکریپت بالا هم دقیقا همانند اسکریپت اول میباشد، تنها تفاوت این دو اسکریپت در این است که در اسکریپت اول ابتدا از نتایج دستور PING یک فایل متنی ساخته میشود و دستور FOR فایل متنی را مورد پردازش قرار میدهد اما در اسکریپت دوم به صورت مستقیم خروجی دستور PING مورد پردازش قرار میگیرد. دیگر تفاوت این اسکریپت با اسکریپت قبل وجود کلمه USEBACKQ در اول PARSING KEYWORD ها بود که در صورت عدم وجود باید بجای کاراکتر BACK QUOTE از کاراکتر SINGLE QUOTE در دور دستور PING استفاده میشد.

اسکریپت سوم: تجزیه خروجی رشته ها و Variable ها

@ECHO OFF
 TITLE FOR PARSING LITERAL STRINGS
 COLOR 0A
 MODE CON COLS=80 LINES=25
 ECHO HOW ARE YOU?
 SET /P ANSWER=
 FOR /F "USEBACKQ TOKENS=1,2" %%A IN ('%ANSWER%') DO (
 IF %%A EQU FINE (ECHO OH ITS GOOD HAVE A NICE DAY) ELSE (ECHO IM HOPE YOU BE FINE)
 )
 PAUSE 

در اسکریپت بالا ابتدا با دستور SET یک Variable ساخته میشود که در دستور FOR این Variable به عنوان یک رشته یا String در پرانتز قرار گرفته است چرا که این رشته در بین دو علامت Single Quote میباشد. همانطور که در جلوی Token مشاهده میکنید اعداد 1,2 نوشته شده که به معنی Token اول و دوم میباشد.

در ادامه با مثال های بیشتری از دستور FOR روبه رو میشوید که خواند این مثال ها خالی از لطف نمیباشد:

FOR /F "USEBACKQ TOKENS=5" %A IN (`DIR /A`) DO @ECHO %A

در دستور بالا گفته شده TOKEN پنجم نتایج دستور DIR را با دستور ECHO نمایش بده. همانطور که گفتم به صورت پیشفرض TOKEN ها با SPACE و TABE جدا میشوند برای تغییر جدا کننده TOKEN ها باید از کلمه Delims استفاده کنید برای مثال:

FOR /F "TOKENS=3 DELIMS=," %A IN ('DIR /A') DO ECHO %A

در دستور بالا گفته شده هر جا که علامت , وجود داشت Token جدید بسازد سپس با دستور @ECHO سومین Token را نمایش دهد.

برای درک بهتر به مثال زیر توجه کنید:

FOR /F "TOKENS=2 DELIMS==" %A IN ('SET') DO @ECHO %A

در دستور بالا با کلمه Delims مشخص شده که جدا کننده Token ها باید علامت مساوی باشد و با کلمه Tokens مشخص شده دومین Token با دستور @ECHO به نمایش درآید.

یکی از ویژگیهای دستور FOR برای تجزیه و تحلیل خروجی دستورات و فایلهای متنی وجود Modifier ها میباشد. شما میتوانید با استفاده از Modifier ها نتایج مطلوب تری را از دستورات FOR دریافت کنید.

نام Variable به همراه Modifierتوضیحات
%~Aگسترش متغیر %A برای حذف Quotation mark های دور (“”)
%~FAگسترش متغیر %A برای نمایش نام و آدرس کامل
%~DAگسترش متغیر %A برای نمایش فقط نام درایو ها
%~PAگسترش متغیر %A برای نمایش فقط مسیر
%~NAگسترش متغیر %A برای نمایش فقط نام
%~XAگسترش متغیر %A برای نمایش فقط Extension
%~SAگسترش متغیر مسیر برای اینکه فقط مسیر کوتاه وجود داشته باشد.
%~AAگسترش متغیر %A برای ویژگیهای فایل یک فایل
%~TAگسترش متغیر %A برای تاریخ و ساعت یک فایل
%~ZAگسترش متغیر %A برای حجم یک فایل
%~$PATH:Aجستجوی دایرکتوری های فهرست گرفته شده در مسیر محیط Variable و گسترش %A برای نام واجد شرایط کامل اولین فایلی که پیدا شد. اگر Variable محیطی مشخص نشده باشد یا فایل توسط جستجو پیدا نشود. این Modifier گسترش پیدا میکند به یک String خالی
ایجاد حلقه در بچ اسکریپت

همچنین میتوانید از Modifier ها به صورت ترکیبی استفاده کنید:

نام Variable با ترکیبی از Modifier هاتوضیحات
%~DPAگسترش %A به نام یک درایو و مسیر آن
%~NXAگسترش %A به نام فایل و Extension آن
%~FSAگسترش %A به مسیر کامل نام با فقط نامهای کوچک
%~DP$PATH:Aجستجوی دایرکتوری های فهرست گرفته شده در مسیر Variable محیطی برای %A و گسترش نام درایو ها و مسیر اولین مورد پیدا شده
%~FTZAAگسترش %A به خروجی خطی که شبیه Dir است.
ایجاد حلقه در بچ اسکریپت

نکته: توجه کنید در جدول های بالا حرف A یک Variable میباشد و شما باید بجای آن از Variable که خود در دستور FOR مشخص کرده اید استفاده کنید.


برای ایجاد حلقه میتوان از دستور if هم استفاده نمود، برای این منظور یک شرط را مشخص کنید و از دستور goto برای بازگشت به حلقه استفاده کنید.

37 پاسخ به “ایجاد حلقه در بچ اسکریپت”

  1. Avatar photo hani گفت:

    با حوصله توضیح دادین و برای شروع کار بسیار خوب …

    خیلی ممنون و خسته نباشید… خدا قوت 🙂

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

    سلام
    مشکلم حل شد
    علمتون افزون… 🙂

  3. Avatar photo useuser گفت:

    ضمن سلام وتشکر
    چندتا سوال داشتم که ممنون میشم جواب دقیقی بفرمایید:
    1-
    Bathfile میخوام که بتونه یک ستاپ یا برنامه که بصورت exe و فرم هستش(یعنی گزینه هایی مثل listbox-Radio button-Button-textbox-browserfile وازاین قبیل مسائل ،داره)رو باز کنه و این فرم رو اتوماتیک گزینه هایی که ما مد نظرمون هستش به شکل پیش فرض انتخاب و اجرا کنه.(یعنی فلان رادیو باتن -چک باکس و فایل و … و در آخر روی دکمه تایید بزنه)!!؟؟
    2-Bathfile یی که بتونه خودش زبان فارسی رو اضافه -و لوکیشن و فورمت رو بزاره روی ایران/persianو time zone رو روی تهران تنظیم کنه؟
    3-Bathfile یی که بتونه تاریخ رو روی لاتیبن تنظیم و زمان رو به ایران تنطیم کنه؟
    تشکر

    • سلام، خواهش میکنم دوست عزیز
      برای نصب خودکار برنامه ها از طریق CMD و Batch که بهش نصب خاموش هم گفته میشه میتونید از پارامتر /s یا /silent استفاده کنید اما برنامه مورد نظر شما باید این ویژگی رو داشته باشه، برای نصب شخصی سازی شده هم باید 100% فایل Setup به صورت msi باشه
      برای تنظیم زبان توسط Batch File باید فایل xml زبان رو داشته باشید بعد با دستور control intl.cpl,, /f:”%CD%AddKeyboardLanguage.xml” زبان رو اضافه کنید.
      برای تغییر زبان و Time zone هم باید از دستور Control.exe TIMEDATE.CPL,,/Z Central America Standard Time استفاده کنید.

  4. Avatar photo maryam گفت:

    با سلام ممنون از توضیحاتون
    ببخشید من میخواهم در for
    FOR %%i IN (“%file%”) DO (

    ECHO fontname=%%~ni
    ECHO fileextension=%%~xi
    ECHO fontfile=%%~ni%%~xi
    set outDir=C:\Users\S.R.P\Desktop\ouput\%%~ni\
    ECHO %outDir

    )
    انجام بدهم.اما در cmd میزنه echo is off (برای قسمت set)
    میشه راهنمایی کنید کجای برنامه مشکل داره؟ (ممنون میشم ایمیل کنید)

    • سلام ، خواهش میکنم
      مشکل از دستور Set نیست بلکه بخاطر استفاده نکردن از دستور Setlocal EnableDelayedExpansion به همراه قرار ندادن نام Variable در بین دو علامت تعجب !! بجای دو علامت درصد %% است.
      تو کتاب آموزش گام به گام Batch Script در فصل دومش کاملا درباره استفاده از متغیر های که هنوز تفسیر نشده اند توضیح دادم.
      نحوه درست نوشتن فایل Batch هم به این شکل میشه:
      @echo off
      setlocal enabledelayedexpansion
      FOR %%i IN (“%file%”) DO (
      ECHO fontname=%%~ni
      ECHO fileextension=%%~xi
      ECHO fontfile=%%~ni%%~xi
      set “outDir=C:\Users\S.R.P\Desktop\ouput\%%~ni\”
      ECHO !outDir!
      )

  5. Avatar photo alireza گفت:

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

    • سلام علیرضا جان، ممنونم از لطف تون
      برای پیدا کردن فایلها بر اساس تاریخ باید از دستور dir به همراه پارامتر /od استفاده کنید. برای مثال:
      dir /a /b /o-d c:
      در دستور بالا با پارامتر /o-d گفته شده باید فایلها بر اساس تاریخ ساخت به ترتیب به نمایش در بیان
      همین دستور رو باید در دستور for /f قرار بدید و آخرین نتیجه رو با دستور set یک متغیر کنید و در دستور بعد اون متغیر رو به نمایش بذارید. برای مثال:
      for /f “tokens=*” %i in (‘dir /a /b /o-d c:’) do set lastfileis=%i
      echo %lastfileis%
      موفق و سربلند باشید.

  6. Avatar photo سپنتا گفت:

    سلام و با تشکر از مطالب عالیتون
    میخواستم همه ی فایل هایی که اخرشون lnk دارن از اخرشون این پسوند رو حذف کنه (به تازگی ها تو سیستمم تقریبا همه ی فایل ها با هر فرمتی به اخرشون .lnk اضافه شده!!!) برا اینکار باید برای طرف دوم تبدیل چی بنویسیم؟

    • سلام
      به احتمال زیاد سیستم تون به ویروس .lnk مبتلا شده، اول باید بررسی کنید که آیا فایلهای اصلی ویندوز تون مشکل دار شدن یا اینکه در کنار اون فایلها با نام همون فایلها فایل .lnk درست شده؟
      معمولا این ویروس ها فایلهای اصلی رو به صورت سیستمی مخفی میکنند پس اول باید از حالت مخفی در بیان بعد یا اینکه با دستور Dir /a در CMD بررسی کنید.
      اگر سیستم تون به ویروس .lnk مبتلا شده بود باید همشو حذف کنید. (علائم ویروسی شدن کامپیوتر)

  7. Avatar photo یه بنده خدا گفت:

    سلام.من میخوام یه کدی بنویسم که یه فولدر به نام هر فایل درست کنه.یعنی مثلا من توی دسکتاپ 10 تا فایل jpg به نام های متفاوت دارم و میخوام پوشه هایی به اون نام ها درست کنم.میشه کدش رو بگین؟ممنون

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

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

  9. Avatar photo pouya گفت:

    سلام خیلی عالی بود فقط مشکل این کد چیست
    @echo off
    for %%i in (%file% Desktop/*.bat) do copy %i% F:\pouyanp\

  10. Avatar photo pouya گفت:

    سلام می خوام یه بیچ بسازم که همه ی فایل های که پسوندشون bat هست رو کوپی کنه تو درایو f

  11. Avatar photo yasin گفت:

    سلام.من کتاب بچ اسکریپت رو خریدم وخوندم.می خوام بدونم جلوی tokens چی بنویسم که آخرین توکن رو انتخاب کنه بدون شماره دهی. ممنون.

    • سلام
      متاسفانه گزینه خواستی نیست که بتونید وارد کنید تا به صورت خودکار آخرین توکن رو دریافت کنید اما خیلی ساده میتونید از روش زیر استفاده کنید و آخرین توکن رو در یک متغیر ذخیره کنید:

      Set MyVar=I Need to get last token give it to me, Thanks
      
      For %%a in (%MyVar%) do set LastToken=%%a

      راه حل دوم: ایجاد یک تابع برای دریافت آخرین توکن

      :GetLastToken RetArg MyVar
              Setlocal
              Set LTN=0
              :TheLoop
              For /F "tokens=1*" %%G in ( "%MyVar%" ) do (
                      Set /A LTN+=1
                      Set LTN=%%H
                      Goto :TheLoop
              )
      Endlocal & ( Set %~1=%LTN% ) & Exit /b 0

      یک Function به این صورت میتونید ایجاد کنید و آخرین توکن (%LTN%) رو ازش دریافت کرده و در دستور for مد نظر تون استفاده کنید.
      موفق باشید

  12. Avatar photo Pooya گفت:

    سلام . ممنون از سایت خوبتون.
    میشه درباره For/f هم توضیح بدین که چیوار میکنه ؟؟؟
    ممنون

  13. Avatar photo j گفت:

    سلام من میخواستم دستوراتی که تو فایل bat نوشتم رو تا یه زمان بی نهایت اجرا کنه چطور از حلقه استفاده کنم
    ممنون میشم اگه جواب بدید

    • سلام
      میتونی از دستور goto و دستور if با هم استفاده کنی، برای مثال:

      @echo off
      setlocal enabledelayedexpansion
      set /a count=0
      :loop
      echo mycommand.exe
      set /a count+=1
      if !count! lss 40 goto :loop
      pause >nul

      فقط بجای عدد 40 باید مقدار مد نظر خودت رو وارد کنی، در اسکریپت بالا حلقه 40 بار میچرخه، البته از دستور for هم میتونی استفاده کنی
      موفق باشید

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

    سلام
    یه فایل رو میخوام تو تمامی ساب فولدر های یک پوشه کپی کنم

  15. Avatar photo فرشته گفت:

    سلام ممنون خیلی خوب بود
    من یه مشکلی دارم
    @echo off
    set /p Input=please your number folders:

    FOR /L %%i IN (1,1,%Input%) do (
    set /p NAME=please your name folders:
    mkdir “%NAME%”
    )
    pause
    من این برنامه رو نوشتم و میخام هر بار به اسمی که تو متغیر ذخیره میشه یه فولدر بسازه اما اررور میده!
    ممنون میشم اگر کمکم کنید
    مرسی

  16. Avatar photo Miran گفت:

    درود بر شما
    یه حلقه می خوام درست کنم که داده های متغیر %101% تا متغیر %101%+X رو پشت سر هم نشون بده
    باید چی کار کنم
    مثلا داده های %101% تا %105% رو نشون بده

  17. Avatar photo X_alone_X گفت:

    سلام و خسته نباشید.
    ی سوال داستم.توی دستور FOR میشه سوییچ F/ رو یکم توضیح بدید…مخصوصا پارامتر های token و delims میخوام بدونم این دوتا دقیقا چ کاری انجام میدن؟؟؟؟

  18. Avatar photo حسن گفت:

    سلام خسته نباشید
    میخواستم با دستور for تمام کارکتر های ‘a’ در یک فایل متنی به ‘b’ تبدیل بشه
    لطفا راهنمایی کنید. تشکر

  19. Avatar photo رضا گفت:

    سلام
    خسته نباشید
    ممنونم بابت توضیح مفیدتون
    من برای حلقه for تو در تو یه مشکلی دارم
    برای اینکه متغیر حلقه اول ( A%% ) رو تقسیم باقی مانده ( % ) کنیم بر متغیر حلقه دوم ( B%% ) چطور باید کدش رو بنویسیم؟؟
    از نظر تئوری اینجور میشه A % %%B%% ولی کار نمیکنه این کد

  20. Avatar photo رضا گفت:

    خیلی ممنون از راهنماییتون
    من میخام برنامه ای بنویسم که دو تا عدد دریافت کنه و اعداد اول بینشون رو چاپ کنه
    این کد رو نوشتم براش :

    ECHO PLEASE INSERT START NUMBER
     =SET /P NUM1
     ECHO PLEASE INSERT STEP NUMBER
    = SET /P NUM2
     CLS
     SET /A COUNT =0
     ECHO YOUR START NUMBER WAS %NUM1% AND END NUMBER WAS %NUM2%
    ) FOR /L %%A IN (%NUM1%,1,%NUM2%) DO 
     ) FOR /L %%B IN (1,1,%%A) DO
     SET /A DIV = %%A %% %%B
     ( IF %DIV%==0 ( %COUNT% +=1
     IF %COUNT%==2 ECHO %%A
    )
     )
    

    اگه میشه راهنماییم کنید و اشتباهاتم رو بگید
    تشکر🙏

    • سلام رضا
      حقیقت خیلی کدهای که نوشتی رو متوجه نشدم، این کد رو برات نوشتم ازش استفاده کن و برنامه خودت رو باهاش بنویس، میتونی تبدیل به یک فانکشن کنی:

      @Echo off
      Title Is it Prime Number
      Setlocal Enabledelayedexpansion
      Mode con cols=80 lines=20
      Color 0f
      :Main
      cls
      Echo --------------------------------------------------------------------------------
      Echo                              Prime Number Checker
      Echo --------------------------------------------------------------------------------
      
      Setlocal
          Set /p PPNumber= Enter your number: 
          Set /a PPNUM=0
          Set /a Count=0
      
          if %PPNumber% leq 1 Echo Not a Prime Number!! & Pause >nul & Goto :Main
      
          for /l %%A in (%PPNumber%,-1,1) do (
      
              Set /a "PrimeNumber[!Count!]=%PPNumber% %% %%A"
              Set /a Count+=1
      
          )
      
          for /l %%B in (%Count%,-1,0) do (
      
              if !PrimeNumber[%%B]! equ 0 Set /a "PPNUM+=1"
              
          )
          Set /a "PPNUM-=1"
          if %PPNUM% geq 3 (
      
              Echo Not a Prime Number!!
      
          ) else (
      
              Echo Its a Prime Number!!
      
          )
      Endlocal
      
      Pause >nul
      goto :Main
      
  21. Avatar photo baran گفت:

    سلام
    من میخوام با اجرای bat چندتا سایت باز بشه و تا زمانی که یه دکمه مشخص رو نزدم بین تب ها با فاصله زمانی مثلا 3 ثانیه جابه جا بشه میشه راهنماییم کنید چجوری این کد رو بنویسم؟

  22. Avatar photo خسرو گفت:

    سلام،
    از مطالب بسیار ارزشمندتون متشکرم.
    اگر بخواهیم متغیر حلقه for (مثلا،l%%) رو داخل خود حلقه اگر شرطی برقرار بود تغییر بدیم باید چطوری عمل کنیم.

  23. Avatar photo سفیر آرامش گفت:

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

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

  24. Avatar photo مرتضی افتخاری گفت:

    سلام واسه کد نویسی به کمک نیاز دارم

  25. Avatar photo jh گفت:

    سلام
    من یه فولدر دارم که یه سری فایل داخلش هست. هر روز هم فایل داخلش اضافه میشه
    حالا میخواستم یه دستور بنویسم که هر وقت اجراش کردم بیاد فایلهای توی این فولدر رو تک به تک بررسی کنه و فایلهایی که تاریخ ساخته شدنشون از 2 ماه میگذره رو توی یه فولدر دیگه انتقال بده
    ممنون میشم راهنمایی کنید

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

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