डॉस बैच स्क्रिप्ट में ऐरे को आबाद करना


33

मैं DOS बैच स्क्रिप्ट में एक सरणी चर कैसे सेटअप कर सकता हूं? मैं इसे संसाधित करने के लिए फ़ाइल नामों की सूची के साथ लोड करना चाहूंगा। मैं वास्तव में इसे यथासंभव सरल रखना चाहूंगा। धन्यवाद।


1
क्या आपको वास्तव में DOS संगत होना चाहिए, या क्या आप PowerShell का उपयोग कर सकते हैं?
ब्रायन नोब्लुक

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%

मैंने कई साल पहले ऐसा कुछ किया था, इसलिए यह कुछ समझ में आया। (btw, मैं पहिया को फिर से बदलना से नफरत करता हूं।) अब जब यह यहां पोस्ट किया गया है, तो उम्मीद है कि अन्य लोग भी इसे उपयोगी पाएंगे।


1
खैर, मुझे कभी नहीं पता था कि आप ऐसा कर सकते हैं! मैने इसे आजमाया और इसने कार्य किया!
Linker3000

यह संभवतः डॉस में काम नहीं कर सकता है। डॉस लंबे फ़ाइल नाम (केवल 8.3) नहीं करता है, और जैसा कि मुझे याद है, डॉस फ़ाइल पथों में उद्धरण नहीं करता है। मेरे पास यह देखने के लिए एक MS-DOS इंस्टॉलेशन काम नहीं है कि क्या यह ()सिंटैक्स का उपयोग करके सरणियों का समर्थन करता है ।
एक CVn

3
हालांकि यह आपके उद्देश्य के लिए काम करता है, यह ध्यान दिया जाना चाहिए कि यह वास्तव में एक सरणी नहीं है। यह सिर्फ एक स्ट्रिंग है जिसे व्यक्तिगत तत्वों में विभाजित किया जा रहा है। आप कुछ ऐसा करके सीधे तत्वों का संदर्भ नहीं दे सकते FILE_LIST[0]
एफोरिया

@ MichaelKjörling: FreeDOS LFNs और संभवतः उद्धरण का समर्थन कर सकता है, इसलिए शायद वह इसका उपयोग कर रहा है?
नाथन तुग्गी

@NathanTuggy अच्छा बिंदु। फिर भी, उस मामले में यह बेहतर होगा यदि इसे स्पष्ट किया गया था।
बजे एक CVn

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

Jakash3 के ब्लॉग से, बैच में Arrays वर्णन करता है कि कमांड प्रॉम्प्ट में सरणियों का अनुकरण कैसे करें।

Array.bat नामक एक बैच फ़ाइल को लेख में शामिल किया गया है, जिसमें सरणियों को संभालने के लिए उपयोग किए जाने वाले कार्यों का एक पुस्तकालय है। आपको लेख में पाठ का चयन करना होगा और इसे बैट फ़ाइल के अंदर पेस्ट करना होगा।

उदाहरण के लिए, निम्नलिखित परीक्षण स्क्रिप्ट:

@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
ठीक है, हालांकि आपने array.bat की सामग्री को सूचीबद्ध नहीं किया है, हालांकि मुझे लगता है कि यह थोड़ा लंबा है
barlop

4

यह एक सरणी को पॉप्युलेट करता है और उसे प्रिंट करता है

आप नामों के बजाय [1] नाम [2] नामों [3] के नाम से i1 नाम 2 नाम 3 का उपयोग कर सकते हैं! नामों के बजाय [!]! यह चर नाम उत्पन्न करके सरणी का निर्माण करता है। बैच में कोई सरणी संरचना नहीं है। लेकिन यह किसी भी सरणी संरचना की तरह साफ-सुथरा है, और आबादी या छपाई बिल्कुल वैसी ही दिखती है, जैसे कोई व्यक्ति किसी समुचित भाषा में किसी सरणी को पॉप्युलेट या प्रिंट करेगा (वास्तव में सरणी संरचना!)

@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% विषम व्यवहार को रोकने के लिए आवश्यक है, ताकि एक या IF के भीतर चर ठीक से व्यवहार करें। यह बैच फ़ाइलों के साथ एक विषमता है। देखें set /?कि आगे कहां उल्लेख किया गया है।

यह वही है जो सरणी को पॉप्युलेट करता है, और किसी के लिए बहुत सीधा है जो सरणियों के बारे में जानता है। आप यह भी कर सकते हैं कि 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!

यह सरणी प्रदर्शित करता है। %% च यदि आप इसे प्रतिध्वनित करते हैं तो आप देखेंगे कि यह 0 से सरणी के अंतिम सूचकांक में जाएगा, 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 का उपयोग मुख्य पैरामीटर के रूप में करने की आवश्यकता है क्योंकि आप SHIFT का उपयोग% 1 'स्थिति' में अन्य चर लाने के लिए कर सकते हैं, कुछ के साथ अशक्त (चर के अंत) के लिए एक परीक्षण कर रहे हैं जैसे IF "X% 1" == "X"

उदाहरण के लिए:

:LOOP
IF "X%1" == "X" GOTO DONE
COPY %1 C:\TARGET.DIR
SHIFT
GOTO LOOP
:DONE

0

यदि आप फ़ाइल की सूची को filelist.txt पर सहेजते हैं, तो आप FORफ़ाइल की प्रत्येक पंक्ति को पढ़ने और संसाधित करने के लिए प्राप्त कर सकते हैं , जैसे कि

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

