ایجاد رشته در بچ اسکریپت
در بچ اسکریپت رشته یا 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 پاسخ به “ایجاد رشته در بچ اسکریپت”
سلام مهندس عیدتان مبارک
اگر براتون مقدور است بفرمایید این دستور چه ایرادی داره
داخل log.txt لیستی از فایل های log وجود دارد
acc_man_log
acc_man1_log
acc_man2_loglog_
log_acc_man
acc_man_log_log
.
..
و به چه صورت میتوانم تو این لیست انتخاب کنم که روی کدام اجرا بشود
باتشکر فراوان
سلام، عید شما هم مبارک
تو بچ اسکریپت تا زمانیکه وارد دستور بعدی نشده باشید متغیر های ایجاد شده توسط دستور خط جاری تجزیه (parse) نمیشن به همین خاطر از ویژگی enabledelayedexpansion استفاده میکنند تا متغیر ها در زمان اجرای دستور قابل استفاده باشند نه بعد از تجزیه شدن، کدهاتون رو باید به شکل زیر بنویسید:
توجه کن، متغیر log که درون دستور for ایجاد کردی هنوز تجزیه نشده به همین خاطر باید از علامت تعجب و ویژگی EnableDelayedExpansion استفاده کنید.
البته مهندس انتهای فایلها پسوند داره که با . جدا کردن
باتشکر
سپاسگزارم
بسیار عالی بود
مهندس جان
سوال که در مورد انتخاب کردن مواردی که از لیست log خروجی میدهند امکانپذیر ؟
مثلاً اگر من از لیست 10 خروجی log بدست آوردم با انتخاب عدد 1,3,8 این log ها روش دستور اجرا بشه نه تمامش؟
با سپاس فراوان
خواهش میکنم 🙂
برای انتخاب باید یک معیار داشته باشید و مثلا با دستور if معیار مورد نظر تون رو بررسی کنید و اگر معیار درست بود عمل مورد نظر شما انجام بشه، یا اینکه یک counter اضافه کنید و بگید زمانیکه counter به عدد مورد نظر رسید عمل مشخص شده اتفاق بیافته، برای مثال:
سلام
امیدورام که تیم تون پیروز بشه
لطفا راهنمایی بفرمایید و ایراد بفرمایید
۱- چرا من تو این دستور عدد ۱ وارد میکنم تمام عداد که شامل ۱ هستند را میاره ؟
۲- اگر نخواهم دستور به فایل متنی ببرم به چه صورت است برای استفاده از findstr ?
۳- در دستور findstr علامت []= به چه صورت پیدا مکنه ?
۴- از جدا کننده =نمیتوانم استفاده کنم مثال delims ==”
باسپاس فراوان
سلام
ماشاالله یکی دوتا سوال نیست :)، اجازه بدید تا آخر هفته براتون وقت میزارم، اسکریپت تون رو بررسی میکنم و سعی میکنم به همه سوالات جواب بدم.
۵- داخل نامبر باید چند تا عدد بگیره
سلام
مهندس خسته نباشید
بعضی از موارد برطرف کردم
فقط مورد 1 بفرمایید ممنون میشم
مهندس ما رو دور نداز
با سپاس فراوان
سلام
چشم 🙂
بازم 5 فراموش کردم
سلام مهندس
مورد ۱ برطرف شد
فقط مورد ۵ برطرف نشد
با تشکر
سلام سلمان
توضیح بده کار نامبر چیه؟ چیکار میخوای باهاش کنی
سلام و عرض ادب
مهندس جان نامبر مشخص میکنه که کدام شماره های که تو لیست ارایه هستند در حلقه اجرا بشن
به این صورت که لیست از فایلهای وجود دارد که در ارایه قرار گرفته شده است حال با انتخاب شماره ارایه اون لیست در حلقه اجرا میشود زمانی که بنده یک شماره را انتخاب می کنم در ارایه شماره قرار گرفته و اون فایل اجرا میشود
مشکل اینجا است
1- که اگر تعداد انتخابی شماره بیش از یکی باشد ؟
2- چطور می توانم فاصله عددی ایجاد کرد به طور مثال از 1تا 5 و از 7 تا 10 و 12 و 15
با کمال تشکر
سلام
سلام سلمان، ببخشید بخدا من چند وقتی دارم روی چندتا زبان کار میکنم خیلی به سایت هم سر نمیزنم و اینکه راستش کمی از بچ اسکریپت دور هم بودم کمی قاطی کردم :)بابت تاخیر ازت عذرخواهی میکنم تا شب اسکریپت رو بررسی میکنم، بهت پاسخ میدم.
سلام مهندس
این چه حرفیه . تا همین الان خیلی کمک کردید سپاس گذارم
سوال زیاده هر موقع وقت داشتید جواب بدهید
باسپاس فراوان
سلام
ممنونم، ممنونم محبت دارید
سلام ، خسته نباشید
چطور میتونم در یک بچ فایل متنی را با استفاده از رشته های ثابت و متغیرها که در چند خط پشت سرهم قرار گرفته اند را در یک فایل متنی ذخیره کنم .
تشکر
سلام باید از علامت > استفاده کنید، برای مثال:
نکته: دفعه اول یکبار علامت < رو استفاده کنید تا فایل ایجاد بشه و دفعه دوم برای اینکه فایل باز نویسی نشه دوباره << استفاده کنید تا متنهای بعدی append بشن به فایل متنی تون
سلام من یه بازی دوز نوشتم ولی وسطای بازی ارور میده و خارج میشه اگه امکانش هست بگین مشکلش چیه
@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