دوره‌ های آموزشی نووا
آوریل 24, 2021

ایجاد رشته در بچ اسکریپت

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

در بچ اسکریپت رشته یا String به معنای کاراکتر های پشت سر هم است. مثلا کلمه Welcome یا کلمه Hello World هر دو یک String به حساب می آیند. برای ایجاد رشته باید از دستور set استفاده نمود. برای مثال به دستورات زیر برای ساخت یک String توجه کنید:

@ECHO OFF
 SET MESSAGE=HELLO WORLD
 ECHO %MESSAGE% 

خروجی دستورات بالا:

HELLO WORLD

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

SET EMPTY_STRING=

در دستور بالا یک String خالی با نام EMPTY_STRING ساخته شده است.

همانطور که میدانید برای بررسی از وجود یا عدم وجود Variable ها میبایست از دستور IF Defined استفاده شود تا از وجود داشتن یک Variable در فایل Batch مطمئن شد. اما برای بررسی از وجود یک String خالی نمیتوان از دستور IF Defined استفاده نمود چرا که این دستور فقط Variable های دارای محتوا را تشخیص میدهد. برای بررسی یک String خالی باید از دستور SET به همراه نام آن String در بین دو علامت Square Bracket استفاده نمود. به مثال زیر توجه کنید:

@ECHO OFF
 SET STRING=
 IF [%STRING%] == [] ECHO THE STRING WAS EXIST
 PAUSE 

الحاق چند String با یکدیگر

در فایل Batch به سادگی میتوان String ها را با هم الحاق نمود. برای مثال شما میتوانید دو String بسازید سپس String سوم را از محتوای String اول و دوم بسازید. به اسکریپت زیر توجه کنید:

@ECHO OFF
 TITLE STRING INTERPOLATION
 SET A=HTTP://
 SET B=TML
 SET C=MANAGER
 SET D=%A%%B%-%C%.IR
 ECHO %D%
 PAUSE 

خروجی اسکریپت بالا:

HTTP://TML-MANAGER.IR

تبدیل String به عدد صحیح

شما در Batch Script میتوانید یک String یا Variable را به یک عدد صحیح تبدیل کنید. برای درک بهتر این موضوع به اسکریپت زیر توجه کنید:

@ECHO OFF
 TITLE TOLNT
 MODE CON COLS=80 LINES=25
 SET VAR=9995
 SET /A VAR=%VAR%+5
 ECHO %VAR%
 PAUSE 

همانطور که در اسکریپت بالا مشاهده میکنید ابتدا یک Variable با نام VAR ساخته شده سپس با استفاده از دستور SET /A همان Variable به یک عدد صحیح تبدیل شده است.

استخراج کاراکتر های معین از یک Variable

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

SET VAR=Hello World
ECHO %VAR:~X,Y%

همانطور که در مثال بالا مشاهده میکنید ابتدا یک Variable با نام VAR ساخته شده که قرار است بخش معینی از آن نمایش داده شود. شما باید بجای X تعداد کاراکتر های که میخواهید نادیده گرفته شوند را بگذارید و بجای Y باید تعداد کاراکتر های که میخواهید نگه داشته شوند را مشخص کنید. حال مثلا برای نمایش کلمه World باید بجای X عدد پنج را بگذارید و بجای Y هیچ مقداری را معین نکنید. به مثال زیر توجه کنید:

ECHO %VAR:~5%

در دستور بالا مشخص باید 5 کاراکتر اول متغیر VAR نادیده گرفته شود. نتیجه اجرای دستور بالا:

 World

یا اگر بخواهید شش کاراکتر اول نادیده گرفته شود و فقط 2 کاراکتر بعد از آن توسط دستور ECHO به نمایش درآید باید بجای X عدد 6 را قرار دهید و بجای Y عدد 2 را، برای مثال:

ECHO %VAR:~6,2%

نتیجه اجرای دستور بالا:

BA

