2009-04-08 16 views
64

में शून्य चर के लिए जांचें मैं विंडोज बैच फ़ाइल पर काम कर रहा हूं जो SQL सर्वर में तीन टेक्स्ट फ़ाइलों को बीसीपी करेगा। अगर उत्पादन में कुछ गलत हो जाता है, तो मैं फ़ाइल नामों को ओवरराइड करने में सक्षम होना चाहता हूं। तो मैं ऐसा कुछ करने की सोच रहा हूं।विंडोज बैच

bcp.exe MyDB..MyTable1 in %1 -SMyServer -T -c -m0 
bcp.exe MyDB..MyTable2 in %2 -SMyServer -T -c -m0 
bcp.exe MyDB..MyTable3 in %3 -SMyServer -T -c -m0 

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

myjob.bat 

, और यह डिफ़ॉल्ट का उपयोग है, या

myjob.bat "c:\myfile1" "c:\myfile2" "c:\myfile3" 

निष्पादित और यह उन फ़ाइलों का उपयोग किया है किया जाएगा। मैं यह समझने में सक्षम नहीं हूं कि कैसे% 1,% 2 और% 3 मौजूद हैं और/या शून्य हैं। मैं यह भी नहीं जानता कि उन मूल्यों को सशर्त रूप से कैसे सेट करें। क्या यह संभव है? किसी भी सुझाव की सराहना की जाएगी।

उत्तर

114

एक कमांड लाइन परमाटर के अस्तित्व के लिए परीक्षण करने के लिए, रिक्त कोष्ठक का उपयोग करें:

IF [%1]==[] echo Value Missing 

या

IF [%1] EQU [] echo Value Missing 

SS64 page on IF तुम यहाँ मदद मिलेगी। "क्या% 1 मौजूद है?" के अंतर्गत।

आप एक स्थितीय पैरामीटर सेट नहीं कर सकते हैं, तो क्या आपको क्या करना चाहिए की तरह

SET MYVAR=%1 

फिर आप सामग्री के आधार पर फिर से सेट कर सकते हैं myVar कुछ करना है।

+0

बहुत अच्छा anwser! धन्यवाद! – antivirtel

+0

क्या इसका मतलब है 'अगर "% 1" == "" खराब है? – bryc

+0

हाँ "% 1" वाक्यविन्यास त्रुटि उत्पन्न करता है जब arg1 में उद्धरण होते हैं, तो वर्ग ब्रैकेट का उपयोग करने के लिए बेहतर होता है। – mosh

13
rem set defaults: 
set filename1="c:\file1.txt" 
set filename2="c:\file2.txt" 
set filename3="c:\file3.txt" 
rem set parameters: 
IF NOT "a%1"=="a" (set filename1="%1") 
IF NOT "a%2"=="a" (set filename2="%2") 
IF NOT "a%3"=="a" (set filename1="%3") 
echo %filename1%, %filename2%, %filename3% 

उद्धरण वर्णों से सावधान रहें, हालांकि, आपको अपने चरों में उनकी आवश्यकता हो सकती है या नहीं।

+2

+1; लगभग कोई भी चरित्र या स्ट्रिंग करेगा: यदि% 1 नहीं है। == .; यदि नहीं {% 1} == {}; अगर% 1null == null ... –

+0

+1 उद्धरण के बारे में चेतावनी के लिए +1 ... बैच कार्यक्रमों का झुकाव! – RBerteig

28

दिए गए दोनों उत्तर सही हैं, लेकिन मैं थोड़ा अलग करता हूं। आप नीचे दिए कुछ विचार करना चाह सकते ...

साथ बैच शुरू

:

SetLocal 

और

EndLocal 

इस के साथ इसे समाप्त अपने सभी 'के सेट "केवल मान्य होने के लिए रखना होगा वर्तमान सत्र के दौरान, और "फ़ाइल नाम 1" या किसी भी अन्य चर जैसे नाम के चारों ओर छोड़े गए वर्रों को छोड़कर नहीं छोड़ेगा, जो बैच फ़ाइल के अगले भाग में हस्तक्षेप कर सकता है। इसलिए, आप कुछ ऐसा कर सकते हैं:

IF "%1"=="" SET FileName1=c:\file1.txt 

अन्य चाल अगर आप केवल 1 प्रदान करते हैं या 2 पैरामीटर, उन्हें स्थानांतरित करने के लिए SHIFT आदेश का उपयोग करें, तो एक आप देख रहे हैं% 1 पर हमेशा है ...

उदाहरण के लिए, प्रक्रिया पहला पैरामीटर, उन्हें बदलें, और फिर इसे फिर से करें। इस तरह, आप नहीं कर रहे हैं हार्ड-कोड% 1,% 2,% 3, आदि ...

विंडोज बैच प्रोसेसर ज्यादा अधिक शक्तिशाली है की तुलना में लोगों को इसके लिए श्रेय देना ..मैंने कल की तारीख की गणना, जिसमें लीप वर्ष और स्थानीयकरण इत्यादि सहित महीने और साल की सीमाओं की गणना भी शामिल है,

यदि आप वास्तव में रचनात्मक बनना चाहते हैं, तो आप बैच प्रोसेसर में फ़ंक्शन कॉल कर सकते हैं ... लेकिन यह एक अलग चर्चा के लिए वास्तव में है ... :)

ओह, और अपने बैच फ़ाइलों .bat नाम नहीं या तो .. वे .cmd अब के हैं .. हे ..

उम्मीद है कि इससे मदद मिलती है।

+0

सुझावों के लिए धन्यवाद। बस जिज्ञासा ... .bat के बजाय .cmd क्यों? –

+5

दरअसल, मुझे लगता है कि यह एक फेंकने वाला है। बीएटी डॉस के लिए है, और सीएमडी WinNT के लिए है .. लेकिन, असली कारण यह है कि, एक समय में, आपके पास cmd.exe और command.com था। .cmd cmd.exe से संबंधित था, यह उन लोगों के लिए पार्सर था। मुझे लगता है कि यह आपको कूलर भी दिखता है, लेकिन मैं इसकी पुष्टि नहीं कर सकता। :) – LarryF

+1

उनके बीच एक सूक्ष्म अंतर है, और रेमंड चेन के बारे में पुरानी नई चीज पोस्ट थी कि मुझे अभी नहीं मिल रहा है ... Google मेरा मित्र नहीं है। यह एसओ क्यू भी देखें: http://stackoverflow.com/questions/148968/windows-batch-files-bat-vs-cmd – RBerteig

27

सही बात "यदि परिभाषित" कथन का उपयोग करना है, जिसका प्रयोग चर के अस्तित्व के परीक्षण के लिए किया जाता है। उदाहरण के लिए:

IF DEFINED somevariable echo Value exists 

इस विशेष मामले में, नकारात्मक रूप इस्तेमाल किया जाना चाहिए:

IF NOT DEFINED somevariable echo Value missing 

पुनश्च: चर नाम के बिना "%" caracters इस्तेमाल किया जाना चाहिए।

+0

उत्तर के लिए धन्यवाद। क्या वह क्रमांकित पैरामीटर के साथ काम करेगा, जैसे कि मैं अपने उदाहरण में उपयोग कर रहा हूं, या केवल नामित चर के साथ? –

+0

+1 क्योंकि यह भी काम करता है अगर 'कुछ योग्य' ** ** उद्धरण ** है जबकि 'IF [% somevariable%] == [] 'एक त्रुटि फेंक दें। –

+0

यह स्वीकार्य उत्तर क्यों नहीं है? –

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