28

एक सेटअप प्रोजेक्ट में निष्पादन योग्य फ़ाइलें जैसे ".exe, .dll, .js, .vbs" स्वीकार्य हैं लेकिन कस्टम कार्रवाई में .bat फ़ाइल चलाने का कोई तरीका नहीं है।स्थापना के दौरान ".bat" फ़ाइल कैसे चलाएं?

प्रश्न यह है कि स्थापना के दौरान *.bat फ़ाइलों को कैसे चलाया जाए?

+2

क्या आपने cmd.exe को xxxx.bat के साथ पैरामीटर के रूप में परीक्षण किया है? –

+0

नहीं। यह कैसे करें? – mammadalius

उत्तर

54

ठीक है, बहुत खोज और परीक्षण और त्रुटि के बाद मैंने इसे हल कर लिया है। मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है, लेकिन यह काम करता है।

यहां परिदृश्य है: मेरे पास एक ऐसा एप्लिकेशन है जिसे मैं विजुअल स्टूडियो सेटअप प्रोजेक्ट के माध्यम से तैनात करना चाहता हूं। मेरी एप्लिकेशन फ़ाइलों के अतिरिक्त, मैं लक्ष्य निर्देशिका में एक उपनिर्देशिका बनाना चाहता हूं जिसमें बैच (.bat) फ़ाइल है। मैं इस फाइल को इंस्टॉलेशन प्रक्रिया के अंत में चलाने के लिए चाहूंगा।

यहाँ आप क्या करना है:

  1. एक सेटअप प्रोजेक्ट बनाएं और के रूप में आप सामान्य रूप से उप-निर्देशिका जिसमें आप अपने बैच फ़ाइल लगा देंगे (आप बस सीधे यदि आवेदन फ़ोल्डर में रख सकते हैं सहित होगा, कॉन्फ़िगर आप इसे उपनिर्देशिका में नहीं चाहते हैं)।
  2. "फ़ाइल सिस्टम" दृश्य में (समाधान एक्सप्लोरर-> व्यू-> फ़ाइल सिस्टम में प्रोजेक्ट पर राइट-क्लिक करें), उस बैच फ़ाइल को जोड़ें जिसे आप और cmd.exe निष्पादित करना चाहते हैं (सी: \ विंडोज \ System32 \ cmd.exe)
  3. "कस्टम क्रियाएं" दृश्य खोलें (समाधान एक्सप्लोरर-> देखें-> कस्टम क्रियाओं में प्रोजेक्ट पर राइट-क्लिक करें)
  4. "Commit" पर राइट-क्लिक करें और "कस्टम एक्शन जोड़ें" चुनें
  5. नेविगेट करें और cmd.exe का चयन करें।
  6. नव निर्मित कस्टम कार्रवाई के लिए गुण पैनल खोलें।
  7. तर्क संपत्ति से हटाएं/प्रतिबद्ध करें।
  8. दर्ज करें: /c "[TARGETDIR]subdirectoryname\batchfile.bat" तर्क संपत्ति है, जहां subdirectoryname अपने उप-निर्देशिका के नाम से प्रतिस्थापित किया जाना चाहिए (यदि आप उप-निर्देशिका के बैच फ़ाइल डाल में की तरह मैंने किया था ... यदि आप ऐसा नहीं किया, मान होना चाहिए /c "[TARGETDIR]batchfile.bat") और batchfile.bat आपके बैच फ़ाइल का फ़ाइल नाम होना चाहिए।

यही है। शेष स्थापना प्रक्रिया पूरी होने के बाद बैच फ़ाइल अब निष्पादित की जाएगी।

यहाँ स्पष्टता के लिए एक उदाहरण है:

मेरे बैच फ़ाइल: blah.bat
मेरे उपनिर्देशिका: mydir

मेरी कस्टम क्रिया को लक्षित cmd के लिए तर्क का मान। exe तो होगा

/c "[TARGETDIR]mydir\blah.bat"

आशा है कि HEL पीएस किसी को!

+6

