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

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

در زبان های نویسی، ایجاد حلقه (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 برای بازگشت به حلقه استفاده کنید.

23 دیدگاه دربارهٔ «ایجاد حلقه در بچ اسکریپت»

  1. Avatar

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

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

  2. Avatar

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

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

      سلام، خواهش میکنم دوست عزیز
      برای نصب خودکار برنامه ها از طریق 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 استفاده کنید.

  3. Avatar

    با سلام ممنون از توضیحاتون
    ببخشید من میخواهم در 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)
    میشه راهنمایی کنید کجای برنامه مشکل داره؟ (ممنون میشم ایمیل کنید)

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

      سلام ، خواهش میکنم
      مشکل از دستور 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!
      )

  4. Avatar

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

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

      سلام علیرضا جان، ممنونم از لطف تون
      برای پیدا کردن فایلها بر اساس تاریخ باید از دستور 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%
      موفق و سربلند باشید.

  5. Avatar

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

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

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

  6. Avatar

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

  7. Avatar

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

  8. Avatar

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

  9. Avatar

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

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

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

      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 مد نظر تون استفاده کنید.
      موفق باشید

  10. Avatar

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

  11. Avatar

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

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

      سلام
      میتونی از دستور 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 هم میتونی استفاده کنی
      موفق باشید

  12. Avatar

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

  13. Avatar

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

  14. Avatar

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

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

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