ডস ব্যাচের স্ক্রিপ্টে অ্যারে পপুলেটিং করছে


33

আমি কীভাবে ডস ব্যাচের স্ক্রিপ্টে একটি অ্যারে ভেরিয়েবল সেটআপ করতে পারি? প্রক্রিয়া করার জন্য ফাইল নামের একটি তালিকা দিয়ে আমি এটি লোড করতে চাই। আমি এটি যথাসম্ভব সহজ রাখতে চাই like ধন্যবাদ.


1
আপনার কি সত্যিই ডসের সাথে সামঞ্জস্যপূর্ণ হওয়া দরকার, না আপনি পাওয়ারশেল ব্যবহার করতে পারেন?
ব্রায়ান নোব্লাচ

1
আপনি এর জন্য খুব সহজেই vbscript ব্যবহার করতে পারেন ...
JNK

@ ব্রায়ান: ডস প্রয়োজন। আমার পোস্ট করা সমাধানটি দেখুন।
জিম ফেল

আপনার যদি চুল না থাকে তবে অবশ্যই কমান্ড প্রম্পট এবং ডসের মধ্যে পার্থক্যটি অবশ্যই জেনে রাখা উচিত
বার্লপ

উত্তর:


48

আমি এটি বের করেছিলাম:

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%

আমি বেশ কয়েক বছর আগে এরকম কিছু করেছি, তাই এটি কিছুটা খুঁজে বের করেছে। (বিটিডব্লিউ, আমি চাকাটি পুনরায় উদ্ভাবন করা ঘৃণা করি)) এখন এটি এখানে পোস্ট করা হয়েছে, আশা করি অন্যরাও এটি দরকারী হয়ে উঠবেন।


1
ঠিক আছে, আমি কখনই জানতাম না যে আপনি এটি করতে পারেন! আমি চেষ্টা করেছিলাম এবং এটি কাজ করে!
Linker3000

এটি সম্ভবত ডস-এ কাজ করতে পারে না। ডস দীর্ঘ ফাইলের নাম দেয় না (কেবল 8.3), এবং আমার মনে আছে, ডস ফাইলের পথে কোনও উদ্ধৃতি করে না। আমার কাছে কোনও এমএস-ডস ইনস্টলেশন ব্যবস্থা নেই যা এটি ()সিনট্যাক্স ব্যবহার করে অ্যারে সমর্থন করে কিনা তা দেখার জন্য ।
একটি সিভিএন

3
যদিও এটি আপনার উদ্দেশ্যে কাজ করে, এটি লক্ষ করা উচিত যে এটি আসলে কোনও অ্যারে নয়। এটি কেবল একটি স্ট্রিং যা পৃথক উপাদানগুলিতে বিভক্ত হচ্ছে। আপনি উপাদান যেমন সরাসরি কিছু রেফারেন্স করতে পারবেন না FILE_LIST[0]
আফোরিয়া

@ মাইকেলKjörling: ফ্রিডস এলএফএন এবং সম্ভবত উদ্ধৃতিগুলি সমর্থন করতে পারে , তাই সম্ভবত তিনি এটি ব্যবহার করছেন?
নাথান টগি

@ নাথানটগি ভাল পয়েন্ট তবুও, যদি সুনির্দিষ্টভাবে তৈরি করা হয় তবে সে ক্ষেত্রে এটি আরও ভাল।
একটি সিভিএন

12

হ্যাঁ আপনি ব্যাচে অ্যারে করতে পারেন। যদিও তারা সি বা ভিবিতে অ্যারেগুলির মতো নয়, আপনি এটি করতে পারেন:

@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

1
এটি দুর্দান্ত এবং অনুপ্রেরণামূলক .. আমি কেবল একটি উত্তর দিয়েছি যা এটি তৈরি করে এবং
অ্যারেও

7

জাকাশ 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
ঠিক আছে যদিও আপনি অ্যারে.বাটের বিষয়বস্তু তালিকাভুক্ত করেননি যদিও আমি দেখতে পাচ্ছি এটি কিছুটা দীর্ঘ
বারলপ

