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

شرطی سازی در بچ اسکریپت

Avatar photo
برنامه نویس MERN Stack
شرطی سازی در بچ اسکریپت

با استفاده از ویژگی شرطی سازی در بچ اسکریپت میتوان یک برنامه یا دستور را طبق شرایط مشخص شده اجرا و یا متوقف نمود. مثلا برنامه ای بنویسید که اگر دستور X به درستی ایجاد نشد برنامه اول اجرا شود در غیر این صورت برنامه دوم اجرا شود. در واقع با شرطی سازی مشخص میکنید برنامه، دستور و یا کد مد نظر شما در چه شرایطی اجرا شود. برای شرطی سازی در بچ اسکریپت از دستور if استفاده میشود در ادامه همراه با نووا بلاگ باشید.

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

در ادامه فهرستی از کارهای که میتوان با دستور IF انجام داد را مشاهده میکنید:

یک: بررسی صحت عملکرد برنامه یا Script که قبل از دستور IF اجرا شده است.

IF [NOT] ERRORLEVEL number command

دو: بررسی و مقایسه دو رشته (String) با یکدیگر.

IF [NOT] string1==string2 command

سه: بررسی از وجود داشتن یا عدم وجود فایلها و پوشه ها.

IF [NOT] EXIST filename command

حال بگذارید عناصر موجود در دستورات IF را توضیح دهم:

  1. از کلمه NOT برای معکوس نمودن عملکرد دستور IF استفاده میشود. یعنی اگر قرار است وجود یک فایل بررسی شود با اضافه نمودن عنصر NOT عدم وجود آن فایل بررسی میشود. (استفاده از عنصر NOT کاملا اختیاری میباشد)
  2. از عنصر ERRORLEVEL برای بررسی کد برگشتی دستور یا برنامه ای که قبل از دستور IF اجرا شده استفاده میشود.
  3. بجای Number باید از کد برگشتی مناسب استفاده کنید در واقع کدی که وارد میکنید با کد برگشتی که نتیجه اجرای برنامه قبل است مقایسه میشود. (استفاده از عنصر Number ضروری است)
  4. بجای Command باید دستور مورد نظر خود را وارد کنید. در صورتی که شرایط مورد نظر شما فراهم باشد دستور مشخص شده در بخش Command اجرا میشود. (استفاده از Command اجباری میباشد)
  5. رشته یا String1 در واقع یک مقدار برای بررسی و مقایسه آن با String2 میباشد. از این طریق میتوان دو مقدار یا String را با یکدیگر مقایسه نمود. (وجود دو String یا مقدار کاملا اجباری است)
  6. از عنصر Exist برای بررسی کردن وجود فایلها و پوشه ها استفاده میشود. (استفاده از عنصر Exist اجباری است.)

نکته: هر دستور یا برنامه ای که در CMD و Batch فایل اجرا میشود یک کد برگشتی دارد این کد مشخص میکند برنامه به درستی اجرا شده یا با خطا مواجه شده است. معمولا کد برگشتی 0 بیانگر اجرای صحیح برنامه ها است و کد برگشتی 1 به بالا بیانگر خطا میباشد.

بررسی عملکرد برنامه ها با عنصر ERRORLEVEL

همانطور که گفتم برای اینکه از صحت عملکرد یک برنامه مطمئن شویم باید از دستور IF به همراه عنصر ERRORLEVEL استفاده کنیم. به مثال زیر توجه کنید:

@Echo off
 Ping 4.2.2.4
 IF ERRORLEVEL 1 ECHO Your Ping Was Failed
 Pause 

در اسکریپت بالا گفته شده، ابتدا برنامه Ping آدرس 4.2.2.4 را بررسی کند سپس در دستور بعد گفته شده اگر کد برگشتی دستور قبل (Ping) برابر با عدد 1 بود با دستور ECHO پیام Your Ping Was Failed را نمایش بده.

همانطور که گفتم دستور IF برای اجرای شرطی برنامه ها استفاده میشود یعنی با دستور IF میتوان برای هر دو حالت اجرای یک برنامه تصمیم گیری نمود. مثلا گفت در صورتی که عملکرد برنامه Ping با موفقیت رو برو شود پیام Your Ping Was Success را نمایش بده اما در صورتی که با خطا مواجه شد پیام Your Ping Was Failed را نمایش بده، برای مثال:

@ECHO OFF
 TITLE IF COMMDND
 COLOR 0A
 MODE CON COLS=80 LINES=25
 PING 4.2.2.4
 IF ERRORLEVEL 1 (
           ECHO YOUR PING WAS FAILED
 ) ELSE (
           ECHO YOUR PING WAS SUCCESS
 )
 PAUSE 

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

شرطی سازی در بچ اسکریپت
شرطی سازی در بچ اسکریپت

