मेरे पास एक बैच फ़ाइल है और मैं बाहरी फ़ाइल को शामिल करना चाहता हूं जिसमें कुछ चर (जैसे कॉन्फ़िगरेशन चर) होते हैं। क्या यह संभव है?
जवाबों:
नोट: मैं विंडोज बैच फ़ाइलों को मान रहा हूं क्योंकि ज्यादातर लोग इस बात से अनजान हैं कि महत्वपूर्ण अंतर हैं और सिर्फ काले रंग की पृष्ठभूमि डॉस पर ग्रे टेक्स्ट के साथ सब कुछ आँख बंद करके कहते हैं। फिर भी, पहले संस्करण को DOS में भी काम करना चाहिए।
ऐसा करने का सबसे आसान तरीका है कि बस चर को एक बैच फ़ाइल में रखें, प्रत्येक अपने स्वयं के set
बयान के साथ:
set var1=value1
set var2=value2
...
और आपके मुख्य बैच में:
call config.cmd
बेशक, यह भी चर को सशर्त रूप से या सिस्टम के पहलुओं के आधार पर बनाने में सक्षम बनाता है, इसलिए यह बहुत बहुमुखी है। हालांकि, मनमाना कोड वहां चल सकता है और यदि कोई सिंटैक्स त्रुटि है, तो आपका मुख्य बैच भी बाहर निकल जाएगा। UNIX दुनिया में यह काफी सामान्य है, विशेष रूप से गोले के लिए। और अगर आप इसके बारे में सोचते हैं, autoexec.bat
तो कुछ और नहीं है।
एक और तरीका होगा var=value
कॉन्फ़िगरेशन फ़ाइल में कुछ प्रकार के जोड़े:
var1=value1
var2=value2
...
फिर आप उन्हें लोड करने के लिए निम्नलिखित स्निपेट का उपयोग कर सकते हैं:
for /f "delims=" %%x in (config.txt) do (set "%%x")
यह पहले की तरह ही एक ट्रिक का उपयोग करता है, अर्थात् set
प्रत्येक लाइन पर उपयोग करते हुए। उद्धरण जैसी चीजों से बचने के लिए देखते हैं <
, >
, &
, |
। हालांकि, वे स्वयं तोड़ देंगे जब उद्धरण इनपुट में उपयोग किए जाते हैं। इसके अलावा, आपको हमेशा सावधान रहने की जरूरत है जब इस तरह के पात्रों के साथ संग्रहीत चर में डेटा संसाधित किया जाए।
आम तौर पर, स्वचालित रूप से मनमाना इनपुट से बचने के लिए कोई सिरदर्द या बैच फ़ाइलों में समस्याएं मेरे लिए बहुत असंभव लगती हैं। कम से कम मुझे अभी तक ऐसा करने का कोई तरीका नहीं मिला। बेशक, पहले समाधान के साथ आप उस ज़िम्मेदारी को कॉन्फ़िगर फ़ाइल को लिखने वाले को दे रहे हैं।
यदि बाहरी कॉन्फ़िगरेशन फ़ाइल भी मान्य बैच फ़ाइल है, तो आप इसका उपयोग कर सकते हैं:
call externalconfig.bat
अपनी स्क्रिप्ट के अंदर। निम्नलिखित a.bat बनाने का प्रयास करें:
@echo off
call b.bat
echo %MYVAR%
और b.bat:
set MYVAR=test
A.bat चलाने से आउटपुट उत्पन्न होना चाहिए:
test
call
, जो कि btw सिंक्रोनस है), तो यह कहता है कि "प्रक्रिया फ़ाइल का उपयोग नहीं कर सकती है क्योंकि इसका उपयोग किया जा रहा है" और इसे लागू नहीं किया जा सकता है।
बैच इनपुट और आउटपुट पाइप के रूप में ब्रैकेट से कम और अधिक का उपयोग करता है।
>file.ext
ऊपर की तरह केवल एक आउटपुट ब्रैकेट का उपयोग करने से उस फ़ाइल की सभी जानकारी ओवरराइट हो जाएगी।
>>file.ext
डबल राइट ब्रैकेट का उपयोग करने से फाइल में अगली लाइन जुड़ जाएगी।
(
echo
echo
)<file.ext
यह फ़ाइल की तर्ज पर मापदंडों को निष्पादित करेगा। इस मामले में, हम दो लाइनों का उपयोग कर रहे हैं जो "इको" का उपयोग करके टाइप किया जाएगा। दाईं कोष्ठक कोष्ठक को छूने वाले बाएं कोष्ठक का अर्थ है कि उस फ़ाइल की जानकारी को उन पंक्तियों में पाइप किया जाएगा।
मैंने एक उदाहरण केवल-पढ़ने / लिखने के लिए संकलित किया है। नीचे प्रत्येक भाग क्या करता है यह समझाने के लिए नीचे खंडों में फ़ाइल को तोड़ा गया है।
@echo off
echo TEST R/W
set SRU=0
एसआरयू इस उदाहरण में कुछ भी हो सकता है। यदि आप बहुत तेज़ी से Enter दबाते हैं तो हम वास्तव में क्रैश को रोकने के लिए इसे सेट कर रहे हैं।
set /p SRU=Skip Save? (y):
if %SRU%==y goto read
set input=1
set input2=2
set /p input=INPUT:
set /p input2=INPUT2:
अब, हमें चर को एक फ़ाइल में लिखने की आवश्यकता है।
(echo %input%)> settings.cdb
(echo %input2%)>> settings.cdb
pause
मैं "कमांड डेटाबेस" के लिए एक संक्षिप्त रूप के रूप में .cdb का उपयोग करता हूं। आप किसी भी एक्सटेंशन का उपयोग कर सकते हैं। अगला भाग खरोंच से कोड का परीक्षण करना है। हम सेट चर का उपयोग नहीं करना चाहते हैं जो फ़ाइल की शुरुआत में चलाए गए थे, हम वास्तव में उन्हें सेटिंग्स से लोड करना चाहते हैं। जैसा हमने अभी लिखा था।
:read
(
set /p input=
set /p input2=
)<settings.cdb
इसलिए, हमने केवल जानकारी की पहली दो पंक्तियों को पाइप किया था जो आपने फ़ाइल की शुरुआत में लिखी थी (जिसमें आपके पास यह सुनिश्चित करने के लिए कि यह काम कर रहा है यह जांचने के लिए लाइनें सेट करना छोड़ दें) इनपुट और input2 के चर सेट करें।
echo %input%
echo %input2%
pause
if %input%==1 goto newecho
pause
exit
:newecho
echo If you can see this, good job!
pause
exit
यह उस जानकारी को प्रदर्शित करता है जो सेटिंग्स के दौरान सेट की गई थी। LCDb को कोष्ठक में डाला गया था। एक अतिरिक्त अच्छे-कार्य प्रेरक के रूप में, डिफ़ॉल्ट मानों को दबाने और सेट करने के लिए जो हम पहले "1" के रूप में सेट करते हैं, एक अच्छा नौकरी संदेश लौटाएगा। ब्रैकेट पाइप का उपयोग करना दोनों तरीके से जाता है, और "फॉर" सामान सेट करने की तुलना में बहुत आसान है। :)
तो आपको बस यह अधिकार करना होगा ?:
@echo off
echo text shizzle
echo.
echo pause^>nul (press enter)
pause>nul
REM writing to file
(
echo XD
echo LOL
)>settings.cdb
cls
REM setting the variables out of the file
(
set /p input=
set /p input2=
)<settings.cdb
cls
REM echo'ing the variables
echo variables:
echo %input%
echo %input2%
pause>nul
if %input%==XD goto newecho
DEL settings.cdb
exit
:newecho
cls
echo If you can see this, good job!
DEL settings.cdb
pause>nul
exit
:: savevars.bat
:: Use $ to prefix any important variable to save it for future runs.
@ECHO OFF
SETLOCAL
REM Load variables
IF EXIST config.txt FOR /F "delims=" %%A IN (config.txt) DO SET "%%A"
REM Change variables
IF NOT DEFINED $RunCount (
SET $RunCount=1
) ELSE SET /A $RunCount+=1
REM Display variables
SET $
REM Save variables
SET $>config.txt
ENDLOCAL
PAUSE
EXIT /B
आउटपुट:
$ RunCount = 1
$ RunCount = 2
$ RunCount = 3
ऊपर उल्लिखित तकनीक का उपयोग कई बैच फ़ाइलों के बीच चर साझा करने के लिए भी किया जा सकता है।
किंडा पुराना विषय है लेकिन कुछ दिन पहले मेरा भी यही सवाल था और मैं एक और विचार लेकर आया (शायद कोई इसे अब भी उपयोगी समझेगा)
उदाहरण के लिए, आप विभिन्न विषयों (परिवार, आकार, रंग, जानवरों) के साथ एक config.bat बना सकते हैं और उन्हें किसी भी क्रम में व्यक्तिगत रूप से लागू कर सकते हैं जो आप अपने बैच स्क्रिप्ट में कहीं भी चाहते हैं:
@echo off
rem Empty the variable to be ready for label config_all
set config_all_selected=
rem Go to the label with the parameter you selected
goto :config_%1
REM This next line is just to go to end of file
REM in case that the parameter %1 is not set
goto :end
REM next label is to jump here and get all variables to be set
:config_all
set config_all_selected=1
:config_family
set mother=Mary
set father=John
set sister=Anna
rem This next line is to skip going to end if config_all label was selected as parameter
if not "%config_all_selected%"=="1" goto :end
:config_test
set "test_parameter_all=2nd set: The 'all' parameter WAS used before this echo"
if not "%config_all_selected%"=="1" goto :end
:config_size
set width=20
set height=40
if not "%config_all_selected%"=="1" goto :end
:config_color
set first_color=blue
set second_color=green
if not "%config_all_selected%"=="1" goto :end
:config_animals
set dog=Max
set cat=Miau
if not "%config_all_selected%"=="1" goto :end
:end
उसके बाद, आप इसे 'कॉल config.bat all' के साथ पूरी तरह से कॉल करके या इसके केवल हिस्सों को कॉल करके कहीं भी उपयोग कर सकते हैं (उदाहरण bellow देखें) यहां पर विचार यह है कि कभी-कभी अधिक आसान होता है जब आपके पास सब कुछ कॉल करने का विकल्प नहीं होता है एक बार। कुछ चर शायद आप अभी तक नहीं बुलाया जाना चाहते हैं इसलिए आप उन्हें बाद में कॉल कर सकते हैं।
उदाहरण परीक्षण
@echo off
rem This is added just to test the all parameter
set "test_parameter_all=1st set: The 'all' parameter was NOT used before this echo"
call config.bat size
echo My birthday present had a width of %width% and a height of %height%
call config.bat family
call config.bat animals
echo Yesterday %father% and %mother% surprised %sister% with a cat named %cat%
echo Her brother wanted the dog %dog%
rem This shows you if the 'all' parameter was or not used (just for testing)
echo %test_parameter_all%
call config.bat color
echo His lucky color is %first_color% even if %second_color% is also nice.
echo.
pause
आशा है कि यह मदद करता है जिस तरह से दूसरों ने मुझे अपने जवाबों के साथ यहाँ मदद की है।
उपरोक्त का एक छोटा संस्करण:
config.bat
@echo off
set config_all_selected=
goto :config_%1
goto :end
:config_all
set config_all_selected=1
:config_family
set mother=Mary
set father=John
set daughter=Anna
if not "%config_all_selected%"=="1" goto :end
:config_size
set width=20
set height=40
if not "%config_all_selected%"=="1" goto :end
:end
test.bat
@echo off
call config.bat size
echo My birthday present had a width of %width% and a height of %height%
call config.bat family
echo %father% and %mother% have a daughter named %daughter%
echo.
pause
अच्छा दिन।
चलो अच्छे पुराने मापदंडों को मत भूलना। अपना * .bat या * .cmd फ़ाइल शुरू करते समय आप कमांड फ़ाइल नाम के बाद अधिकतम नौ पैरामीटर जोड़ सकते हैं:
call myscript.bat \\path\to\my\file.ext type
call myscript.bat \\path\to\my\file.ext "Del /F"
Myscript.bat कुछ इस तरह हो सकता है:
@Echo Off
Echo The path of this scriptfile %~0
Echo The name of this scriptfile %~n0
Echo The extension of this scriptfile %~x0
Echo.
If "%~2"=="" (
Echo Parameter missing, quitting.
GoTo :EOF
)
If Not Exist "%~1" (
Echo File does not exist, quitting.
GoTo :EOF
)
Echo Going to %~2 this file: %~1
%~2 "%~1"
If %errorlevel% NEQ 0 (
Echo Failed to %~2 the %~1.
)
@Echo On
c:\>c:\bats\myscript.bat \\server\path\x.txt type
The path of this scriptfile c:\bats\myscript.bat
The name of this scriptfile myscript
The extension of this scriptfile .bat
Going to type this file: \\server\path\x.txt
This is the content of the file:
Some alphabets: ABCDEFG abcdefg
Some numbers: 1234567890
c:\>c:\bats\myscript.bat \\server\path\x.txt "del /f "
The path of this scriptfile c:\bats\myscript.bat
The name of this scriptfile myscript
The extension of this scriptfile .bat
Going to del /f this file: \\server\path\x.txt
c:\>
इस विधि का उपयोग करने की कोशिश करते समय मैंने देखा कि यह काम कर सकता है या नहीं, यह इस बात पर निर्भर करता है कि कॉल कहां पर है:
config .cmd पर कॉल करें
मुझे पता है कि इसका कोई मतलब नहीं है, लेकिन मेरे लिए यह एक सच्चाई है। जब "कॉल config.cmd" स्क्रिप्ट के शीर्ष पर स्थित होता है, तो यह काम करता है, लेकिन अगर स्क्रिप्ट में आगे है।
काम नहीं करने से मेरा मतलब है कि वेरिएबल कॉलिंग स्क्रिप्ट को सेट नहीं कर रहा है।
बहुत अजीब है !!!!