4

এটি একটি অ্যারে পপুলেটে এবং মুদ্রণ করে

নাম লেখার মাধ্যমে আপনি নাম 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]!
)

0

আপনি যা করতে চান তার জন্য প্রতিটি ফাইলের নামের জন্য কীভাবে ইনপুট ভেরিয়েবল ব্যবহার করা যায়, যা আপনি% 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

0

আপনি যদি ফাইললিস্ট.টেক্সট ফাইলগুলির তালিকা সংরক্ষণ করেন তবে আপনি ফাইলের FORপ্রতিটি লাইন যেমন পড়তে এবং প্রক্রিয়া করতে পারেন

FOR /F "delims=|" %i  IN (filelist.txt) DO @echo %i

একটি ফাইলের প্রতিটি লাইন মুদ্রণ করতে (লাইনে প্রথম "|" অবধি। আপনি যদি নিজের নিজস্ব সীমানি নির্দিষ্ট না করেন, স্থান এবং ট্যাব ব্যবহার করা হবে, সুতরাং আপনার পাথগুলিতে স্পেস না থাকলে, আপনাকে একটি অক্ষর নির্দিষ্ট করতে হবে যা সম্পূর্ণ লাইন পেতে ফাইলটিতে উপস্থিত হবে না)।


/ এফ আসলে উইন্ডোজ 2000 এবং পরবর্তী বৈশিষ্ট্য। এটি ডসের মধ্যে নেই।
wendy.krieger

0

আপনার উত্তরের একটি মন্তব্যে আপনি বলেছেন,

আমি বিকাশ কাজ করছি এবং প্রতিবার অ্যাপ্লিকেশনটির জটিল প্রকৃতির কারণে এবং একটি বিল্ড পরীক্ষা করতে চাই (যা প্রায়শই হয়) আমাকে বিল্ড বাইনারি ডিরেক্টরি থেকে পাঁচটি ফাইল কপি করতে হবে বাইনারি ডিরেক্টরিতে ইনস্টল করুন। এটি ক্লান্তিকর হয়। এই মুহুর্তে আমার কাছে আমার ব্যাচের স্ক্রিপ্টে ফাইলের নামগুলি হার্ড-কোডড রয়েছে তবে স্ক্রিপ্টটি বজায় রাখা সহজ করার জন্য আমি সেগুলি অ্যারেতে রাখতে চাই।

আমি বিশ্বাস করি যে আপনি যা সন্ধান করছেন তা হ'ল মেকফাইল এবং সম্ভবত সাইগউইন আপনাকে শালীন শেল (ব্যাশ বা আপনার স্বাদ যাই হোক না কেন) দিতে পারেন।


0

পাঠ্যগুলিতে স্ট্রিং এবং চিঠিটি প্রতিস্থাপন করুন।

শরীরের জন্য পাঠ্য প্রসারিত করে এবং ভেরির পরিবর্তে ভেরির পরিবর্তে লুপের জন্য চেষ্টা করুন। টেক্সট ফাইলটি টানুন এবং ছেড়ে দিন সুতরাং% 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
)

0

ব্যাচের ফাইলে এরকম কিছু? একটি ফোল্ডারে একটি ফাইল নির্বাচন করুন। << মন্তব্য, কোনও কোড নয়

: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

0

আপনি প্রকৃতপক্ষে কমান্ড প্রম্পটে কোনও অ্যারে করতে পারবেন না (এবং আপনি উইন্ডোজ ৩.১ চালা না করে এটি সত্যই ডস নয়)। তবে আপনি ফর কমান্ডের সাহায্যে সেট-ভিত্তিক প্রসেসিং করতে পারেন

প্রক্রিয়া করার জন্য ফাইলগুলির তালিকা তৈরি করতে, প্রক্রিয়া করার জন্য আপনি ম্যানুয়ালি একটি পাঠ্য ফাইল তৈরি করতে পারেন, বা এটি ব্যবহার করতে পারেন dir /b <mask> ফর লুপের ভিতরে কমান্ডটি ।

