2012-04-13 15 views
42

क्या ऐसी कोई चीज है जो किसी विधि को नकल करती है जैसे कि इसे जावा, सी # आदि से जानता है? मेरे पास बैच फ़ाइल में कमांड की 5 पंक्तियां हैं, बैच फ़ाइल के अंदर उन 5 लाइनों का उपयोग एक से अधिक स्थानों पर किया जाता है। मैं एक गोटो का उपयोग नहीं कर सकता, क्योंकि उन 5 लाइनों द्वारा बनाए गए त्रुटि-रेखा के आधार पर मेरे पास अलग-अलग क्रियाएं होती हैं। मैंने अपनी 5 लाइनों को बैच फ़ाइल 5lines.bat के अंदर डालने का प्रयास किया, लेकिन मूल बैच फ़ाइल original.bat केवल 5lines.bat पर कॉल करती है और 5lines.bat पर कॉल के बाद कमांड निष्पादित नहीं करती है): इस तरह मेरा मूल.बेट दिखता है जैसे:बैच फ़ाइलों में फ़ंक्शन/विधि की तरह कुछ?

5lines.bat 
echo this gets never called, how to make sure this gets called? 

कोई बाहर निकलें या 5lines.bat में कुछ इस तरह है! मैं कैसे सुनिश्चित कर सकता हूं कि 5lines.bat के बाद की रेखा को बुलाया जाता है?

उत्तर

16

एक अलग बैच फ़ाइल में पुन: प्रयोज्य कार्यों रखने होगा निश्चित रूप से एक समारोह अनुकरण करने के लिए काम करते हैं।

पकड़ यह है कि आपको यह सुनिश्चित करने के लिए call कमांड का उपयोग करना होगा ताकि दूसरी बैच फ़ाइल निष्पादित करने के बाद कॉलर पर नियंत्रण लौटाया जा सके।

call 5lines.bat 
echo this will now get called 
+0

बिल्कुल सही, धन्यवाद! –

56

आप कॉल आदेश का उपयोग कर सकते हैं:

call:myDosFunc 

और फिर समारोह इस तरह से परिभाषित करते हैं:

:myDosFunc - here starts the function 
echo. here the myDosFunc function is executing a group of commands 
echo. it could do a lot of things 
goto:eof 

स्रोत: Batch Functions

+0

आप भी धन्यवाद, कॉल आदेश था वास्तव में मैं क्या खो रहा था। –

+0

कोई समस्या नहीं! खुशी हुई यह काम किया! – Erwald

+5

लेकिन यह कैसे काम करता है? उस 'गोटो: ईओएफ' में जादू क्या है? – Calmarius

4

आप आप एक और बैच फ़ाइल में आम लाइनों है कि आप लेखन पर एक और महान ट्यूटोरियल के लिए मुख्य एक

+0

ग्रेट लिंक! (हालांकि मैं कॉल 5lines.bat का उपयोग कर समाप्त हुआ) –

1

से कॉल डाल सकता है, this page

वैकल्पिक रूप में सूचीबद्ध उदाहरण का उपयोग करने की कोशिश कर सकते पुन: प्रयोज्य बैच फ़ाइल कोड - Richie Lawrence's excellent library देखें।

+0

लिंक अब मर चुके हैं। – TLS

+0

@ टीएलएस, धन्यवाद, लिंक अपडेट किया गया – jwfearn

7

समाधान:

@ECHO OFF  

call:header Start Some Operation 

... put your business logic here 
... make sure EXIT below is present 
... so you don't run into actual functions without the call 

call:header Operation Finished Successfully 

EXIT /B %ERRORLEVEL% 

:: Functions 

:header 
ECHO ================================================= 
ECHO %* 
ECHO ================================================= 
EXIT /B 0 

महत्वपूर्ण प्रत्येक समारोह के अंत में बाहर निकलें/बी डाल करने के लिए, साथ ही पहले कार्यशील परिभाषाएँ शुरू, मेरे उदाहरण में यह है:

बाहर निकलें/बी % errorlevel%

1

यहाँ एक 'हैक' है कि आप बैच फ़ाइलों में "anonymous" functions है की अनुमति देगा:

@echo off 
setlocal 
set "anonymous=/?" 

:: calling the anonymous function 
call :%%anonymous%% a b c 3>&1 >nul 

:: here the anonymous function is defined 
if "%0" == ":%anonymous%" (
    echo(
    echo Anonymous call: 
    echo %%1=%1 %%2=%2 %%3=%3 
    exit /b 0 
)>&3 
::end of the anonymous function 

गुमनाम समारोह ब्लॉक सही कॉल बयान के बाद रखा जाना चाहिए और बाहर निकलने बयान के साथ समाप्त होना चाहिए

चाल कि CALL आंतरिक GOTO का उपयोग करता है और उसके बाद लाइन जहां CALL मार डाला गया था पर लौट आता है। डबल विस्तार के साथ गोटो सहायता संदेश ट्रिगर किया गया है (%%/?%% तर्क के साथ) और फिर स्क्रिप्ट जारी है। लेकिन इसे समाप्त होने के बाद यह CALL पर वापस आ जाता है - यही कारण है कि अगर कथन की आवश्यकता है।

3

बस पूर्णता के लिए, आप भी मानकों कार्य करने के लिए पारित कर सकते हैं:

समारोह कॉल

call :myDosFunc 100 "string val" 

समारोह शरीर

:myDosFunc 
echo. Got Param#1 %~1 
echo. Got Param#2 %~2 
goto :eof 
संबंधित मुद्दे