استفاده از روش بالا برای بررسی از صحت عملکرد برنامه ها خیلی عاقلانه نمیباشد چرا که با این روش دقیقا نمیتوان کد برگشتی را مشخص نمود. در واقع منظور از IF ERRORLEVEL 1 عدد 1 به بالا است (2 – 3 – 4 – 5 و …) نه فقط خود عدد 1 به همین خاطر برای بررسی دقیقتر نیاز به استفاده از روش دیگری میباشد که در آن فقط عدد 0 یا عدد مشخص شده بررسی شود.

دستور IF دارای پنج Compare-op یا Operator برای بررسی هوشمندانه تر کدهای برگشتی و … میباشد. استفاده از Compare-op ها به شما اجازه میدهد فقط خود عدد و  اعداد بالاتر و پایین تر کدها را نیز بررسی کنید. در ادامه اسم این Compare-op ها را مشاهده میکنید:

EQU – Equal

NEQ – Not Equal

LSS – Less Than

LEQ – Less Than or Equal

GTR – Greater Than

معنای Compare-op های بالا از قرار (EQU یعنی مساوی است با) – (NEQ یعنی مساوی نیست با) – (LSS یعنی کمتر است از) – (LEQ یعنی کمتر یا مساوی است با) – (GTR یعنی بزرگتر است از) میباشد.

همانطور که گفتم دستور IF ERRORLEVEL 1 نمیتواند به صورت دقیق شما را از صحت عملکرد برنامه ها مطلع کند. اما با استفاده از Compare-op ها این مشکل برطرف شده و شما میتوانید دقیقا فقط یک کد را بررسی کنید. به مثال زیر توجه کنید:

@ECHO OFF
 TITLE USE IF COMMAND WITH COMPARE-OP
 COLOR 0F
 MODE CON COLS=110 LINES=18
 PING 4.2.2.4 -n 2
 IF %ERRORLEVEL% NEQ 0 (
           ECHO Operation Failed
 ) ELSE (
           ECHO Operation Successful
 )
 PAUSE 

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

شرطی سازی در بچ اسکریپت
شرطی سازی در بچ اسکریپت

در اسکریپت بالا ابتدا با دستور Ping ارتباط با آدرس 4.2.2.4 بررسی میشود سپس با دستور IF %ERRORLEVEL% NEQ 0 مقدار موجود در Variable یا متغیر %ERRORLEVEL% با عدد 0 مقایسه شده سپس در صورتی که مقدار موجود در متغیر %ERRORLEVEL% با عدد 0 برابر نبود پیام Operation Failed نمایش داده میشود در غیر این صورت پیام Operation Successful نمایش داده میشود.

مقایسه دو رشته یا String با یکدیگر

یکی از کاربردهای دستور IF بررسی و مقایسه دو رشته یا String با یکدیگر میباشد. برای مقایسه کردن دو رشته با یکدیگر باید از دو علامت مساوی == در بین رشته ها استفاده کنید. برای مثال:

IF %TMP% == C:\Users\Home\AppData\Local\Temp Echo Both String Are Same

در دستور بالا گفته شده اگر مقدار یا محتوای متغیر %TMP% با آدرس C:\Users\Home\AppData\Local\Temp یکی بود پیام Both String Are Same را با دستور ECHO نمایش بده.

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

@ECHO OFF
 TITLE COMPARE TWO STRINGS
 COLOR 0F
 MODE CON COLS=110 LINES=18
 ECHO PLEASE TYPE PASSWORD AND PRESS ENTER:
 SET /P PASSWORD=
 IF %PASSWORD% == TMLMANAGER ECHO RIGHT YOUR PASSWORD WAS TRUE
 PAUSE 

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

شرطی سازی در بچ اسکریپت
شرطی سازی در بچ اسکریپت

در اسکریپت بالا ابتدا با دستور SET /P PASSWORD یک متغیر ساخته شده که مقدار آنرا باید کاربر پایانی تعیین کند سپس با دستور IF مقدار متغیر PASSWORD که توسط کاربر پایانی وارد شده با مقدار مشخص شده در جلوی علامت های مساوی مقایسه میشود و در صورتی که هر دو مقدار یکی باشند پیام RIGHT YOUR PASSWORD WAS TRUE توسط دستور ECHO نمایش داده میشود.

بررسی موجود بودن یا عدم موجود بودن فایلها و پوشه ها

برای اینکه وجود یا عدم وجود فایلها و پوشه ها را در Batch File بررسی کنیم باید از دستور IF Exist استفاده کنیم. برای مثال:

IF EXIST %TMP% ECHO Temporary Folder Was Found

همانطور که میدانید مقدار یا محتوای متغیر %TMP% همان آدرس پوشه Temp در آدرس C:\Users\Username\AppData\Local\ میباشد. اگر بخواهیم به صورت جزئی نگاه کنیم، دستور IF EXIST به معنای “اگر وجود داشت” است سپس مقصود IF EXIST با کلمه %TMP% مشخص شده. در آخر هم دستور ECHO برای نمایش پیغام Temporary Folder Was Found استفاده شده. به زبان ساده در دستور بالا گفته شده اگر پوشه %TMP% وجود داشت پیغام Temporary Folder Was Found را نمایش دهد.