আমি এর জন্য কঠিন উপায় শিখেছি এমন কিছু - আপনার কার্সার হিসাবে আপনাকে একটি একক অক্ষর পরিবর্তনশীল ব্যবহার করতে হবে !


+1 আপনি মন্তব্য করেছেন যে একটি ডাউনভোটটি ব্যাখ্যা করা উচিত। এছাড়াও, আপনি লিখেছেন "আপনার কার্সার হিসাবে আপনাকে একটি একক অক্ষর ভেরিয়েবল ব্যবহার করা দরকার!" <- আপনার সূচকটি আপনার কার্সারের হিসাবে নয়
বার্লপ

1
আরও মনে রাখবেন যে এটি যদি উইন 9 এক্স বুট ডিস্ক হয় যা ডস (ডস 7)। এবং উইন্ডোজ 9 এক্স এখনও ডস চালানোর জন্য বলা হয়েছিল। এবং আপনি এটিতে একটি লাইন যুক্ত করতে পারেন বলে মনে হয় এটি এমএসডোস ছিল ys বুটস্ক্যান = 0 এবং বুটগুই = 0 এর মতো যা উইন্ডোতে বুট করা বন্ধ করে এবং সরাসরি ডস প্রম্পটে বুট করে।
বারলপ

0

ফর ব্যাচ কমান্ডে মাইক্রোসফ্ট ডকুমেন্টেশন দেখুন । আপনি ডিরেক্টরি, ডিরেক্টরি ডিরেক্টরিতে বা একটি ডিরেক্টরিতে এবং এর সমস্ত উপ-ডিরেক্টরিতে ফাইলগুলির একটি সেট পুনরাবৃত্তি করতে ব্যবহার করতে পারেন।

ডিফল্টরূপে হ্যান্ডলগুলি সেট বা কেবল ফাইলগুলির জন্য:

FOR %f IN (*.txt) DO ECHO %f

বা, পুনরাবৃত্তির জন্য:

FOR /R %f IN (*.txt) DO ECHO %f

বা, কেবল ডিরেক্টরিগুলির জন্য:

FOR /D %d DO ECHO %d

দুর্ভাগ্যক্রমে, এই সমস্ত অপশন তাদের নিজ নিজ স্কোপগুলিতে সর্বাত্মক। আমি বিকাশ কাজ করছি এবং প্রতিবার অ্যাপ্লিকেশনটির জটিল প্রকৃতির কারণে এবং একটি বিল্ড পরীক্ষা করতে চাই (যা প্রায়শই হয়) আমাকে বিল্ড বাইনারি ডিরেক্টরি থেকে পাঁচটি ফাইল কপি করতে হবে বাইনারি ডিরেক্টরিতে ইনস্টল করুন। এটি ক্লান্তিকর হয়। এই মুহুর্তে আমার কাছে আমার ব্যাচের স্ক্রিপ্টে ফাইলের নামগুলি হার্ড-কোডড রয়েছে তবে স্ক্রিপ্টটি বজায় রাখা সহজ করার জন্য আমি সেগুলি অ্যারেতে রাখতে চাই।
জিম ফেল

0

এটি একটি ছোট ডিবাগ ফাইল যা আমি ব্যাচ / সিএমডি তে আমার টিক টাক টো গেম থেকে টে অ্যারে পরীক্ষা করতে গিয়েছিলাম made এটি কোডে বড় এবং জটিলতে গিয়ে একটি অ্যারে থেকে পাঠাতে এবং লিখতে পারে।

এটি ব্যবহার করা সহজ:

একটি অ্যারেতে লেখা

  1. এটিকে কোনও ফাইল দিন বা অন্যকে আমদানি করতে আমদানি করুন।
  2. অ্যারে একটি নাম দিন।
  3. এবং তোমার কাজ শেষ

একটি অ্যারে থেকে পড়া হচ্ছে

  1. অ্যারের আকার বা তার কিছু অংশ পড়ুন যা আপনি পড়তে চান।
  2. অ্যারের নামটি %% একটি দিয়ে রাখুন
  3. এবং তোমার কাজ শেষ

কোড:

@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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.