حال فرض کنید فقط نیاز به پنج کاراکتر آخر Variable دارید که کلمه World را تشکیل میدهد. برای اینکه کاراکتر های آخر را استخراج کنید میتوانید از راهی غیر از عمل بالا استفاده کنید آنهم بجای نادیده گرفتن کاراکتر های اول از علامت – برای برعکس کردن نمایش کاراکتر ها استفاده کنید. برای مثال:

ECHO %VAR:~-5%

نتیجه اجرای دستور بالا:

BATCH

حال اگر بعد از -5 و علامت , عدد 3 را بگذارید از پنج کاراکتر آخر فقط سه کاراکتر آن نگه داشته شده و با دستور ECHO نمایش داده میشوند. برای مثال:

ECHO %VAR:~-5,3%

نتایج اجرای دستور بالا:

BAT

حال اگر بخواهید تعدادی از کاراکتر های اول و تعدادی از کاراکتر های آخر را حذف کنید باید مقدار X را مشخص سپس مقدار Y را به همراه علامت – بگذارید. مثلا برای نادیده گرفتن شش کاراکتر اول و دو کاراکتر آخر دستور به شکل زیر میشود:

ECHO %VAR:~6,-2%

نتایج اجرای دستور بالا:

BAT

حذف کاراکتر های مشخص از Variable ها

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

SET VAR=CISCO CERTIFIED NETWORK ASSOCIATE
ECHO %VAR:X=Y%

شما باید بجای X کاراکتر های را مشخص کنید که قرار است حذف شوند و بجای Y کاراکتر های که قرار است با کاراکتر های مشخص شده در بخش X جایگزین شوند.

مثلا برای حذف کلمه CISCO باید بجای حرف X کلمه CISCO را تایپ کنید و بجای حرف Y هیچ کاراکتری را نگذارید. به دستور زیر توجه کنید:

ECHO %VAR:CISCO =%

نتایج اجرای دستور بالا:

CERTIFIED NETWORK ASSOCIATE

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

ECHO %VAR: =^|%

نتایج اجرای دستور بالا:

CISCO|CERTIFIED|NETWORK|ASSOCIATE

در Variable بالا جای کاراکتر های SPACE با کاراکتر | عوض شده است. به مثال بعدی توجه کنید:

ECHO %VAR:ASSOCIATE=PROGESSIONAL%

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

CISCO CERTIFIED NETOWRK PROFESSIONAL

در Variable بالا جای کلمه ASSOCAITE با کلمه PROFESSIONAL عوض شده است.

بررسی طول کاراکتر Variable ها و String ها

در CMD هیچ برنامه ای برای بررسی طول String ها و یا همان Variable ها وجود ندارد. اما شما میتوانید با استفاده از چند دستور به صورت دستی یک برنامه برای بررسی طول String ها درست کنید. به اسکریپت زیر توجه کنید:

@ECHO OFF
 SETLOCAL ENABLEDELAYEDEXPANSION
 TITLE CHECK STRING LENGHT
 COLOR 0A
 SET "STR=%1"
 :LOOP
 IF NOT "!STR:~%LEN%!" EQU "" (
                                   SET /A LEN+=1
                                   GOTO :LOOP
 ) ELSE (
                                   SET "STRLEN=!LEN!"
                                   ECHO YOUR VARIABLE OR STRING HAVE !STRLEN! CHARACHTERS LENGHTS^^!
                                   ENDLOCAL
 ) 

در اسکریپت بالا ابتدا با دستور SET یک متغیر به نام STR ساخته شده که محتوای آن Argument اول (%1) میباشد. سپس یک بخش به نام Loop درست شده و در آن یک دستور IF NOT نوشته شده تا مقدار محتوای متغیر STR را با مقدار یک String خالی بررسی کند و در صورتی که مقدار STR خالی نبود با استفاده از دستور SET /A یک عدد به متغیر LEN اضافه شود و پس از آن دوباره با دستور GOTO به بخش Loop برود تا دوباره فرایند مقایسه متغیر STR با String خالی بررسی شوداما اینبار به مقدار متغیر LEN یک عدد اضافه شده است که باعث میشود از چپ به راست یک کاراکتر از متغیر STR نادیده گرفته شود.

