با سلام ودرود
دستوراتی که در داخل فایلهای Batch مینویسیم چجوری هستند وچجوری باید دستورات داخل فایل رو پیدا کنیم که چه کلمه ای چکار میکند کلا اموزش این فایلها
Printable View
با سلام ودرود
دستوراتی که در داخل فایلهای Batch مینویسیم چجوری هستند وچجوری باید دستورات داخل فایل رو پیدا کنیم که چه کلمه ای چکار میکند کلا اموزش این فایلها
بحث در مورد فایل های Batch خیلی بحث طولانی و زمانبری هست
بهر حال ، من سال ها قبل اولین بار مطالعه فایل Batch را با فایل pdf زیر شروع کردم»
Batch File Programming By Ankit Fadia
این مطلب را کاربری با نام Ankit Fadia نوشته که نمیدانم چرا فکر میکنم نویسنده یک ایرانی باید باشد
سلام
طرف يک هکر بسيار معروف هنديه! Ankit Fadia - Wikipedia, the free encyclopedia
http://starblockbuster.com/sites/def...lic/new1-1.jpg
http://cdnlarge.bookadda.com/bk_imag...8125918141.jpg
http://rajkot.onlyforads.com/uploads/1389333352_35.jpg
http://www.indiacollegesearch.com/up...nts/ethica.jpg
سپاس
سلام
اينم يه فايل pdf فارسي که مطالب آموزشي و کدهاي مربوطه براي دستوارت cmd رو داره. پيوست براي دوستان خوبم:
سپاس
استاد اگه لینکی برای کتاب فارسی دارید ممنون میشم بذارید:yeah:
سهند عزیز کتابی به زبان فارسی سراغ ندارم
ولی سعی میکنم که در ادامه همین تاپیک ، خلاصه ای از کتابی که در پست شماره 2 از Ankit Fadia معرفی
کردم را ، بطور مفهومی ( البته با تغییرات و روش خودم ) ترجمه و توضیح دهم.
سلام
سهندجان، مگه اون فايلي که در بالا پيوست کردمرو دانلود نکرديد؟! :ekh2:نقل قول:
استاد اگه لینکی برای کتاب فارسی دارید ممنون میشم بذارید:yeah:
فکر کنم براي آشنايي و شروع خوب باشه. empathy
سپاس
من نمیخواهم با صحبت کردن درمورد DOS و دستورات آن و یا تاریخچه و چگونگی بوجود آمدن آن ، سرتان را بدرد بیاورم.
فقط همینقدر میگویم که ما اگر با دستورات DOS آشنا باشیم میتوانیم خیلی از کار هایمان را در ویندوز بطور اتوماتیک
و حتی مخفی انجام دهیم که نمونه هایش را در تاپیک های مختلف ، مخصوصا" در بحث های اتوماتیک سازی نصب
برنامه ها مشاهده کردید.
در این بحث من دستورات موجود در کتاب Batch File Programming نوشته Ankit Fadia را نه آنگونه که نویسنده گفته
بلکه با روش خودم توضیح خواهم داد. و سعی خواهم کرد که با آوردن مثال هائی شما را با طرز کار دستورات مختلف
آشنا کنم.
تذکرات:
__ دستورات یک فایل Batch دستوراتی هستند که باید بترتیب و سطر به سطر داخل برنامه Notepad نوشته شده و
در انتها این فایل را باید با پسوند bat ذخیره کنیم.
__ یک فایل Batch باید دارای پسوند bat باشد ولی اگر در ویندوز بجای پسوند bat از پسوند cmd استفاده کنید ، فایل
Batch بهتر و سریعتر کار خواهد کرد.
__ فایل Batch در موقع اجرا دستورات نوشته شده را یکی یکی و سطر به سطر اجرا میکند. یعنی اول دستور سطر
اول و بعد دستور سطر دوم و الی آخر...
چند دستور مقدماتی
============
برنامه Notepad را باز کرده و داخل آن عبارت xxx.exe را تایپ کرده و سپس آن را با نام Do.cmd در دسکتاپ ذخیره
کنید.(توضیح اینکه فایلی بنام xxx.exe وجود ندارد و من برای اینکه بتوانم شما را با مفهوم بعضی دستورات آشنا کنم
گفتم این عبارت را تایپ کنید).
حالا با دابل کلیک کردن روی فایل Do.cmd آن را اجرا کنید.
هیچ اتفاقی نخواهد افتاد ، فقط شما یک لحظه صفحه سیاهی را خواهید دید که بسرعت بسته میشود.
در این جا فایل Batch اجرا شده و کاری را که باید ، انجام داده ولی ما نمیتوانیم ببینیم که چه کاری انجام داده است.
پس چکار باید بکنیم؟ چگونه بفهمیم در اثر اجرای این فایل چه عملی صورت گرفته است؟
فایل Do.cmd را توسط Notepad باز کرده و در سطر دوم (زیر عبارت xxx.exe) دستور pause را تایپ کرده و ذخیره کنید
حال دوباره فایل Do.cmd را اجرا کنید. صفحه ای مثل شکل زیر نمایان خواهد شد.
http://www.worldup.ir/images/76kta2atmaf8pykslrs.png
می بینید که صفحه بالا تا زمانیکه شما یک کلیدی را در کیبورد فشار دهید ، باز می ماند.
گفتیم که یکی از ویژگی های فایل Batch این است که دستورات را یکی یکی و سطر به سطر اجرا میکند. حال ببینیم
با اجرای فایل Do.cmd چه اتفاقی افتاده:
1. فایل Batch شروع به اجرای دستور موجود در اولین سطر (یعنی xxx.exe ) میکند. همان طور که در تصویر بالا
مشاهده میکنید ، برنامه خواسته دستور xxx.exe را اجرا کند ولی نتوانسته و گفته که نمیدانم xxx.exe چه دستوری هست.
2. فایل Batch بعد از دادن پیام در رابطه با فایل xxx.exe شروع به اجرای دستور دوم در سطر دوم (یعنی pause) میکند.
فایل Batch یکی از خاصیت هایش این است که اگر به دستور pause رسید دو تا کار انجام دهد:
الف: صفحه خط فر مان را تا زمانیکه کاربری کلیدی را فشار دهد ، باز نگهدارد.
ب . در آخرین سطر خط فرمان به کاربر پیغام دهد که "کلیدی را فشار بده تا ادامه دهم"
پس تا اینجا با عملکرد دستور pause آشنا شدیم.
اگر به تصویر بالا دقت کنید می بینید که پراز نوشته های مختلف بوده و بسیار گیج کننده است. شرح سطور تصویر بالا
بصورت زیر است:
1. در سطر اول می بینیم که فایل Do.cmd که از دسکتاپ اجرا کردیم ، اول سعی کرده فایل xxx.exe را در دسکتاپ
اجرا نماید.
2. فایل Batch نتوانسته فایل xxx.exe را شناسائی کند لذا در سطور 2 و 3 به ما پیغام داده که دستور یا فایلی بنام
xxx.exe را نمی شناسد.
3. در سطر بعدی می بینیم که فایل Batch دستور pause را اجرا کرده.
4. و در سطر آخر بخاطر اجرای دستور pause پیام داده شده که کلیدی را برای ادامه کار فشار دهید.
می بینید که صفحه بسیار شلوغ است و ما باید سعی کنیم که کاری کنیم که صفحه اینقدر شلوغ نباشد.اینجاست
که یک دستور دیگر بکار می آید.
در تصویر بالا دو تا پیغام داریم که لازم است دیده شوند اولی اینکه برنامه میگوید فایل xxx.exe را نمی شناسد و دوم
اینکه پیغام میدهد کلیدی را فشار دهید تا کار را ادامه دهم.
بنابر این در تصویر بالا نیازی به دیده شدن سطور اجرای فرمان ها ( در این مثال سطور 1 و 4 ) نیست.
برای این کار فایل Do.cmd را توسط Notepad باز کرده و در اول سطر (قبل از سطر xxx.exe) دستور @ECHO OFF را
تایپ کرده و ذخیره کنید
حال اگر مجددا" فایل Do.cmd را اجرا کنید. صفحه ای مثل شکل زیر نمایان خواهد شد.می بینید که سطور 1و 4 قبلی
دیگر نشان داده نمیشوند:
http://www.worldup.ir/images/00jdbq4koj04n2yroi0.png
پس دیدیم که کار دستور ECHO OFF این است که سطور اجرای دستورات را مخفی کند.
یک دستور دیگر را هم امروز یاد میگیریم. ببینید ما در مثال هائیکه امروز کار کردیم ، آخرین فایل Batch که استفاده
کردیم دارای سه سطر بصورت زیر بود:
فرض کنید که ما امروز فایل Do.cmd را با مشخصات بالا درست و استفاده کردیم. و بعد این فایل را کنار گذاشته وکد:@ECHO OFF
xxx.exe
pause
جائی ذخیره کردیم.
و فرضا" دو سال بعد دوباره این فایل را با Notepad باز کردیم .متن بالا را خواهیم دید . الان میدانیم فرضا" دستور
pause کارش چیست و چرا استفاده کردیم ولی دو سال بعد دیگر یادمان نیست
ما میتوانیم در بالای هردستوری که داده ایم ، شرحی در مورد آن بنویسیم برای مثال میتوانیم در فایل Do.cmd
میتوانم توضیح زیر را بنویسم:
.....This is my first
برای اینکه دستورات امروز را درست متوجه شوید ایندفعه در فایل Do.cmd بجای دستور xxx.exe دستور notepad.exe
را قرار دهید و دستور pause را هم حذف کنید که در نتیجه به شکل زیر در خواهد آمد:
اگر درست دقت کنید متوجه می شوید که قبل از توضیحات از دستور REM استفاده شده و بعد از یک فاصله توضیحاتمان راکد:@ECHO OFF
REM This is my first ......
notepad.exe
نوشته ایم.
اگر توضیحاتمان در یک سطر جا نگیرد بایستی در اول سطر بعدی دوباره از دستور REM و یک فاصله استفاده کنیم.
فایل Batch موقع اجرا ، سطوری را که با دستور REM شروع شده اند ندیده میگیرد.
حالا فایل Do.cmd را با مشخصه های بالا اجرا کنید
برنامه notepad اجرا شده (دیگر نخواهد گفت نمی شناسم) و حالا صفحه فرمان هم نگاه کنید
اکنون در آخرین سطر فایل Do.cmd دوباره دستور pause را اضافه کرده و باز هم آن را اجرا کنید. چه فرقی کرد؟
اگر سوالاتی دارید مطرح فرمائید تا بعد در مورد دستورات دیگر هم صحبت کنم.
تا روزی دیگر و ادامه بحث
استاد از توضیحات تکمیل شما خیلی خیلی ممنونم واقعا خسته نباشیدفقط چندتا سوال داشتم که یک به یک میپرسم ببخشید استاد در بعضی از فایلهای بچ دیدم که از شکل وحرکات استفاده شده اینها چه معنی دارند
dp0
"xxxx"
~
%
/
nul
\
سهند عزیز
صبر داشته باش تا اول بحث های کلی و مقدماتی را تمام کنیم
اگر مطالب را دنبال کنی بمرور جواب اکثریت سوالاتت را خواهی گرفت
دستور ECHO
=======
گاهی در یک فایل Batch ، لازم می دانیم که که پیغامی به کاربر بدهیم.
شاید لازم باشد که در یک مرحله از کار ، پرسشی از کاربر کرده و بعد بر اساس جواب کاربر کاری انجام شود.
در اینگونه موارد میتوانیم با استفاده از دستور ECHO به کاربر پیغام دهیم.
برای استفاده از این دستور اول دستور را نوشته و سپس بعد از یک فاصله ، پیغام خود را می نویسیم.
توجه داشته باشید که با این دستور فقط میتوان در یک سطر پیام داد. و اگر پیام ما بیش از یک سطر باشد بایستی
به سطر بعدی رفته و دوباره دستور فوق الذکر را نوشته و بعد از یک فاصله ،نصفه دوم پیام را بنویسیم.
برای مثال فایل Batch زیر را نوشته و اجرا کنید:
حال اگر آن را اجرا کنید صفحه ای مثل تصویر زیر خواهید داشت:کد:@ECHO OFF
ECHO =====================================
ECHO = Hello my friend =
ECHO = You are welcom to ariadl =
ECHO = Have nice times =
ECHO =====================================
pause
http://www.worldup.ir/images/w83qo7zxqj5valsftjyw.png
می بینید که پیام های شما در چند سطر نشان داده میشوند.
ولی بهتر است فایل Batch با لا را بصورت زیر تغییر داده و اجرا کنید:
با اجرای آن صفحه ای مثل شکل زیر خواهید داشتکد:@ECHO OFF
ECHO =====================================
ECHO = Hello my friend =
ECHO.
ECHO = You are welcom to ariadl =
ECHO.
ECHO = Have nice times =
ECHO =====================================
pause
http://www.worldup.ir/images/ey5bpu7wff8b0wurja7.png
نکته ای که در فایل Batch بالا و جود دارد این است که همانطور که در شکل می بینید مابین سطور نوشته ها یک
سطر خالی گذاشته ایم تا سطور واضح تر دیده شوند برای ایجاد فاصله خالی بین سطور از دستور ECHO با مختصر
تغییری استفاده کرده ایم (یعنی اول دستور ECHO را نوشته و به آن همانطور که می بینید یک دات (.) اضاف کرده ایم.
در تکمیل مطلب جلسه قبلی فایل Batch زیر را درست کرده و اجرا فرمائید و بعد کلیدی را از کیبورد فشار دهید.
اجرای این فایل با فایل های قبلی چه فرقی دارد؟کد:@ECHO OFF
Title=*************===== Shirin Zaban ===== ***********
MODE CON: COLS=52 LINES=15
color 1E
ECHO.
ECHO =====================================
ECHO = Hello my friend =
ECHO = =
ECHO = You are welcom to ariadl =
ECHO = =
ECHO = Have nice times =
ECHO =====================================
ECHO.
ECHO.
ECHO = Press any key to Continue ... =
pause>nul
cls
color 3f
ECHO.
ECHO.
ECHO.
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ECHO @ @
ECHO @ Thank you very much @
ECHO @ @
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ECHO.
ECHO.
ECHO = Press any key to Continue ... =
pause>nul
دستور DEL
=======
این دستور یک یا چند فایل را حذف (Delete) میکند
فرض کنید که شما پوشه ای بنام XXX در روت درایو C دارید (C:\XXX) ، و تعدادی فایل درون آن قرار دارند.و باز فرض کنیم
که شما میخواهید با استفاده از فایل Batch فایلی بنام AAA.mp3 را که داخل پوشه C:\XXX قرار دارد را دیلیت کنید.
میتوانید اینکار را با فایل Batch با محتوای زیر انجام دهید:
حالا فرض کنیم که در این مثال تعدادی فایل مختلف درون پوشه C:\XXX وجود دارد و شما میخواهید با فایل Batch همه آنکد:@ECHO OFF
DEL C:\XXX\AAA.mp3
ها را دیلیت کنید. دستور لازم برای اینکار بصورت زیر است:
دستور بالا همه فایل ها را حذف خواهد کرد ولی قبل از این کار یک پیغام داده و خواهد پرسید که " آیا مطمئن هستید؟"کد:@ECHO OFF
DEL C:\XXX\*.*
و شما باید اول کلید Y را در کیبورد فشار داده و سپس کلید Enter را بزنید تا همه فایل های داخل این پوشه حذف شوند.
البته اگر بخواهید که از شما پرسشی نکند و مستقیما" همه فایل ها را دیلیت کند میتوانید از دستور زیر استفاده بکنید:
تذکر:کد:@ECHO OFF
DEL C:\XXX\*.* /Q
--------
دوستان عزیز ، دستوراتی که ما مطالعه میکنیم در شرایط مختلف ، بصورت متفاوتی عمل خواهند کرد که نمونه اش را
در مثال بالا مشاهده کردید.
من نمیتوانم همه دستورات و همه شرایط ممکنه را توضیح دهم.
چون این کار باعث خواهد شد که شرح مطلب این تاپیک ، ماه ها و ماه ها طول بکشد
لذا من فقط تعدادی از دستورات و شرح کار عادی آن ها را توضیح داده و رد خواهم شد.
اگر در هنگام تمرینات خود با مشکلی روبرو شدید اعلام بفرمائید تا در موردشان بحث کنیم.
سلام
استاد عزيز و مهربانم:
1- اگه بخواهيم تمامي فايلهاي اون پوشه "بجز" فلان فرمت يا فلان فايل حذف بشه دستور چطوري خواهد شد؟
2- آيا براي صادر کردن دستور بعدي که از همون نوع باشه (مثل دستور حذف فايل در فلان پوشه) البته اينبار در جاي ديگه بايد در سطر بعدي مثل دستور بالا عمل کنيم يا اينکه ميشه در ادامه همون سطر اضافه کنيم؟ (دستور چطوري ميشه؟)
سپاس
هر دستور باید در سطر متفاوتی نوشته شود.
اگر بخواهیم فقط فایل های بخصوصی حذف شوند باید آن ها را مشخص کنیم فرضا" با دستور زیر فقط همه فایل هایی
دیلیت خواهند شد که دارای پسوند mp3 و یا txt باشند:
دستور MD یا MKDIRکد:@ECHO OFF
DEL C:\XXX\*.mp3 /Q
DEL C:\XXX\*.txt /Q
============
دو تا دستور بالا یکی هستند و شما میتوانید هرکدام را بدلخواه استفاده کنید.
این دستورات برای درست کردن دایرکتوری بکار میروند برای مثال با اجرای دستور زیر پوشه ای با نام XXX در درایو C
ساخته خواهد شد.
MD C:\XXX
تذکر اینکه اگر بخواهیم یک دایرکتوری در روت درایوی که ویندوز نصب شده درست کنیم ، دستور زیر این کار را انجام
خواهد داد:
MD \ABC
با دستور بالا اگر ویندوز در درایو C نصب شده باشد پوشه ای بنام ABC در روت درایو C درست خواهد شد ولی در
سیستم بنده که ویندوز در درایو E نصب شده ، با اجرای دستور بالا پوشه مورد نظر در روت درایو E درست خواهد شد.
اگر بخواهیم که پوشه مورد نظر ما در همین محلی که فایل Batch اجرا میشود ، درست شود از دستور زیر استفاده
میکنیم:
MD ABC
برای مثال اگر فایل Batch با دستور بالا را از دسکتاپ اجرا کنید پوشه ای بنام ABC در دسکتاپ درست خواهد شد.
دستور RD یا Rmdir
============
این دو تا دستور هم مثل هم هستند و کارشان این است که یک دایرکتوری را حذف (Delet) کنند.
توجه داشته باشید که این دستورات فقط پوشه ای را میتوانند دیلیت کنند که خالی باشد. یعنی اگر داخل یک پوشه
فایل ها و یا پوشه های دیگری وجود دارد اول باید محتویات آن را دیلیت کرده و سپس خود پوشه را با دستورات بالا
دیلیت بکنید.
با فرض اینکه میخواهید پوشه خالی C:\ABC را دیلیت کنید از دستور زیر استفاده نمائید:
RD C:\ABC
اگر در پوشه c:\ABC هم تعدادی فایل و هم تعدادی پوشه دیگر وجود داشته باشد میتوانید با دستور زیر هم فایل ها و
دایرکتوری های داخل آن و هم خود پوشه را دیلیت کرد:
RD /s c:\ABC
با اجرای این دستور ، قبل از این کار یک پیغام داده و خواهد پرسید که " آیا مطمئن هستید؟"و شما باید اول کلید Y
را در کیبورد فشار داده و سپس کلید Enter را بزنید تا پوشه با محتویاتش حذف شوند.
اگر میخواهید پوشه و محتویاتش بدون اعلام بالا حذف شوند از دستور زیر میتوانید استفاده کنید.
RD /s /Q c:\ABC
تا بعد
دستور Move
=======
با این دستور میتوانیم یک یا چند فایل را از محلی به محل دیگر منتقل کنیم.
فرض کنیم شما پوشه ای با نام XXX در روت درایو E دارید که داخلش فایلی بنام music.mp3 قرار دارد و نیز پوشه ای
بنام zzz در روت درایو C وجود دارد.
حالا میخواهید با یک دستور فایل music.mp3 از داخل پوشه E:\XXX برداشته شده و داخل پوشه C:\ZZZ گذاشته
شود ، برای این کار از دستور زیر استفاده میکنیم:
دستور Rename یا renکد:move E:\XXX\music.mp3 C:\ZZZ\
=============
دو تا دستور بالا مثل هم بوده و برای تغییر نام دادن فایل و یا پوشه بکار میروند.
برای مثال دستور زیر نام فایل music.mp3 را که داخل پوشه E:\XXX قرار دارد به abc.mp3 تغییر نام میدهد:
ren E:\XXX\music.mp3 abc.mp3
و دستور زیر نام پوشه XXX در روت درایو E را به AAA تغییر نام میدهد:
ren E:\XXX AAA
دستور Title
======
موقعیکه ما یک فایل Batch را بطور عادی اجرا می کنیم ، صفحه خط فرمان مثل شکل (1) زیر عبارت
Windows\system32\cmd.exe... را نشان می دهد . ولی ما میتوانیم با استفاده از دستور Title کاری کنیم که بجای
این عبارت، هر عبارت دیگر دلخواهمان نشان داده شود.
برای مثال با اجرای دستور زیر در اول فایل Batch ، عنوان خط فرمان عبارت Magsoud را نشان خواهد داد:
title Magsoud
http://www.worldup.ir/images/d522cn3ee6wsv2l6hie.png
دستور shutdown
==========
توسط این دستور بهمراه سویچ های مختلف ،میتوانیم کامپیوتر را خاموش (shutdown) ، یا Restart و یا Log off کنیم.
اگر همراه سویچ l استفاده شود باعث می گردد که ویندوز Log off کند:
shutdown -l
اگر همراه سویچ s استفاده شود باعث می گردد که کامپیوتر خاموش (Shutdown) شود:
shutdown -s
با اجرای دستور بالا پنجره ای نمایان شده و تایمر موجود در برنامه بعد از 30 ثانیه کامپیوتر را خاموش می کند.
میتوانیم دستور بالا را بصورت زیر اجرا کنیم
که در این صورت پنجره مثل شکل زیر باز شده و تایمر برنامه بعد از 10 ثانیه کامپیوتر را خاموش میکند.کد:shutdown -r -t 10 -c "eDvArDo eDvArDo eDvArDo eDvArDo eDvArDo"
در ضمن با دستور بالا پیغام "eDvArDo eDvArDo eDvArDo eDvArDo eDvArDo" هم نشان داده خواهد شد.
http://www.worldup.ir/images/6p0fyaht6ghoswhsdh81.png
اگر همراه سویچ r استفاده شود باعث می گردد که کامپیوتر Restart شود:
shutdown -r
این دستور موارد استفاده دیگری هم دارد که از حوصله این تاپیک خارج است .
تا بعد
سلام
استاد عزيز، دستورات کاربردي و بسيار جالب هستند. اما آموزش شيرين، روان و کامل شما دلنشينتر کرده. :yeah:
سپاس
دستور CALL
=======
گاهی لازم میشود که یک فایل Batch در موقع اجرا ، یک فایل Batch دیگر را هم اجرا نماید.برای این کار از دستور CALL
استفاده میکنیم.
توجه داشته باشید که شما میتوانید مستقیما" و بدون استفاده از دستور CALL یک فایل Batch را توسط یک فایل Batch
دیگر استفاده کنید.
برای مثال فرض میکنیم که شما یک فایل Batch با نام فرضا" Do.cmd دارید که داخل آن دستور زیر را نوشته اید:
ABC.CMD
حال اگر فایل Do.cmd را اجرا کنید ، این فایل وقتی به سطری که دستور ABC.CMD وجود دارد رسید ، در صورتیکه
در کنارش فایلی بنام ABC.CMD وجود داشته باشد ، آن را اجرا خواهد کرد.
ولی این طریق اجرای یک فایل Batch از داخل یک فایل Batch دیگر ، یک اشکال بزرگ دارد و آن این است که فایل Batch
اولی پس از اجرای فایل Batch دوم ، بسته خواهد شد.
مفهومی تر بگویم فرض کنید که داخل فایل اول (Do.cmd) ، تعداد 10 سطر دستورات مختلف نوشته باشید که فرضا"
در سطر 3 دستور ABC.CMD نوشته شده است.
حال اگر این فایل را اجرا کنید دستورات سطر اول و سطر دوم اجرا شده و سپس فایل Batch موجود در سطر 3 (یعنی
ABC.CMD) اجرا شده و همزمان فایل Do.cmd بسته خواهد شد. یعنی دیگر دستورات بعد از سطر 3 و ببعد اجرا
نخواهند شد.
این یک اشکال هست که این اشکال با استفاده از دستور CALL برطرف میشود. فرض کنید که بجای دستور بالا دستور
زیر را در سطر سوم فایل Do.cmd بنویسید:
CALL ABC.CMD
حال اگر فایل Do.cmd را اجرا کنید ، بعد از اجرای دستورات سطور 1 و 2 ، فایل ABC.CMD اجرا خواهد شد. با این فرق
که با اجرای فایل ABC.CMD ، فایل Do.cmd بسته نشده بلکه منتظر تمام شدن کار ABC.CMD خواهد ماند و پس از آن
دوباره فایل Do.cmd اجرا شده و دستورات سطر 4 و ببعد را اجرا خواهد کرد.
تذکر این که عمل بالا در صورتی انجام خواهد شد که فایل دوم را خودمان نبندیم و بگذاریم کارش را نرمال انجام دهد.
مثال دیگر: دستور زیر فایل myfile.bat را که در روت درایو C قرار دارد ، اجرا خواهد کرد:
call c:\myfile.bat
دستور Copy
=======
توسط این دستور میتوانیم یک یا چند فایل را از محلی به محل دیگر کپی کنیم.
برای مثال دستور زیر فایل AAA.mp3 را از داخل پوشه E:\ZZZ به داخل پوشه C:\XXX کپی میکند:
این دستور دارای سویچ های مختلفی هم هست که اگر لازم بود بعدا" توضیح میدهم.کد:Copy E:\ZZZ\AAA.mp3 C:\XXX\
دستور GOTO
========
گاهی موقع انجام یک کاری متوجه میشویم که برای این کار وضعیت های مختلفی وجود دارد که هر وضعیت عمل
مخصوص خودش را لازم دارد.
برای مثال میخواهیم یک پوشه با نام XXX در روت درایو C درست کرده و فایل هائی داخلش کپی کنیم. در این زمان
دو حالت پیش می آید:
1. پوشه ای با نام XXX در روت درایو C وجود ندارد .
2. از قبل پوشه ای با نام XXX در روت درایو C وجود دارد.
حالا که میخواهیم پوشه ای با نام XXX در روت درایو C بسازیم و اطلاع نداریم که آیا پوشه ای با همین نام در محل
مذکور وجود دارد یا نه بنابراین می آئیم و فایل Batch خود را طوری می سازیم که بصورت زیر عمل کند:
__ اول ببیند که آیا پوشه ای با نام XXX در روت درایو C وجود دارد یا نه
__ اگر دید وجود دارد دستور X را اجرا کند.
__ اگر دید وجود ندارد دستور Z را اجرا کند.
یک راه برای انجام این کار این است که با دستوری به فایل Batch بفهمانیم که بطریق زیر عمل نماید:
___ اگر دید پوشه ای با نام XXX در روت درایو C وجود دارد در اینصورت برود و دستوری را که در سطر AAA هست اجرا کند.
___ اگر دید پوشه ای با نام XXX در روت درایو C وجود ندارد در اینصورت برود و دستوری را که در سطر ZZZ هست اجرا کند.
برای اینکه این کار را انجام دهیم از دستور GOTO بهمراه دستور شرطی استفاده می کنیم.
در مورد دستور شرطی در جلسه بعد صحبت خواهد شد. و در مورد دستور GOTO فعلا" فقط اینقدر میگویم که بعد از این
دستور باید عبارتی را بنویسیم (مثلا" برای حالت اول مثال بالا می نویسیم GOTO AAA).
و بعد باید در یک سطر از فایل Batch اول یک علامت : گذاشته و بعد جلویش عبارت AAA را بنویسیم.
و سپس زیر این سطر دستوراتی که میخواهیم اجرا شوند را می نویسیم.
وقتی برنامه دستور GOTO را دید (در صورتیکه شرط درست باشد) ، فوری از این قسمت دستورات به سطری که عبارت
AAA: دارد پریده و دستورات زیر این سطر را اجرا خواهد کرد.
در بحث بعدی مطلب را بیشتر متوجه خواهید شد.
دستور IF (دستورات شرطی)
================
در مثال های مختلفی که در این تاپیک داشتیم ، دیدیم که دستورات ما دریک فایل Batch هر کدام در یک سطر مجزا
نوشته میشوند.
به محض اجرای فایل Batch ، دستورات پشت سر هم اجرا میشوند یعنی اول دستور موجود در سطر 1 و بعد دستور
سطر 2 و الی آخر تا تمام دستورات بترتیب شوند .
گاهی لازم میشود که بسته به موجود بودن شرایط بخصوصی کاری را انجام بدهیم.
برای مثال فرض کنیم که ما در کامپیوترمان، در روت درایو C پوشه ای بنام XXX داریم که مثلا"تمام فایل های خصوصی
خود را درون آن نگهداری می کنیم.
و باز فرض کنیم که از کامپیوتر ما کسان دیگری هم استفاده میکنند و فرضا" کاربر eDvArDo وارد کامپیوتر ما شده و
برای اذیت کردن ما نام پوشه XXX را عوض کرده و یا اصلا" آن را دیلیت کرده است!!
و دوباره فرض کنیم که ما از اتفاق بالا خبر نداریم و همین الان در دسکتاپ ما فایلی بنام AAA.mp3 وجود دارد که ما
میخواهیم توسط یک فایل Batch این فایل را به داخل پوشه C:\XXX کپی کنیم.
حال اگر فایل Batch با دستورات مربوطه را اجرا کنیم ، چون پوشه ای بنام C:\XXX وجود ندارد ، پیغام خطا دریافت
خواهیم کرد.
برای جلوگیری از اینگونه اتفاقات، میتوانیم فایل Batch را با استفاده از دستورات شرطی درست کنیم که همواره
درست کار کند.
فرضا" برای مثال بالا باید در فایل Batch خود دستوراتی قرار دهیم که بصورت زیر عمل کند:
1. به روت درایو C نگاه کند و ببیند که آیا پوشه ای بنام XXX وجود دارد یا نه.
2. اگر دید پوشه XXX وجود دارد ، فایل AAA.mp3 را از دسکتاپ به داخل آن کپی کند.
3. اگر دید پوشه XXX وجود ندارد ، اول پوشه ای به همین نام در آن جا درست کند و سپس فایل AAA.mp3 را از
دسکتاپ به داخل آن کپی کند.
می بینید ما در این مثال باید شرایط مختلفی را با هم مقایسه کرده (در این مثال بودن و نبودن پوشه C:\XXX) و
سپس در شرایط مختلف کار های مختلفی انجام بدهیم.
اینکه ما در شرایط متفاوت ، کار های متفاوتی را انجام بدهیم را کار های شرطی نامیده و این اعمال را توسط دستور
IF انجام میدهیم.
دستور IF دارای سویچ های متنوعی بوده و میتواند انجام خیلی از کار ها را برای ما آسان کند و من در این بحث بعضی
از کاربرد های آن را شرح خواهم داد.
یک فایل Batch با محتوای زیر درست کرده و آن را با نام Do.cmd در دسکتاپ ذخیره کنید:
حال اگر فایل Batch بالا (Do.cmd) در دسکتاپ شما بوده و فایل AAA.mp3 هم در کنار آن باشد با اجرای این فایلکد:@ECHO OFF
IF EXIST C:\XXX\ goto AAA
MD C:\XXX
copy AAA.mp3 C:\XXX\
exit
:AAA
copy AAA.mp3 C:\XXX\
exit
اعمال زیر انجام خواهد شد:
1. اگر پوشه C:\XXX موجود باشد فایل AAA.mp3 به داخل آن کپی خواهد شد. و بعد فایل Batch بسته خواهد شد.
2. اگر پوشه C:\XXX وجود نداشته باشد اول این پوشه ساخته شده و سپس فایل AAA.mp3 بداخل آن کپی شده و
بعد فایل Batch بسته خواهد شد.
شرح دستورات فایل Batch بالا بصورت زیر است:
__ دستور سطر 1 (ECHO OFF@): باعث مخفی شدن دستورات Batch میشود.
__ دستور سطر 2 (IF EXIST C:\XXX\ goto AAA): تست میکند که آیا پوشه C:\XXX وجود دارد یا نه.اگر ببیند وجود دارد
دیگر سطر های 3 و 4و 5 اجرا نشده و دستورات زیر سطر 6 (یعنی AAA: ) اجرا میشوند.
__ اگر پس از اجرای دستور سطر 2 ، پوشه پوشه C:\XXX وجود نداشته باشد ، برنامه دیگر به سطر 6 نمی پرد بلکه میرود
تا دستور سطر بعدی یعنی سطر 3 را انجام دهد.
__ دستور سطر 3 پوشه ای بنام XXX در درایو C می سازد.
__ دستور سطر 4 فایل AAA.mp3 را به داخل پوشه C:\XXX کپی میکند.
__ دستور سطر 5 فایل Batch را می بندد.
__ دستورات زیر سطر 6 فقط در صورتی اجرا خواهند شد که در سطر دوم ببینیم که پوشه C:\XXX وجود دارد.
ما میتوانیم این مثال را با نوع دیگری از دستورات انجام دهیم.برای مثال فایل Batch با محتوای زیر را درست و اجرا کنید:
این نوع درست برعکس فایل قبلی عمل میکند.کد:@ECHO OFF
IF NOT EXIST C:\XXX\ goto AAA
copy AAA.mp3 C:\XXX\
exit
:AAA
MD C:\XXX
copy AAA.mp3 C:\XXX\
exit
فایل قبلی در اول کار بودن پوشه ای بنام XXX را تست کرده و براساس آن کاری میکرد
ولی در نمونه جدید در اول کار نبودن پوشه ای بنام XXX تست شده و بر اساس نتیجه اقدامی صورت میگیرد.
در این جلسه یک نوع موارد استفاده دستور IF را دیدیم. اگر جائی نامفهوم و گنگ است بفرمائید تا توضیح داده و بعد
مثال های دیگر و انواع دیگر استفاده از IF را بحث خواهیم کرد.
ادامه دستورات شرطی
============
در جلسه قبلی با یک نوع از دستورات مربوط به IF توانستیم بودن یا نبودن یک پوشه (Directory) را بفهمیم.
مطابق مثال زیر ، درست بهمان طریق میتوانیم بودن و نبودن یک فایل را متوجه شویم:
فایل Batch زیر را اجرا کنید.با اجرای این فایل اگر فایلی بنام " pagefile.sys" در روت درایو C موجود باشد یک پیغام داده
شده و اگر موجود نباشد ، پیغام دیگری نمایش داده خواهد شد:
همانطوریکه در مثال بالا متوجه شدید ، من در این مثال شرطی بهمراه دستور IF براساس نیازم از دستورات دیگری همکد:@ECHO OFF
IF EXIST C:\pagefile.sys goto AAAA
IF NOT EXIST C:\pagefile.sys goto WWWW
:WWWW
echo.
echo.
echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
echo.
echo Can not find "pagefile.sys: in root of drive C
echo.
echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
echo.
echo.
pause>nul
EXIT
:AAAA
echo.
echo.
echo =======================================================
echo.
echo Yes there is file "pagefile.sys" in root of drive C
echo.
echo =======================================================
echo.
echo.
pause>nul
(ECHO OFF@ ، goto ، echo ، pause و EXIT )استفاده کرده ام که در موردشان در جلسات قبلی بحث کرده ایم.
در کل بسته به نیازمان میتوانیم از دستورات مختلف استفاده نمائیم.
توجه کنید که میتوانیم در یک زمان بودن یا نبودن بیش از یک فایل را هم جستجو کنیم . فرضا" دستورات زیر بودن و نبودن دو
تا فایل را تست خواهند کرد:
IF EXIST C:\pagefile.sys IF EXIST C:\config.sys goto AAAA
IF NOT EXIST C:\pagefile.sys IF NOT EXIST C:\config.sys goto WWWW
مطالب دیگری در مورد دستور IF وجود دارد ولی نمیتوانم الان در مورد آن ها صحبت کنم چون توضیح در مورد آن ها مستلزم
دانستن نکاتی هست که فعلا" نمیشود درباره آن ها صحبت کرد چون باعث سردرگمی کاربر خواهد شد.
اگر عمری بود ، اگر این تاپیک به اندازه کافی مشتری داشت ، و اگر حوصله من پیر مرد اجازه دهد ، بعدا" بمرور در جای
خود ، در مورد آن نکات نیز بحث خواهیم کرد.
دستور Attrib
=======
هر فایلی و یا هر پوشه ای دارای خواص مربوط بخودش هست.
برای مثال یک فایل میتواند خواص مختلفی داشته باشد مثلا" مخفی باشد (خاصیت Hidden) و یا فقط قابل خواندن
باشد (خاصیت Read-only) و یا ممکن است یک فایل سیستمی باشد (خاصیت System File) و غیره..
یک فایل ممکن است یکی یا چند تا خاصیت مختلف داشته باشد ، برای مثال فایل های سیستمی معمولا" دارای
هر سه خاصیت گفته شده در بالا هستند یعنی هم سیستمی هستند هم مخفی و هم Read-only .
با استفاده از دستور Attrib میتوانیم خواص فایل ها و پوشه ها را تغییر دهیم.
شاید بگوئید که این کار به چه دردمان میخورد؟ ولی اینگونه نیست . برای مثال اگر فرضا" ویروسی در فلاشتان وارد
شده باشد مطمئنا" اولین کاری که خواهد کرد این است که خودش را مخفی کند (خاصیت Hidden) و بعد حتما"
خودش را Read-only و یا حتی فایل سیستمی خواهد کرد.
معلوم است که در این زمان شما بصورت عادی نخواهید توانست آن ها را دیده و یا دیلیت کنید مگر اینکه اول با دستورات
Attrib آشنا باشید.
دستور Attrib دارای سویچ های مختلفی هست :
اگر با سویچ h+ استفاده شود فایل را مخفی ( Hidden ) میکند.فرضا" دستور زیر فایل xxx.txt در روت درایو E را مخفی
( Hidden ) میکند :
Attrib +h E:\xxx.txt
اگر با سویچ h- استفاده شود خاصیت مخفی بودن را برداشته و فایل را نمایان میکند.مثل:
Attrib -h E:\xxx.txt
اگر با سویچ s+ استفاده شود فایل را سیستمی کرده و اگر با سویچ s- استفاده شود خاصیت سیستمی بودن را برداشته
و فایل را عادی میکند.
اگر با سویچ r+ استفاده شود فایل را Read-only کرده و اگر با سویچ r- استفاده شود خاصیت Read-only را بر می دارد.
با این دستور میتوان همزمان بیش از یک سویچ استفاده کرد برای مثال دستور زیر فایل xxx.txt در روت درایو E را هم
Hidden ، هم Read-only و هم سیستمی میکند:
Attrib +s +r +h E:\xxx.txt
و یا اگر فایل بالا هم Hidden ، هم Read-only و هم سیستمی باشد دستور زیر هر سه خاصیت گفته شده را حذف
کرده و فایل عادی می شود:
Attrib -s -r -h E:\xxx.txt
میتوانیم همزمان خاصیت تعداد زیادی فایل را عوض کنیم. برای مثال با دستور زیر تمام فایل های موجود در پوشه
C:\xxx مخفی خواهند شد:
فعلا" بحث دستور Attrib را هم در همین جا تمام کرده و دیگر موارد مربوطه را در صورت لزوم در جای خود توضیح خواهم داد.کد:Attrib +h C:\xxx\*.*
دستور Xcopy
=======
با این دستور که در حقیقت نوع پیشرفته دستور Copy است ، می شود تمام فایل ها و دایرکتوری های موجود در یک
محل را به محلی دیگر کپی کرد.
برای مثال میشود تمام محتوای درایو C (تمام فایل ها و پوشه ها ) را به درایو E کپی کرد
موقعیکه ما بهر علتی (مثلا" به منظور Backup) ، میخواهیم تمام فایل ها و دایرکتوری ها را از محلی به محل دیگر کپی
کنیم ، وضعیت های مختلفی ممکن است پیش بیاید.این دستور برای هرگونه وضعیت احتمالی دارای سویچ های متفاوتی
است که باید بنا به نیازمان استفاده کنیم. شرح تعدادی از این سویچ ها بصورت زیر است:
__ اگر بهمراه سویچ S/ بکار رود یعنی میخواهیم که تمام دایرکتوری های موجود در محل گفته شده و حتی دایرکتوری
های داخل دایرکتوری ها (Directories and Subdirectories) ، بغیر از آن هائیکه خالی هستند کپی شوند.
__ بهمراه سویچ H/ تمام فابل های مخفی و سیستمی را هم کپی خواهد کرد.
__ همراه سویچ R/ فایل های read-only را هم کپی خواهد کرد.
__ در زمان هائی لازم است که بهر علتی ، پیامی داده شود و از ما بخواهد که ادامه کار را تائید کنیم که اگر دستور
را همراه سویچ Y/ استفاده کنیم، این پیغام را نشان نخواهد داد.
یک مثال: فرضا" پوشه ای با نام AAA در روت درایو C قرار دارد که داخلش انواع فایل ها و پوشه های مختلف وجود دارند
و میخواهید که محتویات این پوشه به داخل پوشه ای بنام BBB در روت درایو E کپی شوند.
با دستور زیر در روت درایو E پوشه ای بنام BBB درست شده و تمام محتویات پوشه C:\AAA به داخل آن کپی خواهد شد.
XCOPY C:\AAA\*.* E:\BBB\ /S/H/C/F/R/Y
حتما" میدانید چرا سویچ های بالا را استفاده کرده ایم.
حالا دستور بالا را بصورت زیر اجرا کنید:
XCOPY C:\AAA\*.* E:\BBB\ /S/H/C/R/Y/q
چه فرقی داشت و چرا ؟
توجه داشته باشید که دستور Xcopy فایل هائی که در حین عمل کپی باز باشند را کپی نخواهد کرد.
دستور Xcopy دارای سویچ های دیگری هم هست ولی همین مقدار برای بحث ما کافی است.
استاد یه سوال داشتم
ما در داخل سی دی ویندوز sources\$oem$\$$\Setup\Scripts یه فایل SetupComplete.cmd داریم که با اجرا شدن اون یه تعداد نرم افزار نصب میشوند ودر ادرس sources\$oem$\$$\Setup\xxx یه فایلی به نام install.cmd داریم ومیخواهیم که در سطر سوم فایل SetupComplete.cmd یه فرمانی برای اجرای فایل install.cmd هم بنویسیم با توجه به ادرس فایل install.cmd فرمان اجرای این فایل در سطر سوم SetupComplete.cmd چطوری خواهد بود البته در اول همه دستورات موجود در فایل SetupComplete.cmd یه چیزی هم هست که با این نوشته شروع میشوند
DPO~%
اگر فایل Install.cmd در داخل پوشه sources\$oem$\$$\Setup\xxx قرار دارد
اول در ابتدای فایل setupcomplete.cmd بعد از سطر Echo off @ دستور زیر را بنویس:
سپس در سطر مورد نظر دستور زیر را بنویس که فایل Install.cmd را اجرا کند:کد:set AA=%WINDIR%\Setup\xxx
کد:CALL %AA%\Install.cmd
استاد در داخل پوشه scripts در کنار فایل setupcomplete.cmd حدود 6تا نرم افزار هستند که که توسط همین فایل setupcomplete.cmd اجرا میشوند وهمه سطرها ودستورات با DPO~% شروع میشوندو فایل setupcomplete.cmd اینطوری شروع میشه ایا با دستوری که شما دادید مشکلی ایجاد نمیشه
@ECHO OFF
Set WorkDir=%~dp0
-----------------------------------------------------------------------------------------------------------------------------------مسیر فایل setupcomplete.cmd
sources\$oem$\$$\Setup\Scripts
-----------------------------------------------------------------------------------------------------------------------------------
مسیر فایل Install.cmd
sources\$oem$\$$\Setup\XXX
نگران نباش.
استاد در مورد اشکال مورد استفاده در فایلهای بچ توضیحاتی میدهید
استاد منظورم تقریبا اینا هست یا چیزاهای مشابه دیگه که تو بعضی فایلهای بچ هستند
=%~dp0
دستور Set
======
این دستور موارد استعمال مختلفی داشته و بسیار به درد بخور است که در این قسمت پاره ای از موارد مصرف این دستور
را یاد میگیریم.
1. فرض کنید که سه تا فایل بنام های AA.exe و BB.exe و CC.exe داخل پوشه C:\Windows\system32\XXX\YYY\ZZZ
قرار دارند و ما میخواهم این سه تا فایل را بترتیب توسط یک فایل Batch اجرا کنیم.
با مواردیکه تاکنون یاد گرفته ایم باید دستورات زیر را بنویسیم:
C:\Windows\system32\XXX\YYY\ZZZ\AA.exe
C:\Windows\system32\XXX\YYY\ZZZ\BB.exe
C:\Windows\system32\XXX\YYY\ZZZ\CC.exe
می بینید که هرچقدر تعداد فایل ها بیشتر باشند ، فایل Batch ما پیچیده تر شده و امکان اشتباه هم زیاد خواهد شد.
ولی با استفاده از دستور set میتوانیم دستور بالا را بصورت ساده و مفهوم زیر در بیاوریم:
می بینید که این فایل Batch نسبت به قبلی چقدر ساده تر و مفهوم تر شده است.ما در بالا در سطر اول با استفادهکد:set AA=C:\Windows\system32\XXX\YYY\ZZZ
%AA%\AA.exe
%AA%\BB.exe
%AA%\CC.exe
از دستور set به برنامه گفته ایم که هر جا عبارت AA را ببیند آن را C:\Windows\system32\XXX\YYY\ZZZ در نظر
بگیرد
و بعد درسطور بعدی دیگر عبارت C:\Windows\system32\XXX\YYY\ZZZ را ننوشته و بجایش عبارت AA را نوشته ایم.
البته با این فرق که AA باید بین دو علامت %% نوشته شود.
عبارت AA را یک متغیر می نامند که در این مثال مقدارش برابر عبارت C:\Windows\system32\XXX\YYY\ZZZ است.
ما در ابتدای این فایل Batch یک متغیر یعنی AA و مقدار آن را مشخص کردیم. میتوانید بجای عبارت AA از عبارات دلخواه
خودتان استفاده کنید. میتوانید چندین متغیر را در اول فایل Batch معرفی کنید.
2. گاهی میخواهید فرضا" سوالی از کاربر پرسیده و بعد بر اساس جوابی که کاربر میدهد کار یا کار های بخصوصی را
انجام دهید.
در این جا میتوانید از دستور set بهمراه سویچ P/ استفاده نمائید. به مثال زیر توجه کنید:
بیائید یک برنامه بسیار ابتدائی را توسط فایل Batch طراحی کنیم.
فرض کنید که میخواهیم برنامه ای طراحی کنیم که اول منوئی به کاربر نشان داده و در آن به کاربر بگوید که یکی از
سه برنامه نشان داده شده ( در این مثال notepad ، MSPait و یا Calculator ) را انتخاب کند تا اجرا شود. و سپس
بسته به این که کاربر کدام برنامه را انتخاب کرده ، همان برنامه ، اجرا شود.
اول باید منوئی درست کرده و به کاربر نشان دهیم که کاربر بتواند بفهمد چکار باید بکند.
منویمان را میتوانیم توسط دستور ECHO که قبلا" یاد گرفتیم درست کنیم. من برای این مثال نمونه زیر را درست کردم
لذا شروع میکنیم
1. برنامه notepad را باز کرده و در آن سطور زیر را تایپ کرده و سپس آن را با نام فرضا" Run.cmd ذخیره کنید:
در این منو کاربر چهار تا گزینه خواهد دید .کد:@ECHO off
cls
:Menu
ECHO.
ECHO.
ECHO @@@@@@@@@@@@@@@@@@@@@@
ECHO. @ @
ECHO @ 1. Run notepad @
ECHO @ 2. Run MSPait @
ECHO @ 3. Run Calculator @
ECHO @ 4. Exit @
ECHO @ @
ECHO @@@@@@@@@@@@@@@@@@@@@@
ECHO.
ECHO.
2. حالا باید دو تا کار انجام بدهیم ، اول اینکه به کاربر بگوییم که یکی از گزینه ها را انتخاب کند و دوم اینکه کاری کنیم
که گزینه ای که کاربر انتخاب کرده اجرا شود.
برای اینکار از دستور set بهمراه سویچ P/ استفاده میکنیم. بدینطریق که سطر زیر را به فایل Run.cmd اضافه میکنیم:
با دستور بالا کاربر فقط عبارت "Type the Program number to Run" را مشاهده خواهد کرد. که به کاربر گفته شمارهکد:set /p ABC=Type the Program number to Run:
برنامه مورد نظرش را انتخاب کند تا برنامه اجرا شود.
3. حالا یکی از چند حالت زیر اتفاق خواهد افتاد:
__ کاربر یکی از شماره های 1 تا 4 را که در منو نشان داده شده تایپ کرده و کلید Enter را فشار می دهد.
__ ممکن است کاربر بخواهد اذیت کند و هیچ شماره ای را انتخاب نکرده ولی کلید Enter را فشار دهد.
__ ممکن است شماره ای بغیر از اعداد نشان داده شده ( 1 تا 4 ) انتخاب کرده و Enter را فشار دهد.
ما باید برای هر حالتی که ممکن است اتفاق بیفتد برنامه ریزی داشته باشیم لذا بروش زیر عمل میکنیم
تا جلسه بعد
در جلسه قبل منوی ساده ای با چهار گزینه طراحی کرده و به کاربر گفتیم که یکی از 4 گزینه موجود را انتخاب کند
تا اجرا شود
حال بقیه ماجرا:
در سطر بعدی فایل Batch دستور زیر را می نویسیم:
در این جا فرض کرده ایم که کاربر هیچ شماره ای را انتخاب نکرده و فقط کلید Enter را فشار داده است. حالا ببینیمکد:if '%ABC%'=='' ECHO You did not enter valid number ,please try again
با این دستوری که دادیم چه اتفاقی می افتد.
در سطر قبل از این سطر ، از دستور set بهمراه p/ استفاده کردیم ، در ادامه دستور عبارت =ABC را نوشتیم و بعد از
علامت = عبارت : Type the Program number to Run را نوشتیم.
این بدان معنی است که برنامه دو تا کار باید انجام دهد:
1. عبارت بعد از مساوی را به کاربر نشان دهد.
2. عکس العمل کاربر را هر چه که هست درون متغیری بنام ABC ذخیره کند.
یعنی با دستور فوق یک متغیر بنام ABC تعریف کرده ایم که برنامه در داخل آن عکس العمل کاربر را ذخیره خواهد کرد.
فرضا" اگر کاربر کلید 1 را تایپ کرده و بعد کلید Enter را فشار دهد برنامه مقدار ABC را برابر 1 ذخیره خواهد کرد.
حالا میخواهیم از این متغیر استفاده کنیم . قبلا" گفتم که برای استفاده از متغیر باید نام متغیر را ما بین دو علامت %%
قرار دهیم.
در بالا گفتم که کاربر هیچ شماره ای را انتخاب نکرده و فقط کلید Enter را فشار داده است یعنی با شرح داده شده ،
برنامه ، در داخل متغیر ABC ، مقدار " هیچ چیز" را ذخیره کرده است.
بنابر این در اینجا از دستور شرطی IF استفاده کرده و گفته ایم که اگر داخل متغیر ABC خالی باشد ، یک پیغام نشان
داده و در آن بگوید "شما عدد درستی وارد نکردید ، لطفا" دوباره وارد کنید".
شرط خالی بودن مقدار متغیر را بصورت زیر نشان داده ایم:
همانطور که می بینید بعد از دو تا علامت مساوی مقداری در داخل دو علامت ،، وجود ندارد.کد:'%ABC%'==''
حال دستور بعدی را باید بنویسیم . این دستور (که در سطر زیر مشاهده می کنید) ،مثل دستور قبلی است با این فرق
که در اینجا مقدار متغیر ABC خالی نبوده و برابر 1 در نظر گرفته شده است:
همانطور که می بینید در این دستور با استفاده از دستور goto که قبلا" در موردش صحبت کردیم ، به برنامه گفته ایمکد:if '%ABC%'=='1' goto PA
که اگر کاربر عد 1 را وارد کرده باشد ، برود و دستورات زیر سطر PA را اجرا کند.
حالا باید سطر PA را درست کرده و زیر آن دستور یا دستوراتی که باید اجرا شود را می نویسیم .در این مثال که میخواهیم
اگر کاربر کلید 1 را فشار دهد برنامه notepad اجرا شود ، دستورات زیر را می نویسیم:
و همین طور برای دیگر حالات هم دستورات لازم را می نویسیم که در نهایت برای این مثال خواهیم داشت:کد::PA
notepad.exe
مثال را تست کنید و درباره اش فکرکنیدکد:@ECHO off
cls
:Menu
ECHO.
ECHO.
ECHO @@@@@@@@@@@@@@@@@@@@@@
ECHO. @ @
ECHO @ 1. Run notepad @
ECHO @ 2. Run MSPait @
ECHO @ 3. Run Calculator @
ECHO @ 4. Exit @
ECHO @ @
ECHO @@@@@@@@@@@@@@@@@@@@@@
ECHO.
ECHO.
set /p ABC=Type the Program number to Run:
if '%ABC%'=='' ECHO You did not enter valid number ,please try again
if '%ABC%'=='1' goto PA
if '%ABC%'=='2' goto PB
if '%ABC%'=='3' goto PC
if '%ABC%'=='4' goto end
ECHO.
goto Menu
:PA
notepad.exe
goto end
:PB
mspaint.exe
goto end
:PC
calc.exe
goto end
:end
exit
تابعد
دوست ارجمندم (سهند) چندین بار در رابطه با اینکه عبارت dp0~% چیست و به چه منظوری در فایل های Batch
بکار میرود سوال کرده که من هنوز جواب واضحی به ایشان نداده ام.
جواب نداده ام چون توضیح مطلب تا اینجای بحثمان مقداری گیج کننده بود و نمیشد در یکی دو سطر توضیح داد. امروز
در رابطه با همین مطلب بحث می کنیم.
ما بعضی از موارد استفاده دستور set را در پست های قبلی مطالعه کردیم.
ما دیدیم که این دستور اطلاعاتی را در یک متغیر نگهداری میکند و ما از اطلاعات ذخیره شده درون این متغیر استفاده
میکنیم.
موقعیکه ما میخواهیم توسط یک فایل Batch برنامه ای را اجرا کنیم ، فایل Batch باید دقیقا" محلی را که برنامه قرار
گرفته بداند و گرنه برنامه اجرا نخواهد شد.
فرض کنید که میخواهیم برنامه AA.exe را که داخل پوشه D:\Windows\system32\Apllications\WWW\XXX\TTT\ZZZ
قرار دارد توسط یک فایل Batch که در دسکتاپ قرار دارد اجرا کنیم.
معلوم است که در حالت ابتدائی باید دستور زیر را در فایل Batch تایپ کنیم:
D:\Windows\system32\Apllications\WWW\XXX\TTT\ZZZ\A A.exe
معلوم است که این آدرس خیلی طولانی است و مخصوصا" اگر چندین فایل مثلا" 20 فایل در آدرس فوق باشند و ما
بخواهیم بترتیب همه آن ها را اجرا کنیم ، نوشتن این آدرس طولانی برای تک تک آن ها هم بسیار خسته کننده شده
و هم احتمال اشتباه تایپی وجود دارد و هم فایل Batch درست شده بسیار گیج گننده و گنگ خواهد بود.
و نیز قبلا" گفتم که در اینگونه موارد بهتر است از دستور set استفاده کنیم تا هم کارمان ساده تر شود و هم فایل Batch
نهائی واضح تر باشد.
و گفتم که به این طریق عمل میکنیم که اول در یک سطر دستوری مثل دستور زیر را در ابتدای فایل Batch می نویسیم:
set ABCD=D:\Windows\system32\Apllications\WWW\XXX\TTT\ ZZZ
با این دستور ما یک متغیر بنامABCD درست کرده و به فایل Batch گفتیم که منبعد هر جا متغیری بنام ABCD دید ،آن
را آدرس بالا بداند.
حال که فرضا" میخواهیم فایل AA.exe را در آدرس مورد بحث اجرا کنیم ، دیگر لازم نیست که دستور دراز بالا را بنویسم
و کافی است که بجای آن از عبارت زیر استفاده کنیم:
حالا فایل Batch موقع اجرا وقتی به عبارت ABCD برسد که ما بین دو علامت %% قرار گرفته می فهمد که ABCDکد:%ABCD%\AA.exe
یک متغیر است و فوری مقدار این متغیر را بجای عبارت ABCD گذاشته و فایل مورد نظر را از محل مورد نظر اجرا میکند.
شما میتوانید در ابتدای فایل Batch با استفاده از دستور set هر تعداد متغیر برای آدرس های مختلف درست کنید.
گاهی آدرس محل کار ما متفاوت است و ما نمیتوانیم یک متغیر ثابت معرفی کنیم
فرض کنید شما یک پوشه ای بنام XXX دارید که داخل آن تعدادی فایل های مختلف وجود دارند و شما میخواهید که
تمام این فایل ها را با دستورات یک فایل Batch که آن هم داخل همین پوشه هست اجرا کنید.
مهم نیست که پوشه XXX در کدام محل بوده باشد ویا حتی نامش چه چیزی باشد ، مهم این است که ما باید به فایل
Batch بگوئیم که تک تک فایل ها را باید از همین پوشه که خودش قرار دارد پیدا کرده و اجرا کند.
در اصطلاح کامپیوتر باید به فایل Batch بگوئیم که فایل ها را از Current Directory پیدا و اجرا نماید.
یک روش رایج برای اینکار این است که در ابتدای فایل Batch متغیری بصورت زیر معرفی کنیم:
Set WorkDir=%~dp0
خاصیت این دستور این است که فایل Batch بعد از این سطر هر جا عبارت عبارت dp0~% را ببیند خواهد فهمید که
منظور همین محلی است که خودش قرار دارد.
برای مثال اگر ببیند دستور زیر نوشته شده:
فوری خواهد فهمید که فایل SBC.exe در کنار خودش قرار دارد و آن را اجرا خواهد کرد.کد:Set WorkDir=%~dp0
%~dp0"SBC.exe"
اگر مطلب گیج کننده و نامفهوم است یادداشت بگذارید تا بیشتر توضیح دهم.
1-استاد پس اگر درست فهمیده باشم Set WorkDir=%~dp0 یعنی اینکه به فایل بچ دستور میدهیم کاری که فایل بچ انجام میخواهی بدی همشون در این پوشه ای هستند که خودت توش قرار داری
2- این دستور بعد Echo off @ در سطر دوم قرار دارد واگر بخواهیم که فایل بچ بفهمد که به ترتیب پوشه های دیگری هم هستند که به وقتش اونا رو هم اجرا کنه باید به ترتیب در سطر سوم و چهارم هم بهش این دستور رو بدهیم که فایلها کجا هستند منتها با این تفاوت که بجایش Set WorkDir=xxx بذاریم
سهند عزیز
نام متغیر برای هر سطر باید متفاوت باشد فرضا" اگر سطر اول عبارت Set WorkDir داریم درسط دوم نباید کلمه WorkDir
باشد بلکه بجایش باید هر عبارتی غیر از این کلمه قرار بدهیم مثلا" set XXX و یا set BB و یا set Sahand
کلمه ای که بعد از دستور set نوشته میشود متغیر است.
اگر در یک فایل Batch فرضا" 10 تا متغیر تعریف کرده باشیم ، همه این ده متغیر ها باید نامی متفاوت داشته باشند.
نباید نام متغیر ها مثل هم باشد.
اگر نام همه متغیر ها را مثل هم بنویسی ، فایل Batch فقط آخرین متغیر را اجرا خواهد کرد.
استاد اگر بخواهیم یک فایل رجیستری مربوط به تنظیمات یک برنامه رو توسط فایل بچ اجرا کنیم که بصورت مخفی باشد دستور را باید به چه شکلی بنویسیم
با فرض اینکه شما فایلی با نام xxx.reg داشته باشید ، با اجرای دستور زیر فایل فوق بصورت مخفی به رجستری اضافه خواهد شد:
کد:regedit /s xxx.reg
نکاتی مفید در رابطه با دستور ECHO
===================
قبلا" دیدیم که توسط این دستور میتوانیم پیغامی را به کاربر نشان دهیم.
فرضا" دستور ECHO Hello My Friend عبارت Hello My Friend را در صفحه خط فرمان نشان خواهد داد.
ما میتوانیم کاری کنیم که پیغام ما عوض اینکه در صفحه خط فرمان نشان داده شود در یک فایل متنی در محلی که
میخواهیم نوشته شود.
برای مثال دستور زیر را نوشته و اجرا کنید:
ECHO Hello My Friend >> C:\ABC.txt
بعد از اجرای این دستور اگر به روت درایو C بروید خواهید دید که در آن جا فایلی بنام ABC.txt درست شده که اگر این
فایل را با Notepad باز کنید خواهید دید که در داخلش پیغام بالا ( یعنی Hello My Friend ) تایپ شده است.
از نظر من این خاصیت خیلی بدرد خور است . برای درک بهتر به مثال زیر توجه کنید:
فرض کنیم که شما یک فایل Batch درست کرده اید تا یک برنامه را بطور مخفی نصب کند. و باز فرض میکنیم که لازم
است که در انتهای کار یک فایل رجستری بنام ABC.reg هم بصورت مخفی اجرا شود تا برنامه اکتیو گردد.
فرض سوم این است که شما بهر علتی (مثلا" مخفی کاری) ،نمیخواهید فایل ABC.reg را کنار فایل Batch قرار دهید.
خب اشکالی ندارد با نوشتن دستوراتی در فایل Batch ، خود فایل Batch میتواند فایل ABC.reg را هم درست کرده و
هم اجرا کند.
مثال : میخواهیم که فایل Batch در حین اجرا یک فایل رجستری با نام ABC.reg و با محتوای زیر ، در روت درایو C
ساخته و سپس آن را بطور مخفیانه اجرا کند:
برای این کار دستورات زیر را اجرا میکنیم:کد:Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip]
"DisplayIcon"="C:\\Program Files\\7-Zip\\7zFM.exe"
"DisplayName"="7-Zip 9.25 alpha"
"NoModify"=dword:00000001
"NoRepair"=dword:00000001
"UninstallString"="C:\\Program Files\\7-Zip\\Uninstall.exe"
حالا شما برای امتحان فقط سطر آخر دستور بالا را ننوشته و فایل Batch را اجرا کنید.کد:@ECHO OFF
ECHO Windows Registry Editor Version 5.00 >> C:\ABC.reg
ECHO. >> C:\ABC.reg
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip] >> C:\ABC.reg
ECHO "DisplayIcon"="C:\\Program Files\\7-Zip\\7zFM.exe" >> C:\ABC.reg
ECHO "DisplayName"="7-Zip 9.25 alpha" >> C:\ABC.reg
ECHO "NoModify"=dword:00000001 >> C:\ABC.reg
ECHO "NoRepair"=dword:00000001 >> C:\ABC.reg
ECHO "UninstallString"="C:\\Program Files\\7-Zip\\Uninstall.exe" >> C:\ABC.reg
regedit /s C:\ABC.reg
حالا اگر به روت درایو C بروید خواهید دید که در آنجا فایل رجستری ای با نام ABC.reg درست شده است.
اگر مختصری به دستورات دقت کنید متوجه خواهید شد که این کار چگونه انجام شده
تا بعد.
در جلسه قبل مثال هائی را دیدیم که در آن ها از علایم << استفاده کرده بودیم.
در این قسمت از بحث طرز کار علامت < و تفاوت آن را با علایم << بررسی میکنیم.
این دو نوع علامت و برخی علایم دیگر را در اصطلاح کامپیوتر Redirection Operators می نامند.
کامپیوتر در حالت کار نرمال ، یک تنظیمات اولیه دارد.برای مثال اگر ما در داخل ویندوز برنامه Microsoft Word را باز کرده
و سپس در کیبورد کلید A را فشار دهیم ، تنظیمات ویندوز به ویندوز میگوید که بعد از فشرده شدن کلید A در کیبورد،
علامت A را در مانیتور و روی صفحه برنامه Microsoft Word نشان دهد.
و یا اگر ما دستور ECHO Hello My Friend را در یک فایل Batch نوشته و آن را اجرا کنیم ، استاندارد ویندوز (تنظیمات
اولیه ویندوز ) به سیستم میگوید که پس از اجرای این دستور عبارت Hello My Friend در مانیتور و داخل صفحه خط
فرمان نشان داده شود.
و مثال دیگر اینکه اگر ما یک پرینتر داشته باشیم و فرضا" در برنامه Microsoft Word بعد از تایپ عباراتی در منوی برنامه
روی گزینه Print کلیک کنیم ، تنظیمات پیشفرض ویندوز به سیستم فرمان میدهد که پرینتر را اجرا کرده و محتویات
فایل موجود را Print کند.
منظور اینکه یک سری کار ها در ویندوز بصورت پیشفرض و از پیش تعیین شده هستند که ما اکثرا" با آن ها سر و کار
داریم.
ولی میشود کاری کنیم که ویندوز عوض کار های پیشفرض ، کار هایی را انجام دهد که ما میخواهیم.
مثال این کار را در جلسه قبل مشاهده کردید که بنده برای مفهوم تر شدن مطلب بنوعی دیگر در اینجا تکرار میکنم.
همانطور که در چندسطر قبل گفتم ، وقتی که ما دستور دستور ECHO Hello My Friend را در یک فایل Batch نوشته
و آن را اجرا کنیم ، تنظیمات اولیه ویندوز به سیستم میگوید که پس از اجرای این دستور عبارت Hello My Friend را در
مانیتور و داخل صفحه خط فرمان نشان دهد.
حال دستور فوق را به شکل زیر تغییر دهید:
ECHO Hello My Friend >> C:\ABC.txt
با اجرای این دستور ، دیگر ویندوز کار استاندارد و از پیش تعیین شده خود را انجام نخواهد داد یعنی عبارت مورد نظر
را در صغحه خط فرمان نشان نخواهد داد.
چون علایم << به ویندوز میگویند که پیغام مورد نظر را عوض نشان دادن در صفحه خط فرمان ، داخل یک فایل ( در این
مثال C:\ABC.txt) بگذارد.
نمیدانم که توانستم مطلب را درست جا بیندازم یا نه. بهر حال اگر نه سوالاتتان را مطرح بفرمائید تا توضیح دهم.
در اول بحث امروز گفتم که میخواهیم طرز کار استفاده از علامت < و فرق آن با علایم << را بدانیم.
این دو نوع کار مشابه انجام میدهند ولی یک فرق اساسی دارند که در مثال زیر تشریح شده است:
فرضا" در دستور گفته شده در بالا ، پس از اجرای فایل Batch دو حالت خواهیم داشت
1. فایلی بنام ABC.txt در روت درایو C وجود ندارد.
2. از قبل فایلی بنام ABC.txt در روت درایو C وجود دارد.
اگر فایلی بنام بنام ABC.txt در روت درایو C وجود نداشته باشد ، این فایل ساخته شده و پیغام مورد نظر داخلش نوشته
خواهد شد.
ولی اگر فایلی بهمین نام از قبل در این محل موجود باشد ، برنامه این فایل را باز کرده و در داخل آن بعد از آخرین سطر
اطلاعات موجود در آن، پیغام مورد نظر را خواهد نوشت.
حالا اگر در دستور بالا بجای اپراتور << از اپراتور < استفاده کنیم همه چیز مثل قبل است با یک تفاوت اساسی. این
اپراتور باعث خواهد شد که اول اطلاعات داخل فایل ABC.txt پاک شده و سپس فقط پیغام مورد نظر را خواهد نوشت.
برای درک بیشتر این اپراتور ، حتما" مثال جلسه قبل در رابطه با فایل رجستری را ، این بار با استفاده از اپراتور < بجای
اپراتور << امتحان کنید.
اگر امتحان بالا را انجام دادید شاید بگوئید با این تفاسیر اپراتور < بدرد نمیخورد و بهتر است که برای این کار ها همیشه
از اپراتور << استفاده کنیم.
ولی من میگویم با عجله نتیجه گیری کردید و این نتیجه گیری کاملا" غلط است. برای درک علت به مثال زیر توجه کنید.
در مثال جلسه قبل اول فایلی بنام ABC.reg در روت درایو C ساخته شده و سپس این فایل اجرا شد.
ولی فرض ما در مثال فوق بر این است که از قبل فایلی بنام ABC.reg در محل مذکور وجود ندارد.
حالا فرض کنید که قبلا" فایلی با همین نام در روت درایو C وجود داشته باشد. در اینصورت این فایل دارای محتوائی هم
هست . در نتیجه چون ما از اپراتور << استفاده کردیم ، محتوای قبلی این فایل پاک نشده و اطلاعات مورد نظر ما در انتهای
محتوای این فایل اضافه خواهد شد.
پس چکار باید کرد؟ اگر بخواهیم از اپراتور << استفاده کنیم که مشکل فوق الذکر را داریم. و اگر از اپراتور < استفاده
کنیم اگر تستی را که گفتم انجام داده باشید خواهید دید که فقط یک سطر (آخرین سطر ) اطلاعات ما داخل فایل
ABC.reg وجود دارد.
پس چکار باید کرد؟
جواب ساده است ما در مثال قبلی بایستی ، در اولین سطر از اپراتور < استفاده کرده و در بقیه سطور از اپراتور <<
استفاده کنیم
با این کار اگر احیانا" فایل ABC.reg در محل مذکور موجود باشد ، در سطر اول ، اپراتور < محتوای این فایل را پاک کرده
و متن مورد نظر ما را خواهد نوشت
و بقیه سطر ها را از اپراتور << استفاده میکنیم که بقیه مطالب ما درست اجرا شوند.
یعنی فایل ما باید بصورت زیر باشد:
تا اینجا نکاتی را در رابطه با اپراتور های Redirection ، مختصرا" مطالعه کردیمکد:@ECHO OFF
ECHO Windows Registry Editor Version 5.00 > C:\ABC.reg
ECHO. >> C:\ABC.reg
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip] >> C:\ABC.reg
ECHO "DisplayIcon"="C:\\Program Files\\7-Zip\\7zFM.exe" >> C:\ABC.reg
ECHO "DisplayName"="7-Zip 9.25 alpha" >> C:\ABC.reg
ECHO "NoModify"=dword:00000001 >> C:\ABC.reg
ECHO "NoRepair"=dword:00000001 >> C:\ABC.reg
ECHO "UninstallString"="C:\\Program Files\\7-Zip\\Uninstall.exe" >> C:\ABC.reg
regedit /s C:\ABC.reg
در زیر یکی دو مورد دیگر از کاربرد های این اپراتور ها را توضیح داده و بحث اپراتور ها را بپایان میرسانم.
دستور زیر را در یک فایل Batch اجرا کنید:
echo %date%, %time% > C:\ABC.txt
اگر بعد از اجرای فایل Batch بالا به درایو C وارد شوید ، خواهید دید که در آن جا فایلی بنام ABC.txt درست شده و اگر
این فایل را باز کنید خواهید دید که داخلش عبارتی شبیه عبارت زیر نوشته شده است:
Sat 05/31/2014, 17:17:34.81
این عبارت میگوید که در زمان اجرای دستور بالا، تاریخ روز یکشنبه 31 ماه پنجم سال 2014 و زمان ساعت 5 و 17 دقیقه
و 34 ثانیه بوده است.
دستور زیر را اجرا کنید:
systeminfo > C:\ABC.txt
حال اگر به درایو C رفته و فایل ABC.txt را باز کنید ، خواهید دید که داخل آن اطلاعات زیادی در رابطه با کامپیوتر شما
نوشته شده است.
یکی دیگر از این اپراتور ها NUL نام دارد که من یکی دو بار در مثال های گذشته از آن استفاده کردم و کسی سوالی
نپرسید یعنی اینکه تمام کسانیکه مثال های این تاپیک را دنبال کرده اند ،طرز استفاده از این اپراتور را میدانند.
بهر حال بحث این اپراتور ها را در اینجا تمام کرده و بقیه موارد مربوطه را بخودتان واگذار میکنم.
نمیدانم تا کنون دقت کرده اید یا نه ، در همه ویندوز ها داخل پوشه Program Files پوشه ای بنام Common Files وجود
دارد.
حالا فرض کنیم که شما فایلی بنام xxx.exe دارید و میخواهید این فایل توسط یک فایل Batch ، به داخل همین پوشه
کپی شود. با روش هائیکه تاکنون یاد گرفته ایم ، مسلما" دستور زیر را بکار می برید:
Copy xxx.exe C:\Program Files\Common Files
حالا اگر دستور بالا را اجرا کنید فایل کپی نخواهد شد. دلیلش دو مطلب است:
1. فایل Batch نامی را که بین حروفش فاصله خالی باشد نمی شناسد.
2. فایل Batch موقع کار با نام هائیکه بیش از 8 کاراکتر داشته باشد مشکل دارد.
برای درک درست مطلب بجای دستور بالا دستورات زیر را اجرا کنید:
حال اگر فایل Batch را اجرا کنید خواهید دید که پیغام میدهد که . The syntax of the command is incorrectکد:@ECHO OFF
Copy xxx.exe E:\Program Files\Common Files
pause
می بینید که گفته دستور غلط است.ولی دستور غلط نیست بلکه همانگونه که گفتم فایل Batch نامی را که بین حروفش
فاصله خالی باشد نمی شناسد. و در مثال بالا بین Program و Files ( و همچنین مابین Common و Files ) فاصله خالی
وجود دارد که فایل Batch قادر به شناسائی آن ها نیست.
روش کار این است که در موارد اینگونه ، فرضا" در مثال بالا ، آدرس مورد استفاده را مابین علایم " " محصور کنیم.
یعنی برای مثال بالا باید دستور را بصورت زیر بنویسیم تا اجرا شود:
کد:Copy xxx.exe "C:\Program Files\Common Files"
Environment Variables
=============
در بحث هایمان بویژه موقع کار با دستور Set با چند مورد استفاده از متغیر ها در برنامه نویسی با Batch آشنا شدیم. و در
اینجا بیشتر در اینمورد صحبت می کنیم.
متغیر ها دو نوع هستند یک نوع آن هائی هستند که خودمان تعیین میکنیم مثل مثال هائیکه موقع کار با دستور Set
دیدیم.
ولی نوع دیگری از متغیر ها هستند که در سیستم وجود دارند و فایل Batch آن ها را می شناسد و نیازی به معرفی
آن ها نیست. اینگونه متغیر ها را Environment Variables مینامند.برای درک بهتر این نوع متغیر ها به مثال زیر توجه
کنید.
دستور استفاده شده در مثال بالا روش درستی نیست. همانطور که قبلا" گفتم ، فایل Batch تعدادی متغیر سیستمی
را می شناسد . برای نمونه از نظر فایل Batch عبارت %COMMONPROGRAMFILES% مشابه آدرس گفته شده در بالا
یعنی ....\Program Files\Common Files می باشد
بصورت دیگر ما میتوانیم عوض استفاده از دستور طولانی بالا از دستور ساده زیر استفاده کنیم:
متغیر استفاده شده در بالا یکی از متغیر های Environment Variables است.کد:Copy xxx.exe "%COMMONPROGRAMFILES%"
یادگیری این متغیر ها در خیلی از موارد لازم است .اگر به مثال زیر دقت کنید مهم بودن یادگیری آن ها را متوجه خواهید
شد.
مثال:
فرضا" میخواهیم فایل xxx.exe را به داخل پوشه C:\Documents and Settings\{username}\Application Data
(در ویندوز XP) و یا معادلش پوشه C:\Users\{username}\AppData\Roaming در ویندوز 7 کپی کنیم.
در این جا دو مسئله مهم است که بدانیم:
1. لازم نیست که آدرس طویل بالا را استفاده کنیم . هم در ویندوز XP و هم در ویندوز 7 میتوانیم بجای آدرس های طویل
بالا از متغیری بنام %APPDATA% استفاده کنیم. یعنی با اجرای دستور زیر هم در ویندوز XP و هم در ویندوز 7 کار
مورد نظر ما انجام خواهد شد:
2. اگر از متغیر نوع Environment Variables استفاده نکنیم ، بعضی مواقع حتی اگر فایل یا فایل ها به محل مورد نظرکد:Copy xxx.exe "%APPDATA%"
کپی شوند ، باز هم برنامه ما کار نخواهد کرد . به مثال زیر توجه کنید:
فرضا" لازم است که برای اجرای یک برنامه ویژه ،فایل xxx.exe به داخل پوشه Windows کپی شود. برای اینکار در حالت
عادی ( بدون استفاده از متغیر نوع Environment Variables ) مسلما" دستور زیر را استفاده میکنیم:
Copy xxx.exe C:\windows
بله این فایل به پوشه C:\windows کپی خواهد شد.ولی مسئله مهمی این جا وجود دارد که کاربرد برنامه شما را
محدود میکند.چون این برنامه فقط برای کسانی درست کار خواهد کرد که ویندوزشان در درایو C نصب شده باشد.
کسان دیگری که ویندوزشان در درایو C نصب نیست (مثل بنده که ویندوزم در درایو E نصب هست ) ، نخواهند توانست
از برنامه مورد نظر استفاده کنند.
بنابر این با این روش فقط یک عده محدودی قادر به استفاده هستند یعنی برنامه شما نقص دارد.
پس چکار باید کرد؟
اینجاست که استفاده از متغیر های نوع Environment به درد میخورند. برای این مثال برای آدرس پوشه ویندوز یک
متغیر نوع Environment بنام %SystemRoot% و جود دارد که برای مثالمان میتوانیم بصورت زیر استفاده کنیم:
خوبی این دستور این است که فایل Batch موقع اجرا وقتی به این متغیر میرسد دیگر مثل دستور بالا عمل نمیکند بلکهکد:Copy xxx.exe %SYSTEMROOT%
اول نگاه میکند تا ببیند ویندوزی که استفاده میکنید در کدام درایو است و سپس فایل xxx.exe را به داخل پوشه ویندوزی
که در حال استفاده از آن هستید کپی میکند ، فرضا" در سیستم من آن را به آدرس E:\Windows کپی میکند.
اگر عمری باشد در جلسه بعد انواع متغیر های اینگونه را هم برای ویندوز XP و هم برای ویندوز 7 ارایه خواهم کرد.
لیست تعدادی از متغیر های Environment Variables
1. در ویندوز XP
2. در ویندوز 7کد HTML:
Few environment variables in Windows XP
================================================================================
Environment Path
================================================================================
%profiledir% C:\Documents and Settings\
--------------------------------------------------------------------------------
%ALLUSERSPROFILE% C:\Documents and Settings\All Users
--------------------------------------------------------------------------------
%DifaultUserProfile% C:\Documents and Settings\Default User
--------------------------------------------------------------------------------
%USERPROFILE% C:\Documents and Settings\{username}
--------------------------------------------------------------------------------
%APPDATA% C:\Documents and Settings\{username}\Application Data
--------------------------------------------------------------------------------
%HOMEPATH% \Documents and Settings\{username}
--------------------------------------------------------------------------------
%ProgramFiles% C:\Program Files
--------------------------------------------------------------------------------
%CommonProgramFiles% C:\Program Files\Common Files
--------------------------------------------------------------------------------
%HOMEDRIVE% Root Drive ,C:\
--------------------------------------------------------------------------------
%SYSTEMDRIVE% Moves to the Root drive , C:
--------------------------------------------------------------------------------
%SYSTEMROOT% C:\WINDOWS
--------------------------------------------------------------------------------
%WINDIR% C:\WINDOWS
--------------------------------------------------------------------------------
%TEMP% and %TMP% C:\DOCUME~1\{USER}\LOCALS~1\Temp
--------------------------------------------------------------------------------
%CD% Current working directory
--------------------------------------------------------------------------------
%CMDCMDLINE% Displays Windows Version
--------------------------------------------------------------------------------
%CMDEXTVERSION% Command prompt version
--------------------------------------------------------------------------------
%COMPUTERNAME% Equivalent to hostname command
--------------------------------------------------------------------------------
%COMSPEC% C:\Windows\System32\cmd.exe
--------------------------------------------------------------------------------
%DATE% Display current date
--------------------------------------------------------------------------------
%ERRORLEVEL% Exit code for the previously executed command
--------------------------------------------------------------------------------
%NUMBER_OF_PROCESSORS% Displays number of processors
--------------------------------------------------------------------------------
%OS% Displays the name of the OS installed
--------------------------------------------------------------------------------
%PATH% Points to C:\WINDOWS\system32
--------------------------------------------------------------------------------
%PATHEXT% .COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS ; .WSF;.WSH
--------------------------------------------------------------------------------
%PROCESSOR_ARCHITECTURE% Displays the processor architecture
--------------------------------------------------------------------------------
%PROCESSOR_LEVEL% Displays the processor level
--------------------------------------------------------------------------------
%PROCESSOR_REVISION% Displays the processor revision
--------------------------------------------------------------------------------
%PROMPT% Displays the current prompt
--------------------------------------------------------------------------------
%RANDOM% Generates a random integer between 0 and 32767
--------------------------------------------------------------------------------
%TIME% Displays current time
--------------------------------------------------------------------------------
%USERDOMAIN% Displays the hostname
--------------------------------------------------------------------------------
%USERNAME% Displays the currently logged in user name
================================================================================
کد HTML:Windows 7 Environment Variables List
=============================================================================
Environment Variable Path
=============================================================================
%ALLUSERSPROFILE% C:\ProgramData
-----------------------------------------------------------------------------
%APPDATA% C:\Users\{username}\AppData\Roaming
-----------------------------------------------------------------------------
%COMMONPROGRAMFILES% C:\Program Files\Common Files
-----------------------------------------------------------------------------
%COMMONPROGRAMFILES(x86)% C:\Program Files (x86)\Common Files
-----------------------------------------------------------------------------
%COMSPEC% C:\Windows\System32\cmd.exe
-----------------------------------------------------------------------------
%HOMEDRIVE% C:
-----------------------------------------------------------------------------
%HOMEPATH% C:\Users\{username}
-----------------------------------------------------------------------------
%LOCALAPPDATA% C:\Users\{username}\AppData\Local
-----------------------------------------------------------------------------
%PROFILESDIRECTORY% C:\Users
-----------------------------------------------------------------------------
%PROGRAMDATA% C:\ProgramData
-----------------------------------------------------------------------------
%PROGRAMFILES% C:\Program Files
-----------------------------------------------------------------------------
%PROGRAMFILES(X86)% C:\Program Files (x86) (only in 64-bit version)
-----------------------------------------------------------------------------
%PUBLIC% C:\Users\Public
-----------------------------------------------------------------------------
%SystemDrive% C:
-----------------------------------------------------------------------------
%SystemRoot% C:\Windows , %WINDIR%
-----------------------------------------------------------------------------
%TEMP% and %TMP% C:\Users\{username}\AppData\Local\Temp
-----------------------------------------------------------------------------
%USERPROFILE% C:\Users\{username}
-----------------------------------------------------------------------------
%WINDIR% C:\Windows , (%SYSTEMDRIVE%\Windows)
=============================================================================
دستور FOR
======
این دستور ، دستوری بسیار مفید بوده و حداقل از نظر بنده کاربرد هایش خیلی بیشتر از اکثریت دستورات دیگر است.
متاسفانه خیلی از کاربران علاقمند دستورات Batch ، وقتی به این دستور میرسند ، با توجه به گستردگی کاربرد های
آن و عدم وجود یک آموزش مفصل و کافی در مورد آن ، نه تنها نمیتوانند آن را یاد بگیرند بلکه در کل از یادگیری دستورات
Batch ناامید شده و از خیر یاد گیری میگذرند. حتی خود بنده هم گاها" گیج چگونگی استفاده از این دستور می شوم.
من سعی میکنم در حد درک ناقص خود از این دستور ، پاره ای از کاربرد های آن را با مثال های واضح توضیح دهم. ولی
بدیهی است که فقط با مطالعه نمیتوان موفق شد ، این تمرین و تجربه هست که مهارت و تخصص و قدرت ایجاد میکند.
برای درک اولیه چگونگی کار این دستور ، به مثال زیر توجه کنید.
فرض کنید که میخواهیم توسط یک فایل Batch کاری کنیم که اعداد 1 تا 5 بترتیب نوشته شوند.ابتدائی ترین راه این
است که دستورات زیر را اجرا کنیم:
با اجرای دستوربالا پنجره ای مثل شکل زیر خواهیم داشت.کد:@ECHO OFF
echo 1
echo 2
echo 3
echo 4
echo 5
pause >nul
http://www.worldup.ir/images/ubct5uqou668cd87llty.png
همانطور که می بینید برای نشانداده شدن اعداد 1 تا 5 در 5 سطر ،تعداد پنج سطر کد نوشتیم.
حالا فرض کنید که میخواهیم بجای اعداد 1 تا 5 ، اعداد 1 تا 100 بترتیب دیده شوند. معلوم است که اگر بخواهیم از
روش بالا استفاده کنیم باید تعداد 100 سطر کد بنویسیم.و همینطور الی آخر.
مطمئنا" قبول دارید که انجام این کار خیلی وقت گیر و خسته کننده بوده و فایل Batch ساخته شده هم بسیار طویل
خواهد شد.
با استفاده از دستور FOR انجام اعمال بالا خیلی راحت و سریع میشود برای مثال دستور زیر را اجرا کنید:
در دستور بالا برای نشان دادن اعداد 1 تا 10 را فقط از یک سطر دستور استفاده کردیم.کد:@ECHO OFF
for %%A in (1 2 3 4 5 6 7 8 9 10 ) do echo %%A
pause >nul
البته این ساده ترین روش اجرای دستور FOR است و ما با دستور های کوتاهتر دیگری هم میتوانیم این کار را انجام
دهیم که در موردشان صحبت خواهم کرد. ولی قبل از ورود به بحث های مربوطه ، لازم میدانم که در اینجا دستور بالا
را کاملا" تشریح کنم تا درک اولیه در مورد کاربرد های دستور FOR را بدست بیاوریم.
__ در ابتدای دستور یک سطری بالا اول کلمه FOR آمده است.
__ بعد از آن حرف A را بعنوان متغیر قرار داده ایم که در فایل Batch باید قبل از نام متغیر دوتا علامت %% را بگذاریم تا
فایل Batch بداند حرف A یک متغیر است. شما میتوانید بجای حرف A هر حرف دیگر دلخواهتان را قرار دهید.
__ بعد از نام متغیر داخل پرانتز اعداد 1 تا 10 را پشت سر هم و با یک فاصله قرار داده ایم. محتوای پرانتز ، لیست
(List) نامیده میشود.
__ بعد از پرانتز با یک فاصله دستور do قرار داده شده است
__ و در انتها دستور echo %%A نوشته شده است
حال ببینیم منظور از تک تک نوشته های بالا چیست.
با دستور بالا به FOR میگوییم که به داخل لیست (در این مثال اعداد داخل پرانتز ) نگاه کند سپس اولین موجودی لیست
(یعنی عدد 1 را در این مثال) در داخل متغیر A قرار داده و سپس بپرد و دستوری را که بعد از do نوشته شده اجرا کند.
در این مثال دستور عبارت از echo %%A است که عدد موجود در داخل متغیر A را نشان خواهد داد (که ما عدد 1 را
در صفحه خط فرمان خواهیم دید).
دستور FOR وقتی عمل بالا انجام شد دوباره به اول بر خواهد گشت. و کار را دوباره تکرار خواهد کرد با این فرق که این
دفعه عدد دوم از لیست یعنی عدد 2 را داخل متغیر A ذخیره خواهد کرد ... بعد ما عد 2 را خواهیم دید.
دستور FOR این عمل را تا آخرین موجودی لیست ( یعنی عدد 10 در این مثال) تکرار کرده و بعد بسته خواهد شد.
امیدوارم توانسته باشم طرز کار این دستور را درست و مفهوم تشریح کنم.
در جلسات بعد با نکات بیشتری آشنا خواهیم شد.
سلام
استاد عزيز قبلش از سوال پيشپا افتادهام عذرخواهي ميکنم!
با وجود استفاده از دستور pause، چرا پنجره بسيار سريع باز و بسته ميشه؟ (طوريکه محتواش خونده نميشه!)
درضمن چرا با وجود سرعت بيشتر در خوندن فرمت cmd که windows NTcommand Script هست از فرمت bat که MS-DOS Batch File هست استفاده ميشه؟
سپاس
ادواردوی عزیز:
1. در پست شماره 8 عرض کردم:
2. این عیب که با وجود بودن دستور pause باز هم صفحه خط فرمان دیده نشده و بسرعت بسته میشود به چند عامل بستگی دارد:نقل قول:
__ یک فایل Batch باید دارای پسوند bat باشد ولی اگر در ویندوز بجای پسوند bat از پسوند cmd استفاده کنید ، فایل
Batch بهتر و سریعتر کار خواهد کرد.
_ نوشته های شما در داخل فایل Batch اشکال دارد.
__ یک عاملی در سیستم شما باعث عدم اجرای دستور میشود.
_...
بهر حال یک راه برای مشاهده دستورت بالا این است که وارد خط فرمان ویندوز شده و سپس دستور بالا را با مختصر
تفاوت زیر وارد کرده و سپس کلید Enter را فشار دهید:
اگر توجه کرده باشید در فایل Batch از علامت %% برای متغیر استفاده کردیم ولی در خط فرمان باید از علامت % استفاده شود.کد:for %A in (1 2 3 4 5 6 7 8 9 10 ) do echo %A
البته در این روش هم دستورات اجرا شده را خواهید دید و هم نتیجه یعنی نشان داده شدن اعداد را.
راه دیگر این است که فایل Batch (مثلا" xx.cmd ) را در روت درایو فرضا" D قرار داده و سپس در خط فرمان ویندوز دستور زیر را تایپ
کرده و کلید Enter را بزنی:
D:\xx.cmd
نتیجه بشکل زیر خواهد بود:
http://www.worldup.ir/images/ajr6hekflysg0naix5.png
راه دیگر این است که یک فایل Batch با دستور زیر اجرا کنید که پس از اجرا خواهید دید فایلی بنام aaa.txt در کنار فایل Batch ساخته
شده که در داخلش اعداد 1 تا 10 نوشته شده است:
لطفا" نتیجه کار را اعلام فرمائیدکد:for %%A in (1 2 3 4 5 6 7 8 9 10 ) do echo %%A >>aaa.txt