আমি কীভাবে ডস ব্যাচের স্ক্রিপ্টে একটি অ্যারে ভেরিয়েবল সেটআপ করতে পারি? প্রক্রিয়া করার জন্য ফাইল নামের একটি তালিকা দিয়ে আমি এটি লোড করতে চাই। আমি এটি যথাসম্ভব সহজ রাখতে চাই like ধন্যবাদ.
আমি কীভাবে ডস ব্যাচের স্ক্রিপ্টে একটি অ্যারে ভেরিয়েবল সেটআপ করতে পারি? প্রক্রিয়া করার জন্য ফাইল নামের একটি তালিকা দিয়ে আমি এটি লোড করতে চাই। আমি এটি যথাসম্ভব সহজ রাখতে চাই like ধন্যবাদ.
উত্তর:
আমি এটি বের করেছিলাম:
set FILE_LIST=(file1.dll file2.exe file3.dll file4.dll file5.dll)
set BIN_PATH="C:\Program Files\My App Folder\bin"
set BAK_PATH="C:\Program Files\My App Folder\bin\Backups"
set DEV_PATH="C:\My Dev Path\bin\Debug"
for %%i in %FILE_LIST% do copy %BIN_PATH%\%%i %BAK_PATH%
for %%i in %FILE_LIST% do copy %DEV_PATH%\%%i %BIN_PATH%
আমি বেশ কয়েক বছর আগে এরকম কিছু করেছি, তাই এটি কিছুটা খুঁজে বের করেছে। (বিটিডব্লিউ, আমি চাকাটি পুনরায় উদ্ভাবন করা ঘৃণা করি)) এখন এটি এখানে পোস্ট করা হয়েছে, আশা করি অন্যরাও এটি দরকারী হয়ে উঠবেন।
()
সিনট্যাক্স ব্যবহার করে অ্যারে সমর্থন করে কিনা তা দেখার জন্য ।
FILE_LIST[0]
।
হ্যাঁ আপনি ব্যাচে অ্যারে করতে পারেন। যদিও তারা সি বা ভিবিতে অ্যারেগুলির মতো নয়, আপনি এটি করতে পারেন:
@echo off
setlocal enabledelayedexpansion
set arrayline[0]=############
set arrayline[1]=#..........#
set arrayline[2]=#..........#
set arrayline[3]=#..........#
set arrayline[4]=#..........#
set arrayline[5]=#..........#
set arrayline[6]=#..........#
set arrayline[7]=#..........#
set arrayline[8]=#..........#
set arrayline[9]=#..........#
set arrayline[10]=#..........#
set arrayline[11]=#..........#
set arrayline[12]=############
::read it using a FOR /L statement
for /l %%n in (0,1,12) do (
echo !arrayline[%%n]!
)
pause
জাকাশ 3 এর ব্লগ থেকে, ব্যাচে থাকা অ্যারেগুলি কমান্ড প্রম্পটে অ্যারেগুলি অনুকরণ করার পদ্ধতি বর্ণনা করে।
অ্যারে.ব্যাট নামের ব্যাচ ফাইলটি নিবন্ধটিতে অন্তর্ভুক্ত করা হয়েছে, এতে অ্যারেগুলি পরিচালনা করতে ব্যবহৃত ফাংশনগুলির একটি গ্রন্থাগার রয়েছে। আপনাকে নিবন্ধের পাঠ্যটি নির্বাচন করতে হবে এবং এটি ব্যাটের ফাইলের ভিতরে পেস্ট করতে হবে।
উদাহরণস্বরূপ, নিম্নলিখিত পরীক্ষার স্ক্রিপ্ট:
@echo off
set book[0]=Avatar
set book[1]=The Green Mile
set book[2]=The Count of Monte Cristo
call array.bat add book Babo
call array.bat len book length
echo I have %length% books you can borrow.
echo Pick one:
echo.
echo 0) Avatar
echo 1) The Green Mile
echo 2) The Count of Monte Cristo
echo 3) Babo
echo.
set /p pick=
call array.bat getitem book %pick% title
echo.
echo You picked %title%.
নিম্নলিখিত আউটপুট উত্পন্ন:
এটি একটি অ্যারে পপুলেটে এবং মুদ্রণ করে
নাম লেখার মাধ্যমে আপনি নাম 1 নাম 2 নাম 3 ব্যবহার করতে পারেন, [1] নাম [2] নাম [3] এর চেয়ে! নামের পরিবর্তে [! আমি!]। এটি পরিবর্তনশীল নাম উত্পন্ন করে অ্যারের উত্পাদন করে produces ব্যাচে কোনও অ্যারে কাঠামো নেই। তবে এটি কোনও অ্যারের কাঠামোর মতোই ঝরঝরে এবং পপুলেশন বা প্রিন্টিং হুবহু দেখে মনে হচ্ছে যে কোনও ব্যক্তি কীভাবে একটি উপযুক্ত ভাষায় অ্যারে তৈরি করতে বা মুদ্রণ করতে পারে (যেটিতে আসলে অ্যারের কাঠামো রয়েছে!)
@echo off
setlocal enabledelayedexpansion enableextensions
set i=-1
for %%f in (bob, tom, joseph) do (
set /a i=!i!+1
set names[!i!]=%%f
)
set lastindex=!i!
for /L %%f in (0,1,!lastindex!) do (
echo !names[%%f]!
)
আউটপুট-
c:\blah>a
bob
tom
joseph
c:\blah>
কিছু ব্যাখ্যা-
setlocal enabledelayedexpansion enableextensions
! Var সঙ্গে! বৈষম্যমূলক আচরণ প্রতিরোধের জন্য% var% এর পরিবর্তে প্রয়োজনীয়, যাতে কোনও ফর বা আইএফের মধ্যে যখন ভেরিয়েবলগুলি সঠিকভাবে আচরণ করে। এটি ব্যাচের ফাইলগুলির সাথে একটি বিজোড়তা। set /?
আরও উল্লেখ করা হয়েছে যেখানে দেখুন ।
এটি হ'ল অ্যারেটিকে জনপ্রিয় করে তোলে এবং অ্যারে সম্পর্কে জানে এমন কারও কাছে সরাসরি এগিয়ে straight আপনি যদি এটি করতে পারেন names[0]=bob
names[1]=tom
names[2]=joseph
তবে একটি অ্যারের সুন্দরীদের মধ্যে একটি হ'ল লুপ দিয়ে একটি অ্যারে পপুলেট করার ক্ষমতা, যা আমি এখানে এখানে করেছি।
for %%f in (bob, tom, joseph) do (
set /a i=!i!+1
set names[!i!]=%%f
)
set lastindex=!i!
এটি অ্যারে প্রদর্শন করে। %% f আপনি যদি এটি প্রতিধ্বনিত করেন তবে আপনি দেখতে পাবেন যে অ্যারের শেষ সূচকটি 1 থেকে 1 পদক্ষেপে চলে যাবে সুতরাং নামগুলি [0] নাম [1] নামগুলি মুদ্রণ করবে [2]
for /L %%f in (0,1,!lastindex!) do (
echo !names[%%f]!
)
আপনি যা করতে চান তার জন্য প্রতিটি ফাইলের নামের জন্য কীভাবে ইনপুট ভেরিয়েবল ব্যবহার করা যায়, যা আপনি% 1% 2 ইত্যাদি ভেরিয়েবলের সাথে নিতে পারেন যেমন: mybat.bat file1.nam file2.nam ইত্যাদি।
তারপরে আপনি এই ভেরিয়েবলগুলি একটি লুপে ব্যবহার করতে পারেন তবে কেবলমাত্র প্রধান প্যারামিটার হিসাবে% 1 ব্যবহার করতে হবে কারণ আপনি অন্যান্য ভেরিয়েবলগুলিকে% 1 'পজিশনে' আনার জন্য SHIFT ব্যবহার করতে পারেন, কিছু দিয়ে নাল (ভেরিয়েবলের শেষে) পরীক্ষা করে আইএফ "এক্স% 1" == "এক্স" এর মতো
উদাহরণ:
:LOOP
IF "X%1" == "X" GOTO DONE
COPY %1 C:\TARGET.DIR
SHIFT
GOTO LOOP
:DONE
আপনি যদি ফাইললিস্ট.টেক্সট ফাইলগুলির তালিকা সংরক্ষণ করেন তবে আপনি ফাইলের FOR
প্রতিটি লাইন যেমন পড়তে এবং প্রক্রিয়া করতে পারেন
FOR /F "delims=|" %i IN (filelist.txt) DO @echo %i
একটি ফাইলের প্রতিটি লাইন মুদ্রণ করতে (লাইনে প্রথম "|" অবধি। আপনি যদি নিজের নিজস্ব সীমানি নির্দিষ্ট না করেন, স্থান এবং ট্যাব ব্যবহার করা হবে, সুতরাং আপনার পাথগুলিতে স্পেস না থাকলে, আপনাকে একটি অক্ষর নির্দিষ্ট করতে হবে যা সম্পূর্ণ লাইন পেতে ফাইলটিতে উপস্থিত হবে না)।
আপনার উত্তরের একটি মন্তব্যে আপনি বলেছেন,
আমি বিকাশ কাজ করছি এবং প্রতিবার অ্যাপ্লিকেশনটির জটিল প্রকৃতির কারণে এবং একটি বিল্ড পরীক্ষা করতে চাই (যা প্রায়শই হয়) আমাকে বিল্ড বাইনারি ডিরেক্টরি থেকে পাঁচটি ফাইল কপি করতে হবে বাইনারি ডিরেক্টরিতে ইনস্টল করুন। এটি ক্লান্তিকর হয়। এই মুহুর্তে আমার কাছে আমার ব্যাচের স্ক্রিপ্টে ফাইলের নামগুলি হার্ড-কোডড রয়েছে তবে স্ক্রিপ্টটি বজায় রাখা সহজ করার জন্য আমি সেগুলি অ্যারেতে রাখতে চাই।
আমি বিশ্বাস করি যে আপনি যা সন্ধান করছেন তা হ'ল মেকফাইল এবং সম্ভবত সাইগউইন আপনাকে শালীন শেল (ব্যাশ বা আপনার স্বাদ যাই হোক না কেন) দিতে পারেন।
পাঠ্যগুলিতে স্ট্রিং এবং চিঠিটি প্রতিস্থাপন করুন।
শরীরের জন্য পাঠ্য প্রসারিত করে এবং ভেরির পরিবর্তে ভেরির পরিবর্তে লুপের জন্য চেষ্টা করুন। টেক্সট ফাইলটি টানুন এবং ছেড়ে দিন সুতরাং% 1 সেট কমান্ডের সাহায্যে ব্যবহারকারী ইনপুট।
@echo off
setlocal EnableDelayedExpansion
set /p a= enter letter to change:
set /p b= letter to change to:
set /p input=<%1
for /f %%c in ("!input:~!") do (
set "code=!input:%a%=%b%!"
echo !code!>myfile.txt
)
ব্যাচের ফাইলে এরকম কিছু? একটি ফোল্ডারে একটি ফাইল নির্বাচন করুন। << মন্তব্য, কোনও কোড নয়
:selectapk
SETLOCAL ENABLEDELAYEDEXPANSION << DELAYED EXPANSION on for counter in For loop
SET /A MAXITEM=0
Echo.
Echo Found these APK files in "add_apk_here" folder.
Echo.
For %%a in (add_apk_here/*.apk) do (
Set /A MAXITEM+=1
Set MENUITEM!MAXITEM!=%%a << Fill n local env vars, one for each file, called MENUITEM1...n
Echo !MAXITEM!. %%a
)
Echo.
If !MAXITEM!==0 Echo No APK in "add_apk_here" folder & call :delay & Goto start << No apk files then go back
SET /P CHOICE=Select APK to work on:
SET MENUITEM=!MENUITEM%CHOICE%! << Get the stored filename from MENUITEMx
SETLOCAL DISABLEDELAYEDEXPANSION << Very important for next ENDLOCAL that doesn't like the delayedexpansion var
ENDLOCAL & SET apk=%MENUITEM% << put the local MENUITEM var into the global apk var
goto start
:delay
REM %1 like Call :delay 5
SETLOCAL
SET N=%1
If Not Defined N Set N=2
Ping -n %N% -w 1000 127.255.255.255 > nul
ENDLOCAL
Exit /b
আপনি প্রকৃতপক্ষে কমান্ড প্রম্পটে কোনও অ্যারে করতে পারবেন না (এবং আপনি উইন্ডোজ ৩.১ চালা না করে এটি সত্যই ডস নয়)। তবে আপনি ফর কমান্ডের সাহায্যে সেট-ভিত্তিক প্রসেসিং করতে পারেন ।
প্রক্রিয়া করার জন্য ফাইলগুলির তালিকা তৈরি করতে, প্রক্রিয়া করার জন্য আপনি ম্যানুয়ালি একটি পাঠ্য ফাইল তৈরি করতে পারেন, বা এটি ব্যবহার করতে পারেন dir /b <mask>
ফর লুপের ভিতরে কমান্ডটি ।
আমি এর জন্য কঠিন উপায় শিখেছি এমন কিছু - আপনার কার্সার হিসাবে আপনাকে একটি একক অক্ষর পরিবর্তনশীল ব্যবহার করতে হবে !
ফর ব্যাচ কমান্ডে মাইক্রোসফ্ট ডকুমেন্টেশন দেখুন । আপনি ডিরেক্টরি, ডিরেক্টরি ডিরেক্টরিতে বা একটি ডিরেক্টরিতে এবং এর সমস্ত উপ-ডিরেক্টরিতে ফাইলগুলির একটি সেট পুনরাবৃত্তি করতে ব্যবহার করতে পারেন।
ডিফল্টরূপে হ্যান্ডলগুলি সেট বা কেবল ফাইলগুলির জন্য:
FOR %f IN (*.txt) DO ECHO %f
বা, পুনরাবৃত্তির জন্য:
FOR /R %f IN (*.txt) DO ECHO %f
বা, কেবল ডিরেক্টরিগুলির জন্য:
FOR /D %d DO ECHO %d
এটি একটি ছোট ডিবাগ ফাইল যা আমি ব্যাচ / সিএমডি তে আমার টিক টাক টো গেম থেকে টে অ্যারে পরীক্ষা করতে গিয়েছিলাম made এটি কোডে বড় এবং জটিলতে গিয়ে একটি অ্যারে থেকে পাঠাতে এবং লিখতে পারে।
এটি ব্যবহার করা সহজ:
একটি অ্যারেতে লেখা
একটি অ্যারে থেকে পড়া হচ্ছে
কোড:
@echo off
setlocal EnableDelayedExpansion
set ID=0
:: Reader ::
:: It reads the file called input.txt ::
:: and stores it in a new variable that ::
:: for everytime it goes over it it is a ::
:: new ID (Slot in the array). ::
For /F %%A in (input.txt) do (
set /a ID=ID+1
set Input!ID!= %%A
echo !ID! : %%A
)
:: Writer ::
:: this is to read all Slots in the array ::
:: and puts it on the screen. ::
for /L %%a in (1,1,!ID!) do (
echo !Input%%a!
)
pause>nul