क्या मैं एक VBScript (cscript के साथ लॉन्च की गई vbs फ़ाइल) पर एक तर्क पारित कर सकता हूं?


85

मेरे पास यह स्क्रिप्ट "test.vbs" में सहेजी गई है:

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile(workFolder &"\test.txt", 2, True)
File.Write "testing"
File.Close
Set File = Nothing
Set FSO = Nothing
Set workFolder = Nothing

जब मैं स्क्रिप्ट चलाता हूं, तो मैं "वर्क फोल्डर" चर के मूल्य को पास करना चाहता हूं।

मैं यह कैसे कर सकता हूँ? क्या इसे मै कर सकता हूँ? शायद "cscript test.vbs workFolder: 'C: \ temp \'" जैसा कुछ?

बोनस प्रश्न: क्या "सेट वर्कफ़्लो = कुछ भी नहीं" के साथ उत्तीर्ण चर को साफ करना neccessary है या VBSCript करता है कि स्वचालित रूप से जब यह समाप्त हो जाता है? शायद "फ़ाइल सेट करें = कुछ भी नहीं" और "सेट एफएसओ = कुछ भी नहीं" भी अकारण है? कृपया मुझे बताएं कि क्या आप इन दोनों सवालों का जवाब जानते हैं।

जवाबों:


138

आप WScript.Argumentsअपनी स्क्रिप्ट में दिए गए तर्कों को एक्सेस करने के लिए उपयोग कर सकते हैं ।

स्क्रिप्ट को कॉल करना:

cscript.exe test.vbs "C:\temp\"

अपनी स्क्रिप्ट के अंदर:

Set File = FSO.OpenTextFile(WScript.Arguments(0) &"\test.txt", 2, True)

यह जांचने के लिए मत भूलें कि क्या वास्तव में आपकी स्क्रिप्ट में कोई तर्क दिया गया है। आप Countसंपत्ति की जाँच करके ऐसा कर सकते हैं:

if WScript.Arguments.Count = 0 then
    WScript.Echo "Missing parameters"
end if

यदि फ़ाइल बंद करने के बाद आपकी स्क्रिप्ट खत्म हो गई है, तो चर को सेट करने की कोई आवश्यकता नहीं है Nothing। Cscript.exe प्रक्रिया समाप्त होने पर संसाधन स्वचालित रूप से साफ़ हो जाएंगे। Nothingयदि आप स्पष्ट रूप से अपनी स्क्रिप्ट के निष्पादन के दौरान संसाधनों को मुक्त करना चाहते हैं, तो आम तौर पर एक चर सेट करना केवल आवश्यक है। उस स्थिति में, आप चर सेट करेंगे जिसमें एक COM ऑब्जेक्ट का संदर्भ है Nothing, जो आपकी स्क्रिप्ट समाप्त होने से पहले COM ऑब्जेक्ट जारी करेगा। यह आपके बोनस प्रश्न का एक संक्षिप्त उत्तर है, आपको इन संबंधित प्रश्नों में अधिक जानकारी मिलेगी:

क्या वीबीए फ़ंक्शंस के अंदर कुछ भी नहीं करने के लिए ऑब्जेक्ट सेट करने की आवश्यकता है

जब मुझे VB6 में "कुछ भी नहीं" के लिए एक चर सेट करना चाहिए?


बिंगो, यह बात है! बहुत स्पष्ट है, बहुत बहुत धन्यवाद। (बोनस प्रश्न अभी भी खुला है अगर कोई भी इन टिप्पणियों में से एक में इसका जवाब देना चाहता है।)
पीटर

@Peter: मैंने आपके बोनस प्रश्न का संक्षिप्त उत्तर जोड़ा।
डर्क वोल्मार

21

वीबीएस के अंदर आप मापदंडों का उपयोग कर सकते हैं

Wscript.Arguments(0)
Wscript.Arguments(1)

और इसी तरह। पैरामीटर की संख्या:

Wscript.Arguments.Count

धन्यवाद! (बोनस प्रश्न अभी भी खुला है अगर कोई भी इन टिप्पणियों में से एक में इसका जवाब देना चाहता है।)
पीटर

6

कमांड लाइन के माध्यम से पारित प्रत्येक तर्क के साथ पहुँचा जा सकता है: Wscript.Arguments.Item (0) जहां शून्य तर्क संख्या है: अर्थात, 0, 1, 2, 3 आदि।