همانطور که قبلا هم گفتم شما میتوانید عملکرد دستور IF را با عنصر NOT معکوس کنید. مثلا در دستور بالا گفته شده اگر پوشه TEMP وجود داشت پیام Temporary Folder Was Found را نمایش بده برای معکوس نمودن عملکرد دستور فوق باید بعد از دستور IF از عنصر NOT استفاده کنید. برای مثال:

IF NOT EXIST %TMP% ECHO Temporary Folder Not Found

در مثال بالا بجای IF EXIST از IF NOT EXIST استفاده شده که به معنای “اگر وجود نداشت” میباشد (متضاد دستور IF EXIST) سپس از کلمه %TMP% به عنوان مقصود IF NOT EXIST استفاده شده و در آخر هم از دستور ECHO برای نمایش پیام Temporary Folder Not Found استفاده شده. پس در کل کار دستور بالا بررسی کردن عدم وجود پوشه %TMP% میباشد. تا در صورت عدم وجود پوشه %TMP% پیغام Temporary Folder Not Found نمایش داده شود.

شما میتوانید کل دستور IF را در یک سطر از فایل Batch تایپ کنید یا اینکه آنرا در چند سطر تایپ کنید. در صورتی که دستور IF را در چند سطر تایپ کنید، قادر خواهید بود چندین عملکرد مختلف را با یک دستور IF انجام دهید اما در صورتی که کل دستور را در یک سطر تایپ کنید فقط دو عملکرد را میتوانید مشخص کنید. به مثال زیر توجه کنید:

@ECHO OFF
 TITLE USE IF COMMAND IN ONE LINE
 COLOR 0A
 MODE CON COLS=80 LINES=25
 IF EXIST C:\Windows\Explorer.exe. (RD /S /Q %TMP%.) ELSE (ECHO THE Explorer.exe File Was Not Found)
 PAUSE 

همانطور که در دستور بالا مشاهده میکنید ابتدا وجود فایل Explorer.exe بررسی میشود سپس در صورتی که فایل Explorer.exe وجود داشت دستور RD پوشه %TMP% را حذف میکند. در غیر اینصورت دستور ECHO پیام THE Explorer.exe File Was Not Found را نمایش میدهد. همانطور که متوجه شدید فقط دو عملکرد انجام میشود یک در صورتی که شرایط مشخص شده توسط دستور IF فراهم باشد دو در صورتی که شرایط مشخص شده فراهم نباشد. حال بگذارید نحوه استفاده از دستور IF را در بیش از یک سطر نشان دهم:

@ECHO OFF
 TITLE USE IF COMMAND
 COLOR 0A
 MODE CON COLS=80 LINES=25
 IF EXIST C:\WINDOWS\EXPLORER.EXE (
           ECHO EXPLORER.EXE FOUND IN %HOMEDRIVE%
           RD /S /Q %TMP%
           IF %ERRORLEVEL% EQU 0 ECHO ALL DATA IN TEMP FOLDER WAS EARSED!
 ) ELSE (
           ECHO EXPLORER.EXE NOT FOUND
           ECHO PLEASE MAKE SURE YOU ARE IN RIGHT WAY
           ECHO THANKS FO WATCHING!
 )
 PAUSE

همانطور که در اسکریپت بالا مشاهده میکنید برای هر وضعیت سه دستور مشخص شده که البته محدودیتی در اضافه نمودن دستورات بیشتر به این وضعیت ها وجود ندارد. جدا از اضافه نمودن دستورات عادی در هر وضعیت شما میتوانید دوباره از دستور IF برای شرطی سازی بیشتر استفاده کنید. تا در صورتی که شرایط لازمه فراهم شد برنامه مورد نظر شما اجرا شود. به مثال زیر توجه کنید:

@ECHO OFF
 SETLOCAL ENABLEDELAYEDEXPANSION
 TITLE IF COMMAND IN IF
 COLOR 0A
 MODE CON COLS=80 LINES=25
 ECHO PLEASE WAIT...
 PING GOOGLE.COM
 IF %ERRORLEVEL% NEQ 0 (
                 CLS
                 ECHO PLEASE WAIT...
                 PING 4.2.2.4
                 IF !ERRORLEVEL! NEQ 0 (
                                 CLS
                                 ECHO YOU HAVE NO INTERNET CONNECTION
                                 ) ELSE (
                                 CLS
                                 ECHO PLEASE CHECK YOUR DNS ADDRESS
                                 )
                 ) ELSE (
                 CLS
                 ECHO YOU HAVE INTERNET ACCESS
                 )
 PAUSE 

