मैं DOS बैच स्क्रिप्ट में एक सरणी चर कैसे सेटअप कर सकता हूं? मैं इसे संसाधित करने के लिए फ़ाइल नामों की सूची के साथ लोड करना चाहूंगा। मैं वास्तव में इसे यथासंभव सरल रखना चाहूंगा। धन्यवाद।
मैं DOS बैच स्क्रिप्ट में एक सरणी चर कैसे सेटअप कर सकता हूं? मैं इसे संसाधित करने के लिए फ़ाइल नामों की सूची के साथ लोड करना चाहूंगा। मैं वास्तव में इसे यथासंभव सरल रखना चाहूंगा। धन्यवाद।
जवाबों:
मैं यह समझ गया:
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, मैं पहिया को फिर से बदलना से नफरत करता हूं।) अब जब यह यहां पोस्ट किया गया है, तो उम्मीद है कि अन्य लोग भी इसे उपयोगी पाएंगे।
()
सिंटैक्स का उपयोग करके सरणियों का समर्थन करता है ।
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
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] नाम [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]!
)
आप क्या करना चाहते हैं, प्रत्येक फ़ाइल नाम के लिए इनपुट चर का उपयोग कैसे करें, जिसे आप% 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
यदि आप फ़ाइल की सूची को filelist.txt पर सहेजते हैं, तो आप FOR
फ़ाइल की प्रत्येक पंक्ति को पढ़ने और संसाधित करने के लिए प्राप्त कर सकते हैं , जैसे कि
FOR /F "delims=|" %i IN (filelist.txt) DO @echo %i
किसी फ़ाइल की प्रत्येक पंक्ति को प्रिंट करने के लिए (पहले "|" लाइन में)। यदि आप अपने स्वयं के सीमांकक को निर्दिष्ट नहीं करते हैं, तो स्पेस और टैब का उपयोग किया जाएगा, इसलिए जब तक आपके रास्तों में स्थान नहीं है, आपको एक वर्ण निर्दिष्ट करने की आवश्यकता है वह फ़ाइल में पूर्ण लाइनें प्राप्त करने के लिए दिखाई नहीं देगा)।
आपके किसी उत्तर के लिए आपकी टिप्पणी में,
मैं विकास कार्य कर रहा हूं, और हर बार एप्लिकेशन की जटिल प्रकृति के कारण और एक बिल्ड का परीक्षण करना चाहता हूं (जो कि अक्सर होता है) मुझे बिल्ड बाइनरी निर्देशिका से पांच फाइलें कॉपी बाइनरी डायरेक्टरी में स्थापित करना है। यह थकाऊ हो जाता है। अभी, मेरे पास अपने बैच स्क्रिप्ट में फ़ाइल नाम हार्ड-कोडेड हैं, लेकिन मैं स्क्रिप्ट को बनाए रखना आसान बनाने के लिए उन्हें एक सरणी में रखना चाहूंगा।
मेरा मानना है कि आप जो खोज रहे हैं वह मेकफिल है, और संभवतः साइबरविन आपको एक सभ्य शेल (बैश, या जो कुछ भी आपके स्वाद के लिए देता है)।
टेक्स्ट में स्ट्रिंग्स और लेटर को बदलें।
शरीर के लिए पाठ का विस्तार करके और 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
)
कुछ इस तरह एक बैच फ़ाइल में? एक फ़ोल्डर में एक फ़ाइल का चयन करें। << टिप्पणी है, कोई कोड नहीं
: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
आप वास्तव में कमांड प्रॉम्प्ट में एक सरणी नहीं कर सकते हैं (और जब तक आप विंडोज 3.1 नहीं चला रहे हैं, तब तक यह वास्तव में डॉस नहीं है)। हालाँकि, आप FOR- कमांड के साथ सेट-आधारित प्रोसेसिंग कर सकते हैं ।
संसाधित की जाने वाली फ़ाइलों की सूची बनाने के लिए, आप मैन्युअल रूप से संसाधित होने के लिए एक पाठ फ़ाइल बना सकते हैं, या dir /b <mask>
फ़ोर लूप के अंदर कमांड का उपयोग कर सकते हैं ।
कुछ के लिए मैंने कठिन तरीका सीखा है - आपको अपने कर्सर के रूप में एक एकल चर चर का उपयोग करने की आवश्यकता है!
FOR बैच कमांड पर Microsoft दस्तावेज़ देखें । आप निर्देशिकाओं के एक समूह, किसी निर्देशिका में फ़ाइलें या किसी निर्देशिका में फ़ाइलें और उसके सभी उप-निर्देशिकाओं में पुनरावृति के लिए उपयोग कर सकते हैं।
डिफ़ॉल्ट रूप से हैंडल के लिए सेट या सिर्फ फाइलें:
FOR %f IN (*.txt) DO ECHO %f
या, पुनरावर्ती के लिए:
FOR /R %f IN (*.txt) DO ECHO %f
या, बस निर्देशिकाओं के लिए:
FOR /D %d DO ECHO %d
यह एक छोटी सी डिबग फाइल है जिसे मैंने BATCH / CMD में अपने टिक टैक टो गेम से टे एरे का परीक्षण करने के लिए जाना था। यह कोड पर बड़े और जटिल होने वाले एरे वाइटआउट को पढ़ और लिख सकता है।
इसका उपयोग करना सरल है:
एक सरणी के लिए लेखन
एक सरणी से पढ़ना
कोड:
@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