तो आपके कोड में आप हो सकते हैं:

strFolder = Wscript.Arguments.Item(0) 

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile(strFolder, 2, True)
File.Write "testing"
File.Close
Set File = Nothing
Set FSO = Nothing
Set workFolder = Nothing

Wscript.arguments.count का उपयोग करके, यदि कोई व्यक्ति उचित मूल्य दर्ज नहीं करता है, तो आप जाल में त्रुटि कर सकते हैं, आदि।

एमएस तकनीक उदाहरण


अहा, धन्यवाद आदमी। दिलचस्प है कि आपको Wcript का उदाहरण नहीं बनाना है। (बोनस सवाल अभी भी खुला है अगर कोई भी इन टिप्पणियों में से एक में इसका जवाब देना चाहता है।)
पीटर

1) workFolderउपरोक्त उत्तर, या मूल प्रश्न में एक वस्तु के रूप में परिभाषित नहीं किया गया है, इसलिए Set workFolder = Nothingएक त्रुटि उठानी चाहिए। 2) चूंकि तर्क को एक से अधिक बार पुन: उपयोग किए जाने की आवश्यकता के रूप में नहीं सुझाया गया है, शायद इसे strFolderचर पर असाइन करना छोड़ दें । 3) उपयोग करने का सुझाव होगा xबजाय 0मेंWscript.Arguments.Item(0)
user66001

जब तक कि विकल्प स्पष्ट नहीं किया गया था, वास्तव में यह एक त्रुटि नहीं उठाएगा, और उस स्थिति में कुछ भी काम नहीं करेगा क्योंकि कुछ भी परिभाषित नहीं किया गया है। हालांकि, चर के बारे में यह सच है, इसकी आवश्यकता नहीं है, फिर न तो एफएसओ या एफआईएल ऑब्जेक्ट हैं और एक साधारण का उपयोग किया जा सकता है। विभिन्न दृष्टिकोणों का एक टन संभव ... :)
अवास्तविक

2

आप नामित तर्कों का भी उपयोग कर सकते हैं जो वैकल्पिक हैं और किसी भी क्रम में दिए जा सकते हैं।

Set namedArguments = WScript.Arguments.Named

यहाँ थोड़ा सहायक कार्य है:

Function GetNamedArgument(ByVal argumentName, ByVal defaultValue)
  If WScript.Arguments.Named.Exists(argumentName) Then
    GetNamedArgument = WScript.Arguments.Named.Item(argumentName) 
  Else  
    GetNamedArgument = defaultValue
  End If
End Function

उदाहरण VBS:

'[test.vbs]
testArg = GetNamedArgument("testArg", "-unknown-")
wscript.Echo now &": "& testArg

उदाहरण उपयोग:

test.vbs /testArg:123

0

आपके बोनस प्रश्न का उत्तर देने के लिए, सामान्य उत्तर नहीं है, आपको लघु रूप से "कुछ भी नहीं" में वैरिएबल सेट करने की आवश्यकता नहीं है। आपकी जैसी स्क्रिप्ट्स, जिन्हें Wscript या Cscript कहा जाता है।

आप एक लंबी स्क्रिप्ट के बीच में ऐसा कर सकते हैं कारण यह है कि मेमोरी को ऑपरेटिंग सिस्टम पर वापस छोड़ दिया जाए जो VB अन्यथा धारण कर रहा होगा। इन दिनों जब 8GB रैम विशिष्ट और 16GB + अपेक्षाकृत आम है, तो यह किसी भी औसत दर्जे का प्रभाव पैदा करने की संभावना नहीं है, यहां तक ​​कि एक विशाल स्क्रिप्ट पर एक एकल चर में कई मेगाबाइट भी हैं। इस बिंदु पर यह उन दिनों से एक तरह का होल्ड-ओवर है जहां आप 1MB या 2MB RAM में काम कर रहे होंगे।

आप सही हैं, जिस पल आपकी .VBS स्क्रिप्ट पूरी हो जाती है, आपके सभी चर नष्ट हो जाते हैं और स्मृति वैसे भी पुनः प्राप्त हो जाती है। "कुछ भी नहीं" के लिए चर सेट करना बस उस प्रक्रिया को गति देता है, और आपको इसे स्क्रिप्ट के बीच में करने की अनुमति देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.