विंडोज एक्सपी या बाद के विंडोज: मैं पृष्ठभूमि में एक बैच फ़ाइल कैसे चला सकता हूं जिसमें कोई विंडो प्रदर्शित नहीं होती है?


121

मुझे पता है कि मैंने पहले ही एक समान प्रश्न का जवाब दिया है ( जब विंडो बूट होती है तो बैकग्राउंड में बैच फाइल चलती है ), लेकिन इस बार मुझे बैच लॉन्च करने की आवश्यकता है:

  • दूसरे बैच से,
  • बिना किसी कंसोल विंडो को प्रदर्शित किए,
  • अदृश्य बैच को दिए गए सभी तर्कों के साथ

पहले बैच को एक कंसोल विंडो में निष्पादित किया जाता है। हालाँकि, मैं नहीं चाहता कि दूसरा बैच (पहले द्वारा अतुल्यकालिक तरीके से लॉन्च किया गया ) भी कंसोल विंडो प्रदर्शित करे।

मैं एक VBScript स्क्रिप्ट लेकर आया हूं, जो ऐसा ही करती है, और मैं स्क्रिप्ट को दूसरों के लिए एक उत्तर के रूप में संदर्भित करता हूं, लेकिन यदि आपके पास अन्य विचार / समाधान हैं, तो योगदान करने के लिए स्वतंत्र महसूस करें।

नोट: विंडोज कमांड प्रोसेसर की कंसोल विंडो को कई लोगों द्वारा वास्तव में सही डॉस विंडो नाम नहीं दिया गया है।


जवाब के लिए आप सभी का धन्यवाद। यदि मुझे किसी अदृश्य मोड में चलने के लिए स्क्रिप्ट को कॉल करने की आवश्यकता है, तो मुझे क्या समझ में आता है:

  • कंसोल विंडो में पहले से मौजूद दूसरी स्क्रिप्ट से, start /bपर्याप्त है।
  • विंडोज से, दूसरी विंडो को चालू किए बिना , मेरा समाधान अभी भी मान्य है।

आप ANOTHER बैच फ़ाइल से बैच फ़ाइल लॉन्च कर रहे हैं? क्या यह पहले से चल रही बैच फ़ाइल में एक विंडो है?
१२

हां, यह अन्य (पहला) बैच डॉस विंडो में निष्पादित होता है। हालाँकि, मैं नहीं चाहता कि दूसरा बैच (पहले से अतुल्यकालिक तरीके से लॉन्च) भी एक विंडोज़ प्रदर्शित करता है (जो कि 'स्टार्ट / बी' कमांड के साथ होगा)
VonC

जवाबों:


53

क्या आपको एसिंक्रोनस रूप से चलाने के लिए दूसरे बैच की फ़ाइल की आवश्यकता है? आमतौर पर एक बैच फ़ाइल के साथ एक और तुल्यकालन चलता हैcall कमांड के , और दूसरा एक पहले वाले विंडो को साझा करता है।

आप कर सकते हैं का उपयोग start /b second.bat एक दूसरे बैच फ़ाइल शुरू करने के लिए एक अपने पहले कि शेयरों अपने पहले एक की खिड़की से तुल्यकालिक। यदि दोनों बैच फाइलें एक साथ कंसोल पर लिखती हैं, तो आउटपुट ओवरलैप हो जाएगा और शायद अशोभनीय होगा। इसके अलावा, आप exitअपनी दूसरी बैच फ़ाइल के अंत में एक कमांड रखना चाहते हैं , या cmdसब कुछ हो जाने के बाद आप एक दूसरे शेल के भीतर होंगे ।


1
सही बात। मुझे विश्वास था कि स्टार्ट / बी एक नई विंडो खोलेगा, लेकिन अगर डॉस विंडो से निष्पादित किया जाता है, तो यह उसी विंडो को साझा करता है।
VonC

110

यहाँ एक संभावित समाधान है:

अपनी पहली स्क्रिप्ट से, निम्नलिखित पंक्ति के साथ अपनी दूसरी स्क्रिप्ट को कॉल करें:

wscript.exe invis.vbs run.bat %*

दरअसल, आप एक vbs स्क्रिप्ट के साथ बुला रहे हैं:

  • [पथ] अपनी स्क्रिप्ट का नाम
  • आपकी स्क्रिप्ट द्वारा आवश्यक अन्य सभी तर्क ( %*)