किसी फ़ाइल की प्रत्येक पंक्ति को प्रिंट करने के लिए (पहले "|" लाइन में)। यदि आप अपने स्वयं के सीमांकक को निर्दिष्ट नहीं करते हैं, तो स्पेस और टैब का उपयोग किया जाएगा, इसलिए जब तक आपके रास्तों में स्थान नहीं है, आपको एक वर्ण निर्दिष्ट करने की आवश्यकता है वह फ़ाइल में पूर्ण लाइनें प्राप्त करने के लिए दिखाई नहीं देगा)।


for / f वास्तव में एक विंडोज़ 2000 और बाद की सुविधा है। यह डॉस में नहीं है।
wendy.krieger

0

आपके किसी उत्तर के लिए आपकी टिप्पणी में,

मैं विकास कार्य कर रहा हूं, और हर बार एप्लिकेशन की जटिल प्रकृति के कारण और एक बिल्ड का परीक्षण करना चाहता हूं (जो कि अक्सर होता है) मुझे बिल्ड बाइनरी निर्देशिका से पांच फाइलें कॉपी बाइनरी डायरेक्टरी में स्थापित करना है। यह थकाऊ हो जाता है। अभी, मेरे पास अपने बैच स्क्रिप्ट में फ़ाइल नाम हार्ड-कोडेड हैं, लेकिन मैं स्क्रिप्ट को बनाए रखना आसान बनाने के लिए उन्हें एक सरणी में रखना चाहूंगा।

मेरा मानना ​​है कि आप जो खोज रहे हैं वह मेकफिल है, और संभवतः साइबरविन आपको एक सभ्य शेल (बैश, या जो कुछ भी आपके स्वाद के लिए देता है)।


0

टेक्स्ट में स्ट्रिंग्स और लेटर को बदलें।

शरीर के लिए पाठ का विस्तार करके और var के साथ var की जगह लूप के लिए प्रयास करें। टेक्स्ट फ़ाइल को खींचें और छोड़ें ताकि% 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

आप वास्तव में कमांड प्रॉम्प्ट में एक सरणी नहीं कर सकते हैं (और जब तक आप विंडोज 3.1 नहीं चला रहे हैं, तब तक यह वास्तव में डॉस नहीं है)। हालाँकि, आप FOR- कमांड के साथ सेट-आधारित प्रोसेसिंग कर सकते हैं

संसाधित की जाने वाली फ़ाइलों की सूची बनाने के लिए, आप मैन्युअल रूप से संसाधित होने के लिए एक पाठ फ़ाइल बना सकते हैं, या dir /b <mask>फ़ोर लूप के अंदर कमांड का उपयोग कर सकते हैं ।

कुछ के लिए मैंने कठिन तरीका सीखा है - आपको अपने कर्सर के रूप में एक एकल चर चर का उपयोग करने की आवश्यकता है!


+1 आप टिप्पणी करते हैं कि एक डाउनवोट समझाया जाना चाहिए। इसके अलावा, आपने लिखा था "आपको अपने कर्सर के रूप में एक एकल चर चर का उपयोग करने की आवश्यकता है!" <- आपका मतलब है कि आपका सूचकांक आपके कर्सर के रूप में नहीं है
barlop

1
यह भी ध्यान दें कि अगर यह एक Win9X बूट डिस्क है जो DOS (DOS 7) है। और विंडोज 9 एक्स को अभी भी डॉस पर चलने के लिए कहा गया था। और आप मुझे यह सोचने के लिए एक पंक्ति जोड़ सकते हैं कि यह msdos.sys था जैसे bootcancan = 0 और bootgui = 0 जो इसे विंडोज़ में बूट करना बंद कर देगा और सीधे DOS प्रॉम्प्ट पर बूट कर देगा।
बार्लॉप

0

FOR बैच कमांड पर Microsoft दस्तावेज़ देखें । आप निर्देशिकाओं के एक समूह, किसी निर्देशिका में फ़ाइलें या किसी निर्देशिका में फ़ाइलें और उसके सभी उप-निर्देशिकाओं में पुनरावृति के लिए उपयोग कर सकते हैं।

डिफ़ॉल्ट रूप से हैंडल के लिए सेट या सिर्फ फाइलें:

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

या, पुनरावर्ती के लिए:

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

या, बस निर्देशिकाओं के लिए:

FOR /D %d DO ECHO %d

दुर्भाग्य से, उन विकल्पों में से सभी अपने-अपने दायरे में शामिल हैं। मैं विकास कार्य कर रहा हूं, और हर बार एप्लिकेशन की जटिल प्रकृति के कारण और एक बिल्ड का परीक्षण करना चाहता हूं (जो कि अक्सर होता है) मुझे बिल्ड बाइनरी निर्देशिका से पांच फाइलें कॉपी बाइनरी डायरेक्टरी में स्थापित करना है। यह थकाऊ हो जाता है। अभी, मेरे पास अपने बैच स्क्रिप्ट में फ़ाइल नाम हार्ड-कोडेड हैं, लेकिन मैं स्क्रिप्ट को बनाए रखना आसान बनाने के लिए उन्हें एक सरणी में रखना चाहूंगा।
जिम फेल

0

यह एक छोटी सी डिबग फाइल है जिसे मैंने BATCH / CMD में अपने टिक टैक टो गेम से टे एरे का परीक्षण करने के लिए जाना था। यह कोड पर बड़े और जटिल होने वाले एरे वाइटआउट को पढ़ और लिख सकता है।

इसका उपयोग करना सरल है:

एक सरणी के लिए लेखन

  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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.