दिलचस्प पोस्ट
क्या स्विच में हमेशा एक डिफ़ॉल्ट खंड होता है? हमेशा एंड्रॉइड का उपयोग क्यों न करें: configChanges = "keyboardHidden" अभिविन्यास? क्या आप ORDER BY में एक I स्टेटमेंट जोड़ सकते हैं? PHP में सुरक्षित उपयोगकर्ता छवि अपलोड क्षमताओं हम System.in से एक बार में एक अक्षर क्यों नहीं पढ़ सकते हैं? ओएस एक्स (योसेमाइट या एल कैपिटन) के नवीनतम संस्करण की स्थापना के बाद `pg_tblspc` लापता jQuery – एक टेक्स्टरेआ से सभी पाठ चुनें तेजी से समय बीत चुका है PHP में अधिकतम POST चर को कैसे बढ़ाएं? एचटीटीपीएसर्वेटरेक्स्ट से जेएसओएन ऑब्जेक्ट को प्राप्त करना क्या 'offsetof' मैक्रो <stddef.h> से अनिर्धारित व्यवहार लागू होता है? एकाधिक स्ट्रिंग को एक बार में बदलें mysql फ़ील्ड का नाम से चर एक जावास्क्रिप्ट स्ट्रिंग एसक्यूएल दोस्ताना बनाने एक शब्दकोश के भीतर न्यूनतम मूल्य के समान कुंजी प्राप्त करें

विंडोज बैच स्क्रिप्ट को .ini फ़ाइल को पढ़ने के लिए

मैं निम्न प्रारूप के साथ .ini फ़ाइल को पढ़ने की कोशिश कर रहा हूं:

 [SectionName] total=4 [AnotherSectionName] total=7 [OtherSectionName] total=12 

असल में मैं .ini फ़ाइल से कुछ मूल्यों को मुद्रित करना चाहता हूँ, उदाहरण के लिए OtherSectionName तहत कुल OtherSectionName बाद।

वेब के समाधान से एकत्रित समाधान "विंडोज बैच स्क्रिप्ट को .ini फ़ाइल को पढ़ने के लिए"

यहां एक कमांड फाइल ( ini.cmd ) है जिसे आप प्रासंगिक मानों को निकालने के लिए उपयोग कर सकते हैं:

 @setlocal enableextensions enabledelayedexpansion @echo off set file=%~1 set area=[%~2] set key=%~3 set currarea= for /f "usebackq delims=" %%a in ("!file!") do ( set ln=%%a if "x!ln:~0,1!"=="x[" ( set currarea=!ln! ) else ( for /f "tokens=1,2 delims==" %%b in ("!ln!") do ( set currkey=%%b set currval=%%c if "x!area!"=="x!currarea!" if "x!key!"=="x!currkey!" ( echo !currval! ) ) ) ) endlocal 

और यह एक प्रतिलेख है जो इसे दिखा रहा है (यह मैन्युअल रूप से आउटपुट को इंडेंट किया है जिससे इसे पढ़ने में आसान हो):

 c:\src>type ini.ini [SectionName] total=4 [AnotherSectionName] total=7 [OtherSectionName] total=12 c:\src>ini.cmd ini.ini SectionName total 4 c:\src>ini.cmd ini.ini AnotherSectionName total 7 c:\src>ini.cmd ini.ini OtherSectionName total 12 

वास्तव में इसे किसी अन्य cmd फ़ाइल में उपयोग करने के लिए, बस इसके नीचे जो भी आप करना चाहते हैं, उसके साथ नीचे echo %val% लाइन की जगह दें):

 for /f "delims=" %%a in ('call ini.cmd ini.ini AnotherSectionName total') do ( set val=%%a ) echo %val% 

मुझे पता है कि मैं पार्टी में थोड़ा देर कर रहा हूं, लेकिन मैंने इस सवाल का समाधान करने के लिए एक सामान्य प्रयोजन आईआईआई फ़ाइल यूटिलिटी बैच स्क्रिप्ट लिखने का फैसला किया।