फिर, invis.vbs आपके स्क्रिप्ट को Windows स्क्रिप्ट होस्ट रन () विधि के साथ कॉल करेगा , जो लेता है:

  • intWindowStyle: 0 का अर्थ है "अदृश्य खिड़कियां"
  • bWaitOnReturn: false इसका मतलब है कि आपकी पहली स्क्रिप्ट को आपकी दूसरी स्क्रिप्ट के खत्म होने तक इंतजार करने की जरूरत नहीं है

यहाँ invis.vbs है:

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

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

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False

3
2k विचार और एक महान पोस्ट + उत्तर, अधिक लोगों को इस धागे को वोट देना चाहिए
रिक टोक्यो

महान समाधान, वास्तव में मुझे क्या चाहिए।
निखिल

एकमात्र समस्या यह है कि यह "cmd.exe" नामक एक प्रक्रिया बनाता है, जिसे भविष्य में खोजना मुश्किल है।
आदित्य गुप्त

12

बैच फ़ाइल को exe में कनवर्ट करें। कनवर्टर करने के लिए चमगादड़ से बचने के लिए कोशिश करें या ऑनलाइन चमगादड़ से छूटने के लिए चमगादड़ का चयन करें, और इसे एक भूत अनुप्रयोग के रूप में चलाने का विकल्प चुनें, अर्थात कोई खिड़की नहीं।


3
संभव है, लेकिन मैं इस उदाहरण में किसी भी अतिरिक्त कदम से बचने की कोशिश करूंगा।
VonC

21
मैं आमतौर पर उस पागल नहीं हूँ, लेकिन यह बहुत बेवकूफ नहीं होगा कि किसी अनाम को मेरे लिए निर्वासित कर दूं? सभी प्रकार के दुर्भावनापूर्ण सामान को इंजेक्ट किया जा सकता है।
टॉबी

9

मुझे लगता है कि डॉस विंडो को खोले बिना बैच फ़ाइल चलाने का यह सबसे आसान और सबसे छोटा उपाय है, जब आप समय-समय पर चलाने के लिए कमांड का एक सेट शेड्यूल करना चाहते हैं, तो यह बहुत विचलित करने वाला हो सकता है, इसलिए डॉस विंडो पॉप अप करता रहता है, यहाँ आपका समाधान है । बैच फ़ाइल को कॉल करने के लिए VBS स्क्रिप्ट का उपयोग करें ...

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 
Set WshShell = Nothing 

एक संपादक के ऊपर लाइनों को कॉपी करें और .VBS एक्सटेंशन के साथ फाइल को सेव करें। तदनुसार .BAT फ़ाइल नाम और पथ संपादित करें।


1
दिलचस्प दृष्टिकोण, निश्चित रूप से मेरे समाधान से कम है। +1
वॉनसी

महान समाधान। यह पढ़कर कि मैंने नोटिस किया है कि वास्तव में उपयोग करने की कोई आवश्यकता नहीं है Set WshShell = Nothing, मेरे लिए ठीक काम किया है और आपके पास इसे करने का एक छोटा तरीका भी हो सकता है।
पैट्रिक बार्ड

7

इसे प्राप्त करने के तरीकों का मेरा संग्रह यहां है - और इससे भी अधिक - जहां यह संभव था, मैंने शुरू की गई प्रक्रिया के पीआईडी ​​को भी वापस करने की कोशिश की है (सभी लिंक किए गए स्क्रिप्ट डाउनलोड किए जा सकते हैं और जो भी नाम आपको सुविधाजनक लगे, उसे सहेजा जा सकता है):

1) IEXPRESS समाधान का उपयोग पुरानी जीत 95/98 मशीनों पर भी किया जा सकता है। Iexpress एक बहुत ही प्राचीन उपकरण है जिसे अभी भी विंडोज के साथ पैक किया गया है - क्योंकि तर्क केवल कमांड और उसके तर्कों को स्वीकार करता है।

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

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"