در اسکریپت بالا ابتدا با دستور PING GOOGLE.COM ارتباط با سایت گوگل بررسی میشود سپس در خط بعد با دستورIF گفته شده اگر عملکرد دستور PING با خطا مواجه شد دستورات مشخص شده اجرا شوند که دستور IF هم در بین این دستورات است در دستور IF دوم گفته شده اگر متغیر !ERRORLEVEL! با عدد صفر برابر نبود پیام YOU HAVE NO INTERNET CONNECTION نمایش داده شود در غیر اینصورت پیام PLEASE CHECK YOUR DNS ADDRESS نمایش داده شود.

شاید بپرسید: چرا در دستور IF دوم متغیر ERRORLEVEL در بین دو علامت !! تعجب قرار گرفته است؟ جواب به فصل دوم بخش دستور SETLOCAL برمیگردد در آنجا گفته شد VARIABLE ها تا تجزیه نشوند قابل استفاده نیستند همانطور که در دستور بالا مشاهده میکنید متغیر ERRORLEVEL دوم در دستور IF اول میباشد پس هنوز دستور IF اول به پایان نرسیده است که محتوای ERRORLEVEL دستور IF دوم جایگزین محتوای ERRORLEVEL دستور IF اول شود به همین خاطر نیاز است تا از ویژگی ENABLEDELAYEDEXPANSION استفاده کنیم و ERRORLEVEL دوم را در بین دو علامت تعجب قرار دهیم تا محتوای ERRORLEVEL دوم نمایش داده شود.

اطلاعات تکمیلی در مورد دستور IF

یکی از کاربردهای دستور IF بررسی مقدار Variable ها میباشد. شما میتوانید با استفاده از عنصر Defined مقدار یا محتوای یک متغیر را بررسی کنید و از وجود داشتن آن Variable مطمئن شوید. نحوه بررسی وجود Variable ها به شکل زیر است:

IF DEFINED TEMP ECHO THE TEMP VARIABLE HAVE VALUE

در دستور بالا گفته شده اگر متغیری به نام TEMP وجود داشت پیام THE TEMP VARIABLE HAVE VALUE را با دستور ECHO نمایش بده.

به صورت عادی اگر بخواهید دو رشته را با یکدیگر مقایسه کنید بزرگ و کوچک بودن حروف در مقایسه موثر است یعنی مثلا کلمه tmlmanager با کلمه TMLMANAGER متفاوت است برای اینکه تاثیر حروف بزرگ و کوچک انگلیسی را از بین ببریم باید از پارامتر /I استفاده کنید. برای مثال:

IF /I tmlmanager == TMLMANAGER ECHO BOTH STRING ARE SAME

یکی دیگر از روشهای مقایسه حروف و اعداد استفاده از دستور IF به همراه Compare-Op ها میباشد. برای مثال:

IF 20 GTR 19 ECHO NUMBER WAS BIGGER

در دستور بالا گفته شده اگر عدد 20 بزرگتر از عدد 19 بود پیام NUMBER WAS BIGGER را نمایش بده.

از دیگر گزینه های که مربوط به دستور IF میشود و باید در این فصل به آن اشاره کنم CMDEXTVERSION میباشد. با دستور IF میتوان نسخه COMMAND EXTENSION CMD را توسط CMDEXTVERSION برسی نمود. برای این بررسی کافیست از دستور زیر به همراه زیر CMDEXTVERSION استفاده کنید. برای مثال:

IF CMDEXTVERSION 2 ECHO YOU ARE USING LAST VERSION OF COMMAND EXTENSION

در دستور بالا گفته شده اگر CMDEXTVERSION برابر عدد 2 یا بالاتر بود پیام YOU ARE USING LAST VERSION OF COMMAND EXTENSION نمایش بده.

