2012-09-27 16 views
9

मैं निम्नलिखित स्ट्रिंग है:पार्सिंग स्ट्रिंग

MyProject/Architecture=32bit,BuildType=Debug,OS=winpc

मैं मान 32 बिट, डीबग, और WinPC आकर्षित करने और उन्हें आर्किटेक्चर, BuildType नामित चर में संग्रहीत करने के लिए, सक्षम होने के लिए चाहते हैं और बैच स्क्रिप्ट में बाद में संदर्भित करने के लिए ओएस। मैं आम तौर पर एक यूनिक्स लड़का हूं इसलिए यह मेरे लिए नया क्षेत्र है। किसी भी तरह की सहायता का स्वागत किया जाएगा!

उत्तर

24

यह करना चाहिए:

FOR /F "tokens=1-6 delims==," %%I IN ("MyProject/Architecture=32bit,BuildType=Debug,OS=winpc") DO (
    ECHO I %%I, J %%J, K %%K, L %%L, M %%M, N %%N 
) 
REM output is: I MyProject/Architecture, J 32bit, K BuildType, L Debug, M OS, N winpc 

बैच FOR पाश मशीनरी का एक बहुत दिलचस्प टुकड़ा है। कुछ पागल सामानों के वर्णन के लिए कंसोल में FOR /? टाइप करें।

+0

16 सेकंड, और अधिक क्लीनर! मैं आज के लिए वोट से बाहर हूं, इसलिए अब के लिए काल्पनिक +1; बाद में एक असली वोट के साथ वापस। – LittleBobbyTables

3

निम्नलिखित का प्रयास करें:

@ECHO OFF 

SET Var=MyProject/Architecture=32bit,BuildType=Debug,OS=winpc 

FOR /F "tokens=1,2,3 delims=," %%A IN ("%Var%") DO (
    FOR /F "tokens=1,2 delims==" %%D IN ("%%A") DO (
     SET Architecture=%%E 
    ) 
    FOR /F "tokens=1,2 delims==" %%D IN ("%%B") DO (
     SET BuildType=%%E 
    ) 
    FOR /F "tokens=1,2 delims==" %%D IN ("%%C") DO (
     SET OS=%%E 
    ) 
) 

ECHO %Architecture% 
ECHO %BuildType% 
ECHO %OS% 

PAUSE 
+4

बस मज़ेदार के लिए, अपने तीन आंतरिक 'फोर' लूप को सिंगल लाइन 'SET %% ए और एसईटी %% बी और एसईटी %% सी' के साथ बदलने पर विचार करें। महान नाम बीटीडब्ल्यू। –

5

यहाँ एक दिलचस्प समाधान है कि कितने और किस आदेश नाम = value जोड़े निर्दिष्ट कर रहे हैं परवाह नहीं करता है। यह चाल प्रत्येक कॉमा को एक लाइनफेड चरित्र के साथ प्रतिस्थापित करने के लिए है ताकि फॉर/एफ प्रत्येक नाम = मूल्य जोड़ी को फिर से सक्रिय करे। यह तब तक काम करना चाहिए जब तक स्ट्रिंग में केवल एक / न हो।

@echo off 
setlocal enableDelayedExpansion 
set "str=MyProject/Architecture=32bit,BuildType=Debug,OS=winpc" 

::Eliminate the leading project info 
set "str=%str:*/=%" 

::Define a variable containing a LineFeed character 
set LF=^ 


::The above 2 empty lines are critical - do not remove 

::Parse and set the values 
for %%A in ("!LF!") do (
    for /f "eol== tokens=1,2 delims==" %%B in ("!str:,=%%~A!") do set "%%B=%%C" 
) 

::Display the values 
echo Architecture=%Architecture% 
echo BuildType=%BuildType% 
echo OS=%OS% 
में थोड़ा और अधिक कोड यह चुनिंदा केवल नाम = value जोड़े है कि हम में रुचि रखते हैं पार्स आउट कर सकते हैं। यह भी मामले चर स्ट्रिंग से याद आ रही है में अपरिभाषित करने के लिए चर initializes साथ

@echo off 
setlocal enableDelayedExpansion 
set "str=MyProject/Architecture=32bit,BuildType=Debug,OS=winpc" 

::Eliminate the leading project info 
set "str=%str:*/=%" 

::Define a variable containing a LineFeed character 
set LF=^ 


::The above 2 empty lines are critical - do not remove 

::Define the variables we are interested in 
set "vars=Architecture BuildType OS" 

::Clear any existing values 
for %%A in (%vars%) do set "%%A=" 

::Set the values 
for %%A in ("!LF!") do (
    for /f "eol== tokens=1,2 delims==" %%B in ("!str:,=%%~A!") do (
    for %%D in (%vars%) do if "%%B"=="%%D" set "%%B=%%C" 
) 
) 

::Display the values 
for %%A in (%vars%) do echo %%A=!%%A! 
+0

यह अद्भुत और समझ में आता है। मुझे "% str =% str: */=%", और "! Str:, = %% ~ ए!" पर अधिक जानकारी पसंद आएगी। पहला व्यक्ति यह समझ में नहीं आता है कि अंत में '=' ​​क्यों है, दूसरे में एक रहस्य है ~ इसमें। – Kieveli

+0

डेटा के छोटे सेट के लिए काम करता है, लेकिन मैं अब 24k आइटमों की एक सूची पूछताछ कर रहा हूं, और कमांड आउटपुट का असाइनमेंट बैच फ़ाइल चर के लिए अधिकतम अनुमत लंबाई से अधिक प्रतीत होता है। – Kieveli

+1

@ किवेली - हां, सीएमडी.एक्सईई द्वारा उपयोग किए जाने वाले पर्यावरण चर लगभग 8191 बाइट्स तक सीमित हैं। – dbenham

संबंधित मुद्दे