एक परिशिष्ट के रूप में, मैंने पाया कि संकलित cmd.exe चला रहा है (system32 निर्देशिका में cmd.exe के विपरीत) सभी त्रुटि संदेशों को एक सूचनात्मक कथन से बदलता है जैसे कि "संदेश संदेश संख्या 0x8 के लिए संदेश पाठ नहीं मिल रहा है" । इसके आस-पास पहुंचने के लिए, यदि आप सुनिश्चित कर सकते हैं कि लक्ष्य कंप्यूटर पर System32 में cmd.exe मौजूद होगा) '/ c cmd.exe/c" TARGETDIR] subdirectoryname \ batchfile.bat "' का उपयोग करें। यह पैक किए गए cmd.exe को लक्षित कंप्यूटर पर देशी cmd.exe का आह्वान करने का कारण बन जाएगा, जो सही त्रुटि संदेश देगा। –

+1

चेतावनी: यह तरीका काम नहीं करता है अगर सेटअप विंडोज 10 के तहत बनाया गया है और विंडोज 7 के तहत निष्पादित किया गया है !! – Lumo

+0

@ लुमो: बस जानकारी के लिए; 'vbs' के साथ विकल्प ओएस से स्वतंत्र काम करता है। – Stefan

0

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

4
  1. इस आलेख को देखें (आलेख बहिष्कृत है), भले ही यह वीबी.NET में है, यह सी # पर भी लागू होता है। सबसे महत्वपूर्ण हिस्सा (सी # में अनुवाद किया गया है) एक नई कक्षा पुस्तकालय बनाने और निम्नलिखित सामग्री के साथ एक नया इंस्टॉलर क्लास जोड़ना: जैसा कि लेख में बताया गया है, फिर आप अपनी बनाई गई परियोजना के संदर्भ में एक नई कस्टम कार्रवाई कर सकते हैं।

    override void Commit(IDictionary savedState) 
    { 
        base.Commit(savedState); 
        System.Diagnostics.Process.Start("myApp.bat","your bat arguments"); 
    } 
    
  2. अब हम आपके इंस्टॉलर प्रोजेक्ट में बैच फ़ाइल जोड़ रहे हैं। एक सेटअप प्रोजेक्ट बनाएं और कॉन्फ़िगर करें, जिसमें उपनिर्देशिका शामिल है जिसमें आप अपनी बैच फ़ाइल डाल देंगे (यदि आप इसे उपनिर्देशिका में नहीं चाहते हैं तो आप इसे सीधे एप्लिकेशन फ़ोल्डर में रख सकते हैं)।

  3. "फ़ाइल सिस्टम" दृश्य में (समाधान एक्सप्लोरर-> व्यू-> फ़ाइल सिस्टम में प्रोजेक्ट पर राइट-क्लिक करें), उस बैच फ़ाइल को जोड़ें जिसे आप निष्पादित करना चाहते हैं।

  4. इंस्टॉलर प्रोजेक्ट बनाएं।

4

एक ही परिणाम तक पहुंचने का एक और तरीका कस्टम क्रियाओं में एक .vbs फ़ाइल डालता है जो संवाददाता .bat फ़ाइल चलाता है। निम्न कोड "RunRegisterComponents.vbs" है जिसे मैंने सेटअप अनुप्रयोग फ़ोल्डर में रखा है। बेशक मैंने विजुअल स्टूडियो प्रॉपर्टी विंडो में [TARGETDIR] को .vbs पैरामीटर के रूप में रखा है।

dim WshShell 
Set WshShell = CreateObject("WScript.Shell") 

' Read the "CustomActionData" property holding the install directory. 
dim programDir 
programDir= property("CustomActionData") 

' Make the batch full file name and parameter 
commandString = chr(34) & programDir & "RegisterComponents.bat" & chr(34) & " " & chr(34) & 
programDir& chr(34) 

' Set the current directory 
WshShell.CurrentDirectory = programDir 

' Run batch. 
ret = WshShell.Run (commandString, 0, 0) 

के रूप में मैं अपने कस्टम कार्यों सेट किया गया है कि:

enter image description here

मुझे आशा है कि यह मदद कर सकता है!

+0

मुझे अभी भी लगता है कि यह बेहतर विकल्प है क्योंकि यह 'cmd.exe' पर निर्भर नहीं है। – Stefan

+0

आप स्थापना निर्देशिका ('[TARGETDIR] 'में' WshShell.CurrentDirectory' 'सेट कर रहे हैं,' RegisterComponents.bat' से पहले 'commandDring' में' programDir' रखने के लिए यह अनावश्यक नहीं है? – Wolf

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