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

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

در بچ اسکریپت رشته یا 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 به نمایش در میاید.

21 دیدگاه دربارهٔ «ایجاد رشته در بچ اسکریپت»

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

    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
    .
    ..
    و به چه صورت میتوانم تو این لیست انتخاب کنم که روی کدام اجرا بشود
    باتشکر فراوان

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

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

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

     
    @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 ==”
    باسپاس فراوان

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

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

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

  7. @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
    
    1. سلام سلمان، ببخشید بخدا من چند وقتی دارم روی چندتا زبان کار میکنم خیلی به سایت هم سر نمیزنم و اینکه راستش کمی از بچ اسکریپت دور هم بودم کمی قاطی کردم :)بابت تاخیر ازت عذرخواهی میکنم تا شب اسکریپت رو بررسی میکنم، بهت پاسخ میدم.

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

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

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

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

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

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

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