2) SCHTASKS - फिर से केवल दो तर्कों को स्वीकार करता है - कमांड और आर्ग्युमेंट्स। इसके अलावा चेक करता है कि क्या यह एलिवेटेड परमिशन के साथ शुरू हुआ है और यदि संभव हो तो WEVTUTIL के साथ प्रक्रिया की PID मिलती है (विस्टा से और ऊपर उपलब्ध है) इसलिए विंडोज़ का नया संस्करण प्राप्त होगा पीआईडी) कमांड।

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

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"

3) 'WScript.Shell' - स्क्रिप्ट 'WScript.Shell' की पूर्ण आवरण है और हर संभव विकल्प कमांड लाइन विकल्पों के माध्यम से सेट किया जा सकता है। यह एक jscript / बैच हाइब्रिड है और इसे बल्ले के रूप में कहा जा सकता है।

उदाहरण का उपयोग (अधिक जानकारी के लिए '-h' की मदद से प्रिंट करें):

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

4) 'Win32_ProcessStartup' - फिर से फुल रैपर और सभी विकल्प कमांड लाइन आर्ग्युमेंट्स के माध्यम से उपलब्ध हैं। इस बार यह कुछ जावास्क्रिप्ट और कोड के कुछ VBScript टुकड़ों के साथ WSF / बैच हाइब्रिड है - लेकिन यह शुरू की गई प्रक्रिया की PID लौटाता है। प्रक्रिया है छिपाए नहीं गए कुछ विकल्प जैसे X / Y निर्देशांक का उपयोग किया जा सकता है (प्रत्येक निष्पादन के लिए लागू नहीं है - लेकिन उदाहरण के लिए cmd.exe निर्देशांक स्वीकार करता है)।

उदाहरण का उपयोग (अधिक जानकारी के लिए '-h' की मदद से प्रिंट करें):

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"

5) द। नेट समाधान । ProcessStartInfo विकल्पों में से अधिकांश विकल्पों का उपयोग किया जाता है (लेकिन अंत में मैं सब कुछ शामिल करने के लिए बहुत थक गया था):

उदाहरण का उपयोग (अधिक जानकारी के लिए '-h' की मदद से प्रिंट करें):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal

2

दूसरे प्रश्न में मैंने ऑटोटेक्स्ट का सुझाव दिया । इस स्थिति में भी यह संभव है। बस मैन्युअल रूप से चलाने के लिए सेवा सेट करें (यानी स्टार्टअप पर स्वचालित नहीं)। जब आप अपना बैच चलाना चाहते हैं, तो अपने इच्छित बैच फ़ाइल को कॉल करने के लिए autoexnt.bat फ़ाइल को संशोधित करें, और autoexnt सेवा को प्रारंभ करें।

इसे शुरू करने के लिए बैचफाइल, इस तरह दिख सकता है (अप्रयुक्त):

echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat
net start autoexnt

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

आपको इसे प्राप्त करने के लिए विंडोज 2003 रिसोर्स किट डाउनलोड करना होगा। संसाधन किट को विंडोज़ के अन्य संस्करणों जैसे कि विंडोज़ एक्सपी पर भी स्थापित किया जा सकता है।


1
दिलचस्प है, लेकिन इस परिदृश्य के लिए एक तंग ओवरकिल।
VonC

2

इसे "रनस" का उपयोग करके या विंडोज शेड्यूल किए गए टास्क में एक अलग उपयोगकर्ता के तहत शेड्यूल करके इसे एक अलग उपयोगकर्ता नाम के तहत चलाएं।


संभव है, लेकिन वास्तव में मैं (पृष्ठभूमि में प्रत्यक्ष अतुल्यकालिक कॉल) के बाद क्या नहीं हूं
VONC

0

आप एक .vbs फ़ाइल के माध्यम से अपनी .bat फ़ाइल चला सकते हैं
। निम्न कोड को अपने .vbs फ़ाइल में कॉपी करें।

Dim WshShell
Dim obj
Set WshShell = WScript.CreateObject("WScript.Shell") 
obj = WshShell.Run("C:\Users\file1.bat", 0) 
obj = WshShell.Run("C:\Users\file2.bat", 0)  and so on
set WshShell = Nothing 

0

आप भी उपयोग कर सकते हैं

start /MIN notepad.exe

पुनश्च: दुर्भाग्य से, न्यूनतम विंडो स्थिति चलाने के लिए आदेश पर निर्भर करती है। वीजी काम नहीं करते

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