स्क्रिप्ट आपको इन-स्टाइल फ़ाइल में मूल्यों को पुनर्प्राप्त या संशोधित करने देगा। इसकी खोज केस-असंवेदनशील है, और यह फाइल में रिक्त पंक्तियों को सुरक्षित रखती है। संक्षेप में, यह आपको एक ini फ़ाइल के साथ बहुत कमजोर डेटाबेस के रूप में इंटरैक्ट करने की अनुमति देता है।

यह स्क्रिप्ट ठीक काम करेगी यदि आप केवल अल्फ़ान्यूमेरिक मानों या प्रतीकों को पढ़ने / लिखने वाले हैं जो कि cmd इंटरप्रीटर के लिए कोई खास अर्थ नहीं है। अगर आपको एम्पर्संस, पीसेंट्स इत्यादि वाले मूल्यों को संभालने में सक्षम कुछ चाहिए, तो नीचे अपडेट अनुभाग देखें।

 :: -------------------- :: ini.bat :: ini.bat /? for usage :: -------------------- @echo off setlocal enabledelayedexpansion goto begin :usage echo Usage: %~nx0 /i item [/v value] [/s section] inifile echo; echo Take the following ini file for example: echo; echo [Config] echo password=1234 echo usertries=0 echo allowterminate=0 echo; echo To read the "password" value: echo %~nx0 /s Config /i password inifile echo; echo To change the "usertries" value to 5: echo %~nx0 /s Config /i usertries /v 5 inifile echo; echo In the above examples, "/s Config" is optional, but will allow the selection of echo a specific item where the ini file contains similar items in multiple sections. goto :EOF :begin if "%~1"=="" goto usage for %%I in (item value section found) do set %%I= for %%I in (%*) do ( if defined next ( if !next!==/i set item=%%I if !next!==/v set value=%%I if !next!==/s set section=%%I set next= ) else ( for %%x in (/i /v /s) do if "%%~I"=="%%x" set "next=%%~I" if not defined next ( set "arg=%%~I" if "!arg:~0,1!"=="/" ( 1>&2 echo Error: Unrecognized option "%%~I" 1>&2 echo; 1>&2 call :usage exit /b 1 ) else set "inifile=%%~I" ) ) ) for %%I in (item inifile) do if not defined %%I goto usage if not exist "%inifile%" ( 1>&2 echo Error: %inifile% not found. exit /b 1 ) if not defined section ( if not defined value ( for /f "usebackq tokens=2 delims==" %%I in (`findstr /i "^%item%\=" "%inifile%"`) do ( echo(%%I ) ) else ( for /f "usebackq delims=" %%I in (`findstr /n "^" "%inifile%"`) do ( set "line=%%I" && set "line=!line:*:=!" echo(!line! | findstr /i "^%item%\=" >NUL && ( 1>>"%inifile%.1" echo(%item%=%value% echo(%value% ) || 1>>"%inifile%.1" echo(!line! ) ) ) else ( for /f "usebackq delims=" %%I in (`findstr /n "^" "%inifile%"`) do ( set "line=%%I" && set "line=!line:*:=!" if defined found ( if defined value ( echo(!line! | findstr /i "^%item%\=" >NUL && ( 1>>"%inifile%.1" echo(%item%=%value% echo(%value% set found= ) || 1>>"%inifile%.1" echo(!line! ) else echo(!line! | findstr /i "^%item%\=" >NUL && ( for /f "tokens=2 delims==" %%x in ("!line!") do ( echo(%%x exit /b 0 ) ) ) else ( if defined value (1>>"%inifile%.1" echo(!line!) echo(!line! | find /i "[%section%]" >NUL && set found=1 ) ) ) if exist "%inifile%.1" move /y "%inifile%.1" "%inifile%">NUL 

उदाहरण

example.ini सामग्री:

 [SectionName] ; This is a comment. total=4 [AnotherSectionName] # This is another comment. total=7 [OtherSectionName] And it should work with non-standard comments as well. total=12 

टेस्ट सत्र:

 C:\Users\me\Desktop>ini /s AnotherSectionName /i total example.ini 7 C:\Users\me\Desktop>ini /s othersectionname /i Total /v f00 example.ini f00 C:\Users\me\Desktop>type example.ini [SectionName] ; This is a comment. total=4 [AnotherSectionName] # This is another comment. total=7 [OtherSectionName] And it should work with non-standard comments as well. Total=f00 

अद्यतन करें

जाहिरा तौर पर शुद्ध बैच समाधान जब इसे & (और संभवत: % और अन्य) की तरह वर्णों का सामना करते हैं तो दम घुटता है तो यहां एक अधिक मजबूत बैच + जेस्क्रिप्ट हाइब्रिड स्क्रिप्ट है जो उस समस्या को हल करता है। सिंटैक्स और आउटपुट समान होते हैं (लेकिन item=value जोड़ों को हटाने के लिए एक अतिरिक्त /d स्विच के साथ)

सफलता के लिए यह स्क्रिप्ट %ERRORLEVEL%=0 सेट करता है, और त्रुटि पर %ERRORLEVEL%=1

 @if (@a==@b) @end /* -- batch / JScript hybrid line to begin JScript comment :: -------------------- :: ini.bat :: ini.bat /? for usage :: -------------------- @echo off setlocal enabledelayedexpansion goto begin :: color code by jeb -- https://stackoverflow.com/a/5344911/1683264 :c set "param=^%~2" ! set "param=!param:"=\"!" findstr /p /A:%1 "." "!param!\..\X" nul <nul set /p ".=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%" exit /b :: but it doesn't handle slashes. :( :s <NUL set /p "=/"&exit /b :usage for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do set "DEL=%%a" <nul > X set /p ".=." echo Usage: call :c 07 " query:" call :c 0F " %~nx0 "&call :s&call :c 0F "i item ["&call :s&call :c 0F "s section] inifile"&echo; call :c 07 " create or modify:" call :c 0F " %~nx0 "&call :s&call :c 0F "i item "&call :s&call :c 0F "v value ["&call :s&call :c 0F "s section] inifile"&echo; call :c 07 " delete:" call :c 0F " %~nx0 "&call :s&call :c 0F "d item ["&call :s&call :c 0F "s section] inifile"&echo; echo; echo Take the following ini file for example: echo; echo [Config] echo password=1234 echo usertries=0 echo allowterminate=0 echo; echo To read the "password" value: call :c 0F " %~nx0 "&call :s&call :c 0F "s Config "&call :s&call :c 0F "i password inifile"&echo; echo; echo To modify the "usertries" value to 5: call :c 0F " %~nx0 "&call :s&call :c 0F "s Config "&call :s&call :c 0F "i usertries "&call :s&call :c 0F "v 5 inifile"&echo; echo; echo To add a "timestamp" key with a value of the current date and time: call :c 0F " %~nx0 "&call :s&call :c 0F "s Config "&call :s&call :c 0F "i timestamp "&call :s&call :c 0F "v ""%DEL%%%%%date%%%% %%%%time%%%%""%DEL% inifile"&echo; echo; echo To delete the "allowterminate" key: call :c 0F " %~nx0 "&call :s&call :c 0F "s Config "&call :s&call :c 0F "d allowterminate inifile"&echo; echo; call :c 07 "In the above examples, "&call :s call :c 0F "s Config " echo is optional, but will allow the selection of echo a specific item where the ini file contains similar items in multiple sections. del X goto :EOF :begin if "%~1"=="" goto usage for %%I in (item value section found) do set %%I= for %%I in (%*) do ( if defined next ( if !next!==/i set "item=%%~I" if !next!==/v ( set modify=true set "value=%%~I" ) if !next!==/d ( set "item=%%~I" set modify=true set delete=true ) if !next!==/s set "section=%%~I" set next= ) else ( for %%x in (/i /v /s /d) do if "%%~I"=="%%x" set "next=%%~I" if not defined next ( set "arg=%%~I" if "!arg:~0,1!"=="/" ( 1>&2 echo Error: Unrecognized option "%%~I" 1>&2 echo; 1>&2 call :usage exit /b 1 ) else set "inifile=%%~I" ) ) ) for %%I in (item inifile) do if not defined %%I goto usage if not exist "%inifile%" ( 1>&2 echo Error: %inifile% not found. exit /b 1 ) cscript /nologo /e:jscript "%~f0" "%inifile%" "!section!" "!item!" "!value!" "%modify%" "%delete%" exit /b %ERRORLEVEL% :: Begin JScript portion */ var inifile = WSH.Arguments(0), section = WSH.Arguments(1), item = WSH.Arguments(2), value = WSH.Arguments(3), modify = WSH.Arguments(4), del = WSH.Arguments(5), fso = new ActiveXObject("Scripting.FileSystemObject"), stream = fso.OpenTextFile(inifile, 1), // (stream.ReadAll() will not preserve blank lines.) data = []; while (!stream.atEndOfStream) { data.push(stream.ReadLine()); } stream.Close(); // trims whitespace from edges String.prototype.trim = function() { return this.replace(/^\s+|\s+$/,'') } // trim + toLowerCase String.prototype.unify = function() { return this.trim().toLowerCase(); }; // unquotes each side of "var"="value" String.prototype.splitEx = function(x) { for (var i=0, ret = this.split(x) || []; i<ret.length; i++) { ret[i] = ret[i].replace(/^['"](.*)['"]$/, function(m,$1){return $1}); }; return ret; } // splices a new element into an array just after the last non-empty element. If first arg is a number, start at that position and look backwards. Array.prototype.cram = function() { for (var args=[], i=0; i<arguments.length; i++) { args.push(arguments[i]); } var i = (typeof args[0] == "number" && Math.floor(args[0]) == args[0]) ? args.shift() : this.length; while (i>0 && !this[--i].length) {}; for (var j=0; j<args.length; j++) this.splice(++i, 0, args[j]); } function saveAndQuit() { while (data && !data[data.length - 1].length) data.pop(); var stream = fso.OpenTextFile(inifile, 2, true); stream.Write(data.join('\r\n') + '\r\n'); stream.Close(); WSH.Quit(0); } function fatal(err) { WSH.StdErr.WriteLine(err); WSH.Quit(1); } if (section && !/^\[.+\]$/.test(section)) section = '[' + section + ']'; if (modify) { if (section) { for (var i=0; i<data.length; i++) { if (data[i].unify() == section.unify()) { for (var j=i + 1; j<data.length; j++) { if (/^\s*\[.+\]\s*$/.test(data[j])) break; var keyval = data[j].splitEx('='); if (keyval.length < 2) continue; var key = keyval.shift(), val = keyval.join('='); if (key.unify() == item.unify()) { if (del) data.splice(j, 1); else { data[j] = item + '=' + value; WSH.Echo(value.trim()); } saveAndQuit(); } } if (del) fatal(item + ' not found in ' + section + ' in ' + inifile); data.cram(j ,item + '=' + value); WSH.Echo(value.trim()); saveAndQuit(); } } if (del) fatal(section + ' not found in ' + inifile); data.cram('\r\n' + section, item + '=' + value); WSH.Echo(value.trim()); saveAndQuit(); } else { // if (!section) for (var i=0; i<data.length; i++) { var keyval = data[i].splitEx('='); if (keyval.length < 2) continue; var key = keyval.shift(), val = keyval.join('='); if (key.unify() == item.unify()) { if (del) data.splice(i, 1); else { data[i] = item + '=' + value; WSH.Echo(value.trim()); } saveAndQuit(); } } if (del) fatal(item + ' not found in ' + inifile); data.cram(item + '=' + value); WSH.Echo(value.trim()); saveAndQuit(); } } else if (section) { // and if (!modify) for (var i=0; i<data.length; i++) { if (data[i].unify() == section.unify()) { for (var j=i + 1; j<data.length; j++) { if (/^\s*\[.+\]\s*$/.test(data[j])) fatal(item + ' not found in ' + section + ' in ' + inifile); var keyval = data[j].splitEx('='); if (keyval.length < 2) continue; var key = keyval.shift(), val = keyval.join('='); if (key.unify() == item.unify()) { WSH.Echo(val.trim()); WSH.Quit(0); } } } } fatal(section + ' not found in ' + inifile); } else { // if (item) and nothing else for (var i=0; i<data.length; i++) { var keyval = data[i].splitEx('='); if (keyval.length < 2) continue; var key = keyval.shift(), val = keyval.join('='); if (key.unify() == item.unify()) { WSH.Echo(val.trim()); WSH.Quit(0); } } fatal(item + ' not found in ' + inifile); } 

ini.bat उपयोग स्क्रीन

वर्तमान निर्देशिका फ़ॉर्म में विंडोज़ बैच (.bat) में config.ini फ़ाइल पढ़ने के लिए मेरे पास कम प्रस्ताव है:

बैच फ़ाइल के पास हम उस कोड को चिपकते हैं:

 :ini @for /f "tokens=2 delims==" %%a in ('find "%~1=" config.ini') do @set %~2=%%a @goto:eof 

और बैच फ़ाइल की शुरूआत के करीब हम इसे कॉल करते हैं:

 @call:ini IniFieldName batchVarName @echo IniFieldName is: %batchVarName% 

config.ini

 foo=string bar=123 baz=spaces work too! 

windows_batch.cmd

 for /F "tokens=*" %%I in (config.ini) do set %%I 

यहाँ दस्तावेज़ है आशा करता हूँ की ये काम करेगा!

पुरानी सवाल है लेकिन मैं अभी हाल ही में जरूरी था और पाक्षीब्लो का जवाब मिला। मुझे कुछ और जरूरत थी इसलिए मैंने उसका जवाब समृद्ध किया और अब मैं वापस दे रहा हूं।

मुझे जो भी ज़रूरत थी, वह खोजना था कि किस कुंजी में एक विशिष्ट मूल्य था। इसके अलावा, स्पष्ट रूप से रूट अनुभाग का समर्थन (कोई अनुभाग नाम नहीं)

यह मेरा कोड है, एक फ़ंक्शन जिसे मैं लाइब्रेरी (सीएमडीलिब चर) में डालता हूं, जब मुझे इसकी आवश्यकता होती है (अन्य फ़ंक्शन के बीच)।

 :ReadINI REM ReadINI - Get value from [Section]; Key from an INI File. REM Arguments: REM File INI-file to read from REM Key Name of the entry REM Section Name of the [Section] under which the Value is. REM Optional, will find a value from the root section if empty. REM For root section, set to "-" to also use "Value" REM Value If Key is set to "-", will find which Key has "Value" REM REM Returns: A string of text will be echoed, ready for logging. REM An echo of the value. REM REM Call example: REM for /f "delims=" %%a in ('Call "%CMDLib%" ReadINI "Inifile" Key Section') do ( set Value=%%a) REM REM Original: http://stackoverflow.com/a/2866328/151152 rem ------- Function header ------- Setlocal ENABLEDELAYEDEXPANSION :: Logging formatting if not defined nest (set /a nest=0) else set /a Nest=%nest%+1 if %nest% GEQ 1 if not defined _tab (set _tab= ) else for /l %%i in (0, %nest%,1) do set _tab=%_tab% rem ------- Function body ------- set file=%~1 set key=%~2 set Section=[%~3] if "%Section%"=="-" set Section= set value=%~4 set currSection= Set RC=0 for /f "usebackq delims=" %%a in ("%file%") do ( set ln=%%a if "x!ln:~0,1!"=="x[" ( set currSection=!ln! ) else ( for /f "tokens=1,2 delims==" %%b in ("!ln!") do ( set currkey=%%b set currval=%%c if /i "x!Section!"=="x!currSection!" ( if /i "x!key!"=="x!currkey!" ( echo !currval! if %_D% GEQ 2 echo %_tab%[%0 - RC:%RC%] exit /b %RC% ) Else if "x!key!"=="x-" ( if /i "x!value!"=="x!currval!" ( echo !currkey! if %_D% GEQ 2 echo %_tab%[%0 - RC:%RC%] exit /b %RC% ) ) ) ) ) ) if %_D% GEQ 2 echo %_tab%[%0 - RC:%RC%] Exit /b %RC% rem ------- Function end ------- 

सीएमडी के लिए कोई सिंटेक्स हाइलाइटिंग नहीं है? कि एक शर्म की बात है.. 😉

उम्मीद है कि यह अन्य रूप में अच्छी तरह से मदद करता है।

हम्म, शायद यह किसी को मदद करता है .. इसे बनाने के लिए inifile.exe के बाद से चाल से बाहर भाग गया और लगता है कि हर निन्दा अंतराल वेब पर 'कुंजी' जब सभी की जरूरत है [खंड] के तहत सभी मूल्यों है। तो, यहां अनुभाग प्रिंट है ..

 @echo off SETLOCAL DisableDelayedExpansion IF "%1"=="" (echo Usage: section input.ext output.ext & goto eof ) IF "%2"=="" (echo Usage: section input.ext output.ext & goto eof ) IF NOT EXIST "%2" (echo File does not exist. Usage: section input.ext output.ext & goto eof ) IF "%3"=="" (echo Usage: section input.ext output.ext & goto eof ) FOR /F "tokens=*" %%A IN ('findstr /I /N "\[.*\]" %2') DO (echo %%A>>LINE_START.DAT) FOR /F "tokens=1,2 delims=:" %%A IN ('findstr /I "\[%1\]" LINE_START.DAT') DO ( SETLOCAL EnableDelayedExpansion set FIRSTLINE=%%A ) set /a "FIRSTLINE+=1" FOR /F "tokens=1,2* delims=:" %%A IN ('findstr /I /N ".*" %2') DO ( IF %%A GEQ !FIRSTLINE! (echo %%B>>LINE_END.DAT) ) set ENDLINE=500 FOR /F "tokens=1,2* delims=:" %%A IN ('findstr /I /N "\[.*\]" LINE_END.DAT') DO ( IF %%A LSS !ENDLINE! (set /a "ENDLINE=%%A") ELSE echo %%A>nul ) set /a "ENDLINE-=1" FOR /F "tokens=1,2* delims=:" %%A IN ('findstr /I /N ".*" LINE_END.DAT') DO ( IF %%A LEQ !ENDLINE! (echo %%B>>%3) ELSE ENDLOCAL ) set ENDLINE=0 set FIRSTLINE=0 ENDLOCAL DEL /Q LINE_*.DAT :end 

हाँ, हाँ, मुझे पता है कि यह पीछे की तरह दिखता है, लेकिन यह काम करता है, यद्यपि, यह निश्चित नहीं है कि यह फ़ोल्डर में रिक्त स्थान या फ़ाइलों में रिक्त स्थान के साथ काम करेगा। इसे मूलतः एक ही फ़ोल्डर में .ini फ़ाइल बना दिया गया है और कमांड लाइन से भाग गया

उपयोग: genetix_ini.cmd अनुभाग इनपुट.ext output.ext

# 2 अद्यतन: लगता है, मैंने 2 सेट वार्स को शून्य नहीं करने पर गलती की। जो स्क्रिप्ट के दूसरे पास में एक समस्या पैदा करना शुरू कर दिया था।