66 پاسخ به “شرطی سازی در بچ اسکریپت”

  1. Avatar photo M@hdi گفت:

    خیلی ممنون کامل بود بطوریکه نیازم رفع شد در این زمینه

  2. Avatar photo ستاره گفت:

    سلام.میخام برنامه ای بنویسم که چک کنه اگر macid برنامه برابر مک ایدی سیستم بود ی فایل اکسل اماده رو برامون باز کنه در غیر اینصورت از برنامه خارج بشه.میتونین کمک کنید؟

  3. Avatar photo ستاره گفت:

    سلام ممنون که پاسخ دادین.من به جای 1 ها مک ایدی سیستمم رو وارد کردم و به جای EXCELFILE ادرس فایل اکسل به همراه نام و پسوند ولی موقع اجرا فقط از برنامه خارج میشه؟؟!!!
    IF %MACADDRESS%==MACID SYSTEMAM START d:\bank11.xlsx
    میشه بگین ایراد برنامه ام کجاست؟ممنونم

    • سلام خواهش میکنم
      کلا چند تا اشتباه داشتید:
      1- کلمه SYSTEMAM چیه؟ باید از DO برای اجرای دستور مورد نظر تون استفاده کنید.
      2- قبل از این دستور باید از دستور for برای پیدا کردن MAC Address های سیستم تون استفاده کنید.

      @ECHO OFF
      TITLE COMPARE MAC ADDRESS
      COLOR 0A
      FOR /F “USEBACKQ TOKENS=2 DELIMS=:” %%A IN (`IPCONFIG /ALL ^| FIND /I “PHYSICAL ADDRESS”`) DO (
      @ECHO %%A >>MACLIST
      )
      TYPE MACLIST | FIND “11-11-11-11-11-11” && START CALC
      DEL MACLIST >NUL

      • Avatar photo ستاره گفت:

        MACID SYSTEMAM منظورم اینه که مک ایدی سیستم خودم رو نوشتم.

      • Avatar photo ستاره گفت:

        همین برنامه رو کپی پبست کردم و ادرس مک ایدی سیستم خودم رو نوشتم ولی بازم فقط از برنامه خارج میشه!!!!

        • اگر متن برنامه رو از سایت کپی پیست کنید تو فایل text برنامه اجرا نمیشه چون علامت های Quotation Mark رو صحیح کپی نمیکه پس باید اول علامت های Quotation Mark (“”) رو حذف کنید و به صورت دستی تایپشون (“”) کنید.

    • کلا میتونید از اسکریپت بالا استفاده کنید فقط باید بجای مک آدرس 11-11-11-11-11-11 مک آدرس مورد نظر خودتون رو جایگزین کنید.

      • Avatar photo ستاره گفت:

        برنامه رو میشه توضیح بدین؟ MACID برنامه برابر MACID سیستم بود باید ی فایل اکسل رو باز کنه اونو کجا تعریف کنم؟؟؟

        • Avatar photo ستاره گفت:

          بجای CALC که برنامه ماشین حساب رو باز میکنه ادرس فایل اکسل رو میدم ولی بازم اجرا نمیشه.حتی خود CALC هم اجرا نمیشه.”:(

          • برنامه ای که براتون ارسال کردم اول همه MAC ADDRESS های سیستم رو بررسی میکنه و از اونها یک فهرست با نام MACLIST تهیه میکنه بعد اگه MAC ADDRESS شما را از فهرست پیدا کرد با دستور START برنامه مورد نظر شما را اجرا میکنه
            فایل متنی برنامه رو با فرمت .TXT براتون ارسال مینکم خودتون بررسی کنید باید بخش MAC ADDRESS و آدرس برنامه EXCEL رو عوض کنید. اگر باز هم نتونستید انجام بدید مسیر نصب برنامه EXCEL رو به همراه MAC ADDRESS مورد نظرتون رو بگید تا برنامه رو شخصی سازی کنم.
            لینک برنامه: http://files.tml-manager.ir/dl/MAC.zip

  4. Avatar photo ستاره گفت:

    بی نهایت از لطفتون ممنونم.فقط ی سوال دیگه با اجازتون:
    برنامه اجرا شد صفحه cmd مک ایدی رو نشون میده و باز میمونه همزمان فایل اکسل رو هم باز میکنه.چجوری میتونم ویرایشش کنم که اگه فایل اکسل رو باز کرد دیگه صفحه cmd بسته بشه.ممنونم

  5. Avatar photo ستاره گفت:

    با سلام
    دوتا سوال دیگه برام مطرح شد که به اجازه تون میپرسم:
    1- دستور pause رو حذف کردم ولی وقتی فایل اکسل باز میشه صفحه cmd همچنان مک ادرس رو نشون میده و باز میمونه.دستوری که صفحه cmd همزمان با باز شدن اکسل بسته بشه چیه؟با دستور IF میشه؟ اگه میشه چجوری؟
    2- چجوری میتونه به جای یک مک ایدی چندین مک ایدی رو چک کنه؟ یعنی روی چندین سیستم قابل اجرا باشه.

    • سلام
      دستور CALL رو با دستور START عوض کن تا بعد از اجرای فایل EXCEL برنامه به کار خودش ادامه بده و متوقف نشه
      برای اینکه بتونید چند تا سیستم رو اضافه کنید باید خط مربوط به دستور TYPE MACLIST رو به صورت کامل چند بار کپی پیست کنید و MAC ADDRESS های مرود نظرتون رو جایگزین کنید.
      در ضمن به زودی کتاب آموزش BATCH PROGRAMMING رو هم روی سایت قرار میدم.

  6. Avatar photo ستاره گفت:

    سلام.من خیلی معذرت میخام که انقد سوال میکنم ولی
    من ی فایل اکسل دارم میخام
    1- کاربرانم دسترسی مستقیم بهش نداشته باشن.
    2-روی هر سیستم اجرا نشه فقط رو سیستم هایی که مک ایدیشون رو تعریف میکنم اجرا بشه
    3-یک برنامه ی دیگه بره اون رو باز کنه
    با برنامه ای که قبلا با کمکتون نوشتیم نمیشه.راه حلی برام دارین؟
    ممنون

  7. سلام خواهش میکنم عیبی نداره
    پس در کل یک برنامه ای لازم دارید که فایل excel شما رو طبق MAC Address های که براش تعریف کردید فراخوانی کنه درسته؟
    بهترین حالت اینکه این برنامه رو با C# بنویسید ولی نیاز داره شما زبان C# رو یاد داشته باشید.
    با همین Batch Programming هم میتونید اینکار رو انجام بدید فقط باید به درستی قواعدش رو رعایت کنید.
    مشکل برنامه ای که براتون ارسال کردم چی بود؟ با چه خطایی مواجه میشید یا چطور برنامه رو اجرا میکنید؟

    • Avatar photo ستاره گفت:

      سلام.وقت بخیر
      درسته برنامه ای هم ک الان با کمک شما نوشتیم همین کار رو میکنه فقط مشکل اینجاست که فایل اکسل رو باید همراه برنامه به کاربران ارائه بدم تا برنامه اجرا بشه.
      با سی شارپ هم بلدم برنامه اشو ولی فایل نباید exe باشه.

      • سلام
        فکر نمیکنم بتونی بدون استفاده از فایل EXE کاری از پیش ببری
        تو بهترین حالت باید با InstallShield یک فایل نصبی درست کنی که توش فایل Excel رو به صورتی مخفی سیستمی دربیاره و در یکی از پوشه های اصلی ویندوز کپی کنه و از فایل Bat یک Shortcut بزاری روی Desktop و از فایل bat فایل Excel رو فراخوانی کنی

    • Avatar photo ستاره گفت:

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

  8. Avatar photo عرفان گفت:

    سلام و خسته نباشید
    میخواستم یه کمکی بکنید
    تعداد بسیار زیادی فایلهای اسکن شده با پسوند JPG دارم که به روش زیر نام گذاری شده اند
    عدد_عدد_عدد_حروف انگلیسی
    که همه در یک فولدر هستند برای مرتب سازی میخواستم برنامه ای بنویسم که بیاید عدد آخر نام هر عکس را بخواند و فولدری با آن نام بسازد و تمامی عکسهای با این سبک را در آن فولدر کپی کند و سپس در هریک از فولدرها هم با توجه به عدد اولی در نام هر عکس باز فولدری بسازد و همه عکسهایی با این سبک را در فولد مربوطه کپی کند و در نهایت نام هر یک از عکسها را به عدد دوم موجود در نام آنها تغییر دهد.
    یعنی اگر نام عکسی
    2017_165_91_e
    است. آن را در فولدر 2017 و در داخل ان فولدر نیز فولدر 91 را ساخته و آن عکس را با تغییر نام به 165 در این فولدر کپی کند.
    و این اتفاق برای همه عکسها بیفتد.
    با عرض پوزش از طولانی شدن سوال

    • سلام عرفان جان
      باید از دستور for به همراه دستور set برای ساخت چنین برنامه ای درست کنید.
      اول با دستور for نام کلیه فایلها رو دریافت کنید سپس با دستور set از هر فایل چهار تا Variable درست کنید که این Variable ها شامل نام خود فایل و چهار حرف اول نام فایل و سه حرف دوم نام فایل و دو حرف دوم نام فایل هستند
      در آخر با دستور if باید به صورت شرطی پوشه ها رو درست کنید و فایلها رو به پوشه ها انتقال بدید.
      کار خیلی سختی نیست ولی اگر دوست داشته باشید میتونم براتون کامل بسازمش، اما از مشکلات احتمالی اینکه نباید تعداد کاراکتر های هر Variable از انچه که ما مشخص میکنیم بیشتر بشه
      مثلا اگر اسم فایل شما 2017_165_91_e باشه همه فایلهای شما باید با همین تعداد کاراکتر باشن مثل:
      2016_135_92_ffasd یا 2017_265_11_fas و …

      • Avatar photo عرفان گفت:

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

  9. Avatar photo فاطمه گفت:

    با سلام و ضمن تشکر از سایت خوبتان
    میخواستم بدانم چطور میتوان با دستور if کاری کرد که اگر مثلا عبارت GLPAYU8HT0J29F در یک فایل با پسوند تکست txt موجود باشد انگاه بیاید چندتا دستور را انجام بدهد مثلا فلان فایل را از پوشه فلان پاک کند و یک فایل دیگر را در جای دیگر کپی کند و همینطور چند دستور دیگر را انجام دهد
    و اگر هم عبارت GLPAYU8HT0J29F در ان فایل تکست موجود نبود انگاه مثلا بنویسد ان عبارت موجود نیست
    ممنون میشم راهنماییم کنید

    • سلام، سلامت باشید، ممنونم از لطف تون
      شما میتونید از چندین روش اینکار رو انجام بدید. مثلا با استفاده از ترکیب دستورات type و findstr و استفاده از علامت های && برای اجرای شرطی دستورات مورد نظر تون، برای مثال:
      type C:\Windows\mytext.txt | find “GLPAYU8HT0J29F” && goto :subrutine
      در دستور بالا گفته شده اگر متن GLPAYU8HT0J29F در فایل mytext.txt پیدا شد با دستور goto وارد بخش subrutine شو و دستورات بخش subrutine رو اجرا کن اما در غیر اینصورت ادامه دستورات رو اجرا کن، که میتونید در بخش subroutin دستورات مورد نظر تون رو وارد کنید و در ادامه هم دستور echo GLPAYU8HT0J29F not found رو بزارید.
      و یا اینکه بجای goto :subrutin از دستور set استفاده کنید و یک Variable بسازید سپس با دستور if متغیر رو بررسی کنید و در صورتی که متغیر وجود داشت دستورات مورد نظر شما انجام بشن در غیر اینصورت پیغام که گفتید به نمایش در بیاد.
      یا اینکه میتونید از دستور for /f برای تجزیه فایل متنی مورد نظر تون استفاده کنید.
      باز هم اگر احساس کردید نمیتونید برنامه رو درست کنید از بخش تماس با ما سایت نیازتون رو ارسال کنید تا اسکریپت رو براتون آماده کنم.
      تمامی این مسائل رو هم در کتاب آموزش گام به گام Batch Script توضیح دادم که میتونید تهیه کنید.
      موفق و پیروز باشید.

  10. Avatar photo حسین اردستانی گفت:

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

    • سلام
      شما به یک برنامه ای نیاز دارید که بعد از متصل شدن به کامپیوتر خودکار یک برنامه رو اجرا کنه و اون برنامه پورت مربوطه رو مسدود کنه درسته؟
      بعد از ویندوز 7 به بعد این کار تقریبا غیر ممکن شده به این خاطر که به طور کلی ویژگی Autorun هم غیر فعال شده است. مگر اینکه از قبل تنظیمات AutoPlay اون سیستم شخصی سازی شده باشه.
      باز هم اول نیازه کاربر فلش رو اجرا کنه بعد به واسطه فایل Autorun.inf برنامه بررسی و مسدود کننده پورت فلش اجرا بشه
      در واقع شما باید یک برنامه بسازید که روی کامپیوتر مورد نظر نصب بشه و در صورتی که Unique Identifier سی پی یو با اونچه که در برنامه تعریف شده یکی بود اجازه دسترسی به فلش صادر بشه
      و راحت بگم اگر اینکارها رو با Batch Script هم انجام بدید هیچ امنیتی نداره و مثل آب خوردن قابل دور زدنه 🙂
      موفق باشید.

  11. Avatar photo علی گفت:

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

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

    ما هم یه کمکی یکی دو روز پیش خواسته بودیم. مثل اینکه پاک شده احیانا درخواستمون

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

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

    ممنون از سایت خوبتون. مشکلم حل شد.

  14. Avatar photo Reza shi9b گفت:

    با عرض سلام و خسته نباشید خدمت استاد عزیز، من ی مشکلی واسم پیش اومده ک اگه کمکم کنید خیلی ممنون میشم سلطان، من وقتی با پایتون 3 برنامه مینویسم و میخوام تبدیلش کنم ب فایل exe ارور میده، هر ترفندی هم استفاده کردم، ویندوزمم سون 64 بیتی هست، از ماژول py2exe هم استفاده کردم اما نشد، خواستم بپرسم ک ایا برنامه یا دستور بت فایلی وجود نداره ک فایل های پایتون رو به exe تبدیل کنه، اگه بتونین کمک کنین خیلی ممنون میشم چون خیلی لازم دارم، ببخشید ک طولانی شد استاد

    • سلام رضا جان، سلامت باشید
      برنامه pyinstaller رو برای تبدیل فرمت استفاده کردید؟
      اگر استفاده نکردید میتونید با برنامه pip در ویندوز نصبش کنید و از طریق خط فرمان ویندوز ازش برای تبدیل فرمت استفاده کنید.
      برای نصب pyinstaller میتونید از دستور زیر استفاده کنید:
      pip install pyinstaller
      و بعد از نصب بدون خطا میتونید از دستور pyinstaller در خط فرمان برای تبدیل برنامه های پایتون به فایلهای اجرای استفاده کنید:
      pyinstaller mypyfile.py
      اگر میخواهید فایل اجرای به صورت یک پکیج ارائه بشه باید از پارامتر f هم استفاده کنید. برای مثال:
      pyinstaller -f mypyfile.pyw
      موفق و سربلند باشید سلطان 🙂

  15. Avatar photo Reza shi9b گفت:

    ممنون از زحمتای بی منتت استاد، بله عزیز از pyinstallam استفاده کردم، از پارامترهای f و -one file هم استفاده کردم، همشون تبدیل میشن ب فایل exe ولی وقتی فایلو اجرا میکنم ارور میزنه، البته همین ک منت گرفتین جواب دادین یک دنیا ممنون، ببخشید اگه توقع بی جایی داشتم، یا حق

  16. Avatar photo VALI گفت:

    سلام من دستورالعملی می خواستم که یک stringبایکvalue ریجستری را باهم مقایسه کند درصورتی که ok باشد کاری را انجام دهد

    • سلام
      باید از دستور reg query استفاده کنی و مقدار خروجیش رو با دستور for /f در یک متغیر ذخیره کنی بعد در حلقه for با دستور if نتیجه رو بررسی و شرطی سازی رو انجام بدی
      موفق باشید.

  17. Avatar photo hesam گفت:

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

  18. Avatar photo سیدامین گفت:

    سلام
    میخواستم یه دستور بنویسم که اگه فایل مخفی بود بره به دستور unlock اگه نبود بره به unlock اینو نوشتم. میدونم اشتباهه چون تازه کارم لطفا بگید درستش چیه.
    if EXIST “attrib -h kevin.cmd” goto lock
    if EXIST “attrib +h kevin.cmd” goto unlock

  19. Avatar photo سیدامین گفت:

    لطفا زود بگید چرا اشباهه عجله دارم ممنون میشم
    set /p a=send first password:
    set /p b=send secend password:
    set /p c=send 3rd password:
    if %a%+%c%=%b% goto amin

  20. Avatar photo قاسم حسنی گفت:

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

  21. Avatar photo nilson گفت:

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

  22. Avatar photo nilson گفت:

    من این کد رو میزنم ولی if اجرا نمیشه
    sc start “Networksdev”
    IF %ERRORLEVEL% NEQ 0 (
    sc start “Networksdev”
    )

  23. Avatar photo MOSLEM.K گفت:

    سلام. ممنون از مطالب مفیدتون. لطفا یه روش سرراست برای تبدیل فایل bat به exe ارائه بدید

    • سلام مسلم
      برنامه bat to exe رو استفاده کنید میتونید از سایت soft98 دریافتش کنید و به سادگی کدهای که نوشتید رو در برنامه کپیو در نهایت خروجی exe دریافت کنید

  24. Avatar photo ali گفت:

    سلام
    یه راه برای مقایسه دو متغیر تو cmd یاد می دین
    می خوام یه ورودی بگیرم بعد با ورودی که قبل گرفتم مقایسه کنه بگه یکیه یا نه
    مثلا

    set /p a1=
    set /p a2=
    if %a1%==%a2% echo yes
    ifNOT %a1%==%a2% echo no
    
  25. Avatar photo امیرحسین گفت:

    ممنون از سایت خوبتون
    در این صفحه وقتی میزنم بره نوشته ی بعد به قالب وردپرس هدایت می شم
    بی زحمت درستش کنید

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

    سلام

    عالی بود
    فقط GQE رو یادتون رفت (بزرگتر مساوی)

  27. Avatar photo داود گفت:

    با سلام ، میشه فایل bat ساخت که اجرا شدن یک نرم افزار رو هر نیم ساعت کنترل کنه و در صورت اجرا نشدن ، اون رو اجرا کنه؟ لطفا اگه میشه دستورش رو تایپ بفرمایین ممنون میشم

  28. Avatar photo داود گفت:

    یه سوال دیگه هم داشتم : میشه فایل bat ساخت که اتصال اینترنت رو هر یک ساعت کنترل کنه و در صورت قطع شدن ، اون یک فایل رو اجرا کنه؟ لطفا اگه میشه دستورش رو تایپ بفرمایین ممنون میشم

  29. Avatar photo داود گفت:

    سلام ، وقتتون بخیر:
    میشه فایل bat ساخت که اجرا شدن یک نرم افزار رو هر نیم ساعت کنترل کنه و در صورت عدم اجرا ، اون رو اجرا کنه؟

    یه سوال دیگه هم داشتم :
    میشه فایل bat ساخت که اتصال اینترنت رو هر یک ساعت کنترل کنه و در صورت قطع شدن ، یک فایل رو اجرا کنه؟ لطفا اگه میشه دستورش رو تایپ بفرمایین ممنون میشم

  30. Avatar photo مهدی گفت:

    سلام
    من یه برنامه درست کردم میخواهم بنویسم اگه پسورد با nhnhnh مساوی نبود بنویسه password isn’t right
    اینو نوشتم اما درست کار نمیکنه
    SET /P G=TYPE PASSWORD
    ECHO.
    ECHO.
    IF %G%==NHNHNH GOTO :DELETING
    IF %G% NEQ==NHNHNH ECHO JUST ONE MORE CHANCE
    اون IF دوم کار نمیکنه مشکلش چیه؟
    اگه لازمه کل فایل رو بفرستم؟

  31. Avatar photo Jason گفت:

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

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

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