2013-06-18 4 views
15

विंडोजबैच में अल्पविराम से अलग स्ट्रिंग के माध्यम से कैसे लूप करें?

पोस्ट (dos batch iterate through a delimited string) के आधार पर, मैंने नीचे एक स्क्रिप्ट लिखी लेकिन उम्मीद के अनुसार काम नहीं किया।

लक्ष्य: दिए गए स्ट्रिंग "सन, ग्रेनाइट, ट्वाइलाइट", मैं प्रत्येक विषय मूल्य लूप में प्राप्त करना चाहता हूं ताकि मैं मूल्य के साथ कुछ प्रसंस्करण कर सकूं।

वर्तमान उत्पादन corrct नहीं है:

list = "Sun,Granite,Twilight" 
file name is "Sun Granite Twilight" 

पहले यात्रा के लिए यह होना चाहिए:।

list = "Sun,Granite,Twilight" 
file name is "Sun" 

तो दूसरी यात्रा होना चाहिए ग्रेनाइट "" फ़ाइल का नाम है "और इतने पर क्या क्या मैं गलत कर रहा हूं?

कोड:

set themes=Sun,Granite,Twilight 

call :parse "%themes%" 
goto :end 

:parse 
setlocal 
set list=%1 
echo list = %list% 
for /F "delims=," %%f in ("%list%") do (
    rem if the item exist 
    if not "%%f" == "" call :getLineNumber %%f 
    rem if next item exist 
    if not "%%g" == "" call :parse "%%g" 
) 
endlocal 

:getLineNumber 
setlocal 
echo file name is %1 
set filename=%1 
endlocal 

:end 

उत्तर

6

मैंने आपके कोड में कुछ संशोधन किए हैं।

  1. गोटो की आवश्यकता है: सबराउटिन के अंत में और मुख्य दिनचर्या के अंत में आप सबराउटिन में नहीं आते हैं।
  2. टोकन = 1 * (%% च पहले टोकन है, %% जी लाइन के बाकी है)
  3. ~ सेट की सूची में =% ~ 1 उद्धरण दूर करने के लिए तो उद्धरण

    @echo off 
    set themes=Sun,Granite,Twilight 
    
    call :parse "%themes%" 
    pause 
    goto :eof 
    
    :parse 
    setlocal 
    set list=%~1 
    echo list = %list% 
    for /F "tokens=1* delims=," %%f in ("%list%") do (
        rem if the item exist 
        if not "%%f" == "" call :getLineNumber %%f 
        rem if next item exist 
        if not "%%g" == "" call :parse "%%g" 
    ) 
    endlocal 
    goto :eof 
    
    :getLineNumber 
    setlocal 
    echo file name is %1 
    set filename=%1 
    goto :eof 
    
  4. अर्जित नहीं करेंगे
+0

टिप के लिए धन्यवाद! क्या आप लाइन को समझा सकते हैं: सेट सूची =% ~ 1% ~ 1 का क्या अर्थ है? –

+0

ओह आप पहले ही समझाया गया है :) –

+0

बस मेरी समझ के लिए: है: एक "बिल्टिन" लेबल? चूंकि मुझे यह परिभाषित नहीं दिख रहा है। और subroutine में यह "वापसी" के रूप में कार्य करता है? अजीब नियंत्रण प्रवाह, हालांकि :) – Krischu

0

ऐसा लगता है कि "टोकन" कीवर्ड की जरूरत ...

@echo off 
set themes=Sun,Granite,Twilight 

call :parse "%themes%" 
goto :end 

:parse 
setlocal 
set list=%1 

for /F "delims=, tokens=1*" %%f in (%list%) do (
    rem if the item exist 
    if not "%%f" == "" call :getLineNumber %%f 
    rem if next item exist 
    if not "%%g" == "" call :parse "%%g" 
) 
endlocal 
goto :end 

:getLineNumber 
setlocal 
echo file name is %1 
set filename=%1 
endlocal 

:end 
30

इस तरह है मुझे लगता है कि क्या करना होगा:

@echo off 
set themes=Sun,Granite,Twilight 
echo list = "%themes%" 
for %%a in ("%themes:,=" "%") do (
    echo file name is %%a 
) 

यही है, Sun,Granite,Twilight"Sun" "Granite" "Twilight" द्वारा बदलें और फिर नियमित रूप से (NO/F विकल्प) for कमांड में उद्धरणों में संलग्न प्रत्येक भाग को संसाधित करें। यह विधि "delims=," पर आधारित एक पुनरावृत्त for /F लूप की तुलना में बहुत सरल है।

+1

क्या यह भी संभालता है जब किसी थीम नाम में व्हाइटस्पेस होता है? (मैं अब इस मुद्दे पर फंस गया हूँ ..) –

+0

यह करता है, बस परीक्षण किया। (क्षमा करें) मुझे लगता है कि इस तरह से बहुत आसान है। –

+1

मुझे नहीं लगता कि आपको अल्पविरामों के लिए स्ट्रिंग प्रतिस्थापन की भी आवश्यकता है। देखें: http://stackoverflow.com/a/8086103/82211 – Justin

10

मैंने Aacini का उत्तर लिया और उद्धरणों को हटाने के लिए इसे थोड़ा संशोधित किया, ताकि उद्धरण को वांछित आदेश में जोड़ा जा सके या हटाया जा सके।

@echo off 
set themes=Hot Sun,Hard Granite,Shimmering Bright Twilight 
for %%a in ("%themes:,=" "%") do (
    echo %%~a 
) 
संबंधित मुद्दे