این فرایند تا زمانی ادامه دارد که به تعداد کاراکتر های STR به عدد متغیر LEN اضافه شود. مثلا اگر متغیر STR هشت کاراکتر بود فرایند GOTO :LOOP هشت بار تکرار میشود و هر بار یک عدد به متغیر LEN اضافه میشود.

در نتیجه متغیر STR مساوی با مقدار خالی میشود پس دستور IF اینبار بخش ELSE را اجرا میکند. در بخش ELSE گفته شده یک متغیر با نام STRLEN ساخته شود که مقدار آن متغیر LEN میباشد و در دستور بعد هم مقدار STRLEN با دستور ECHO به نمایش در میاید.

22 پاسخ به “ایجاد رشته در بچ اسکریپت”

  1. Avatar photo سلمان گفت:

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

    FOR /F "usebackq tokens=1 delims=." %%a in (`findstr /i _log log.txt`) do (
    echo %%a
    set log=%%a
    echo %log:~0,-4%
    )
    

    داخل log.txt لیستی از فایل های log وجود دارد
    acc_man_log
    acc_man1_log
    acc_man2_loglog_
    log_acc_man
    acc_man_log_log
    .
    ..
    و به چه صورت میتوانم تو این لیست انتخاب کنم که روی کدام اجرا بشود
    باتشکر فراوان

    • سلام، عید شما هم مبارک
      تو بچ اسکریپت تا زمانیکه وارد دستور بعدی نشده باشید متغیر های ایجاد شده توسط دستور خط جاری تجزیه (parse) نمیشن به همین خاطر از ویژگی enabledelayedexpansion استفاده میکنند تا متغیر ها در زمان اجرای دستور قابل استفاده باشند نه بعد از تجزیه شدن، کدهاتون رو باید به شکل زیر بنویسید:

      @echo off
      title using Delayed Expansion
      Setlocal EnableDelayedExpansion
      FOR /F "usebackq tokens=1 delims=." %%a in (`findstr /i _log log.txt`) do (
          echo %%a
          set log=%%a
          echo !log:~0,-4!
      )
      pause >nul
      

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

  2. Avatar photo سلمان گفت:

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

  3. Avatar photo سلمان گفت:

    سپاسگزارم
    بسیار عالی بود
    مهندس جان
    سوال که در مورد انتخاب کردن مواردی که از لیست log خروجی می‌دهند امکانپذیر ؟
    مثلاً اگر من از لیست 10 خروجی log بدست آوردم با انتخاب عدد 1,3,8 این log ها روش دستور اجرا بشه نه تمامش؟
    با سپاس فراوان

    • خواهش میکنم 🙂
      برای انتخاب باید یک معیار داشته باشید و مثلا با دستور if معیار مورد نظر تون رو بررسی کنید و اگر معیار درست بود عمل مورد نظر شما انجام بشه، یا اینکه یک counter اضافه کنید و بگید زمانیکه counter به عدد مورد نظر رسید عمل مشخص شده اتفاق بیافته، برای مثال:

      @echo off
      title Conditional
      setlocal enabledelayedexpansion
      set /a count=0
      FOR /F "usebackq tokens=1 delims=." %%a in (`findstr /i _log log.txt`) do (
          set /a count+=1
          if !count! equ 5 (
              echo !log:~0,-4!
          )
          if !count! equ 8 (
              @REM another command
          ) else (
              @REM another command
          )
      )
      pause >nul
      
  4. Avatar photo سلمان گفت:

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

     
    @ECHO OFF 
    SETLOCAL ENABLEDELAYEDEXPANSION 
    TITLE CREATE ATI 
    SET COUNT=0 
    FOR /F "USEBACKQ TOKENS=*" %%G IN (`DIR /B %~1`) DO ( 
     SET "ATI[!COUNT!]=%%G" 
     SET /A "COUNT+=1"
     ) 
     SET ATI >d:\ATI.txt
     Rem Select from list Numbers
    set /p NUM=Plaese Enter Numbers : 
    ::FOR /F "USEBACKQ TOKENS=*" %%G IN (`findstr /i ATI^[%NUM%]= "SET ATI"`) DO ( why  error
    FOR /F "USEBACKQ TOKENS=*" %%G IN (`findstr /i ATI^[%NUM% d:\ATI.txt`) DO (
    echo %%G 
    )
    PAUSE
    

    ۱- چرا من تو این دستور عدد ۱ وارد میکنم تمام عداد که شامل ۱ هستند را میاره ؟
    ۲- اگر نخواهم دستور به فایل متنی ببرم به چه صورت است برای استفاده از findstr ?
    ۳- در دستور findstr علامت []= به چه صورت پیدا مکنه ?
    ۴- از جدا کننده =نمیتوانم استفاده کنم مثال delims ==”
    باسپاس فراوان

    • سلام
      ماشاالله یکی دوتا سوال نیست :)، اجازه بدید تا آخر هفته براتون وقت میزارم، اسکریپت تون رو بررسی میکنم و سعی میکنم به همه سوالات جواب بدم.

  5. Avatar photo سلمان گفت:

    ۵- داخل نامبر باید چند تا عدد بگیره

  6. Avatar photo سلمان گفت:

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

  7. Avatar photo سلمان گفت:

    بازم 5 فراموش کردم

  8. Avatar photo سلمان گفت:

    سلام مهندس
    مورد ۱ برطرف شد
    فقط مورد ۵ برطرف نشد
    با تشکر

  9. Avatar photo سلمان گفت:

    سلام و عرض ادب
    مهندس جان نامبر مشخص میکنه که کدام شماره های که تو لیست ارایه هستند در حلقه اجرا بشن
    به این صورت که لیست از فایلهای وجود دارد که در ارایه قرار گرفته شده است حال با انتخاب شماره ارایه اون لیست در حلقه اجرا میشود زمانی که بنده یک شماره را انتخاب می کنم در ارایه شماره قرار گرفته و اون فایل اجرا میشود
    مشکل اینجا است
    1- که اگر تعداد انتخابی شماره بیش از یکی باشد ؟
    2- چطور می توانم فاصله عددی ایجاد کرد به طور مثال از 1تا 5 و از 7 تا 10 و 12 و 15
    با کمال تشکر

  10. Avatar photo سلمان گفت:
    @ECHO OFF 
    SETLOCAL ENABLEDELAYEDEXPANSION 
    TITLE CREATE ATI 
    ICACLS D:\text /Grant Everyone:w /T
    ::timeout 20 > nul 
    ::ICACLS D:\text /e /p Everyone:F /t
    ::ICACLS D:\text /deny Everyone:F /T /Q
    SET COUNT=0 
    FOR /F "USEBACKQ TOKENS=*" %%G IN (`DIR /B /A %~1`) DO (
    echo %%G 
     SET "ATI[!COUNT!]=%%G" 
     SET /A "COUNT+=1"
     ) 
     SET ATI >d:\ATI.txt
     Rem Select from list Numbers
    set /p NUM=Plaese Enter Numbers : 
    FOR /F "USEBACKQ TOKENS=*" %%G IN (`findstr /i ATI\[%NUM%\] d:\ATI.txt`) DO (
    echo %%G 
    )
    PAUSE
    
  11. Avatar photo سلمان گفت:

    سلام

    • سلام سلمان، ببخشید بخدا من چند وقتی دارم روی چندتا زبان کار میکنم خیلی به سایت هم سر نمیزنم و اینکه راستش کمی از بچ اسکریپت دور هم بودم کمی قاطی کردم :)بابت تاخیر ازت عذرخواهی میکنم تا شب اسکریپت رو بررسی میکنم، بهت پاسخ میدم.

  12. Avatar photo سلمان گفت:

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

  13. Avatar photo محمد گفت:

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

    • سلام باید از علامت > استفاده کنید، برای مثال:

      @echo off
      title test
      echo hello world >text.txt
      echo welcome to batch file to learn batch script >>text.txt
      

      نکته: دفعه اول یکبار علامت < رو استفاده کنید تا فایل ایجاد بشه و دفعه دوم برای اینکه فایل باز نویسی نشه دوباره << استفاده کنید تا متنهای بعدی append بشن به فایل متنی تون

  14. Avatar photo امیر گفت:

    سلام من یه بازی دوز نوشتم ولی وسطای بازی ارور میده و خارج میشه اگه امکانش هست بگین مشکلش چیه
    @echo off
    color 0a
    title dooz
    setlocal enabledelayedexpansion
    :menu
    set /a counter=0
    cls
    echo MEIN MENU
    echo 1) one player
    echo 3) exit
    set /p c1=
    if %c1% equ 1 goto play1
    if %c1% equ 3 exit
    if %c1% gtr 3 goto menu
    :play1
    cls
    set a1=1
    set a2=2
    set a3=3
    set a4=4
    set a5=5
    set a6=6
    set a7=7
    set a8=8
    set a9=9
    :play2
    cls
    echo %a1% %a2% %a3%
    echo %a4% %a5% %a6%
    echo %a7% %a8% %a9%
    echo enter your number
    set /p c2=
    set /a “counter=+1”
    :play3
    if %counter% equ 9 goto draw
    if %c2% equ 1 set a1=%a1:1=o%
    if %c2% equ 2 set a2=%a2:2=o%
    if %c2% equ 3 set a3=%a3:3=o%
    if %c2% equ 4 set a4=%a4:4=o%
    if %c2% equ 5 set a5=%a5:5=o%
    if %c2% equ 6 set a6=%a6:6=o%
    if %c2% equ 7 set a7=%a7:7=o%
    if %c2% equ 8 set a8=%a8:8=o%
    if %c2% equ 9 set a9=%a9:9=o%
    :p2
    set st1=%a1%%a2%
    if %st1% equ oo set a3=%a3:3=x% & goto p1
    set st2=%a1%%a3%
    if %st2% equ oo set a2=%a2:2=x% & goto p1
    set st10=%a3%%a2%
    if %st10% equ oo set a1=%a1:1=x% & goto p1
    set st3=%a4%%a6%
    if %st3% equ oo set a5=%a5:5=x% & goto p1
    set st4=%a4%%a5%
    if %st4% equ oo set a6=%a6:6=x% & goto p1
    set st11=%a5%%a6%
    if %st11% equ oo set a4=%a4:4=x% & goto p1
    set st5=%a7%%a9%
    if %st5% equ oo set a8=%a8:8=x% & goto p1
    set st6=%a7%%a8%
    if %st6% equ oo set a9=%a9:9=x% & goto p1
    set st12=%a8%%a9%
    if %st12% equ oo set a7=%a7:7=x% & goto p1
    set st7=%a1%%a7%
    if %st7% equ oo set a4=%a4:4=x% & goto p1
    set st8=%a1%%a4%
    if %st8% equ oo set a7=%a7:7=x% & goto p1
    set st13=%a4%%a7%
    if %st13% equ oo set a1=%a1:1=x% & goto p1
    set st9=%a2%%a8%
    if %st9% equ oo set a5=%a5:5=x% & goto p1
    set st14=%a2%%a5%
    if %st14% equ oo set a8=%a8:8=x% & goto p1
    set st15=%a5%%a8%
    if %st15% equ oo set a2=%a2:2=x% & goto p1
    set st16=%a3%%a6%
    if %st16% equ oo set a9=%a9:9=x% & goto p1
    set st17=%a3%%a9%
    if %st17% equ oo set a6=%a6:6=x% & goto p1
    set st18=%a6%%a9%
    if %st18% equ oo set a3=%a3:3=x% & goto p1
    set st19=%a1%%a5%
    if %st19% equ oo set a9=%a9:9=x% & goto p1
    set st20=%a1%%a9%
    if %st20% equ oo set a5=%a5:5=x% & goto p1
    set st21=%a5%%a9%
    if %st21% equ oo set a1=%a1:1=x% & goto p1
    set st22=%a3%%a5%
    if %st22% equ oo set a7=%a7:7=x% & goto p1
    set st23=%a3%%a7%
    if %st23% equ oo set a7=%a7:7=x% & goto p1
    set st24=%a5%%a7%
    if %st24% equ oo set a3=%a3:3=x% & goto p1
    :r
    set /a rnumber=%random%
    if %rnumber% equ %c2% goto r
    if %rnumber% gtr 9 goto r
    if %rnumber% equ 1 set a1=%a1:1=x%
    if %rnumber% equ 2 set a2=%a2:2=x%
    if %rnumber% equ 3 set a3=%a3:3=x%
    if %rnumber% equ 4 set a4=%a4:4=x%
    if %rnumber% equ 5 set a5=%a5:5=x%
    if %rnumber% equ 6 set a6=%a6:6=x%
    if %rnumber% equ 7 set a7=%a7:7=x%
    if %rnumber% equ 8 set a8=%a8:8=x%
    if %rnumber% equ 9 set a9=%a9:9=x%
    :p1
    set line1=%a1%%a2%%a3%
    if %line1% equ ooo echo you win&pause>nul& goto win
    if %line1% equ xxx echo you lose&pause>nul & goto lose
    set line2=%a4%%a5%%a6%
    if %line2% equ ooo echo you win&pause>nul& goto win
    if %line2% equ xxx echo you lose&pause>nul & goto lose
    set line3=%a7%%a8%%a9%
    if %line3% equ ooo echo you win&pause>nul& goto win
    if %line3% equ xxx echo you lose&pause>nul & goto lose
    set line4=%a1%%a4%%a7%
    if %line4% equ ooo echo you win&pause>nul& goto win
    if %line4% equ xxx echo you lose&pause>nul & goto lose
    set line5=%a2%%a5%%a8%
    if %line5% equ ooo echo you win&pause>nul& goto win
    if %line5% equ xxx echo you lose&pause>nul & goto lose
    set line6=%a3%%a6%%a9%
    if %line6% equ ooo echo you win&pause>nul& goto win
    if %line6% equ xxx echo you lose&pause>nul & goto lose
    set line7=%a1%%a5%%a9%
    if %line7% equ ooo echo you win&pause>nul& goto win
    if %line7% equ xxx echo you lose&pause>nul & goto lose
    set line8=%a3%%a5%%a7%
    if %line8% equ ooo echo you win&pause>nul& goto win
    if %line8% equ xxx echo you lose&pause>nul & goto lose
    goto play2
    :win
    cls
    echo exelent^!
    echo 1) go to beginning
    echo 2) exit
    set /p c3=
    if %c3% equ 1 goto play1
    if %c3% equ 2 exit
    if %c3% gtr 2 goto win
    :lose
    echo 1) go to beginning
    echo 2) exit
    set /p c4=
    if %c4% equ 1 goto play1
    if %c4% equ 2 exit
    if %c4% gtr 2 goto lose
    :draw
    cls
    echo it’s a draw
    echo 1)go to beginning
    echo 2) exit
    set /p c5=
    if %c5% equ 1 goto play1
    if %c5% equ 2 exit
    if %c5% gtr 2 goto draw

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

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