निष्पादन के बाद कमांड प्रॉम्प्ट को बंद करने से कैसे रोकें?


54

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

  1. pauseबाहर निकलने से पहले एक कुंजी दबाने के लिए उपयोगकर्ता को संकेत देने के लिए बैच प्रोग्राम के बाद एक लाइन डालना
  2. इन बैच फ़ाइलों को चलाने या अन्य कमांड लाइन में हेरफेर करने वाले उपकरण (यहां तक ​​कि सेवा शुरू करना, पुनः आरंभ करना, आदि net start xy) या कुछ इसी तरह से) भीतर cmd.exe(प्रारंभ - रन - cmd.exe)
  3. इन कार्यक्रमों को cmd /kइस तरह से चलाना : cmd /k myprogram.bat

लेकिन कुछ अन्य मामले हैं जिनमें उपयोगकर्ता:

  1. प्रोग्राम को पहली बार चलाता है और यह नहीं जानता है कि दिया गया प्रोग्राम कमांड प्रॉम्प्ट (विंडोज कमांड प्रोसेसर) में चलेगा, जैसे स्टार्ट मेनू से शॉर्टकट चला रहा है (या कहीं और से), या
  2. सभी समय cmd.exe को चलाने के लिए इसे थोड़ा असहज लगता है और उनके पास इन आदेशों के कोड को फिर से लिखने या उनके बाद एक विराम लगाने या स्पष्ट रूप से बाहर निकलने से बचने का समय / अवसर नहीं है।

मैंने ऑटोरन प्रविष्टि बनाने और इन स्थानों में इसकी सामग्री में हेरफेर करने के साथ, इसे स्पष्ट रूप से खोलने पर डिफ़ॉल्ट व्यवहार को बदलने के बारे में एक लेख पढ़ा है :cmd.exe

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun

(ऑटोरुन आइटम हैं _String values_...)

मैंने cmd /d /kइसे एक कोशिश के रूप में इसके मूल्य के रूप में रखा , लेकिन इसने ऊपर वर्णित सामानों के व्यवहार को बिल्कुल नहीं बदला ... इसे स्पष्ट रूप से खोलते समय कमांड लाइन विंडो के व्यवहार को बदल दिया (स्टार्ट-रन-) cmd.exe)।

तो यह कैसे काम करता है? क्या आप मुझे इस समस्या को हल करने के लिए कोई विचार दे सकते हैं?


10
तमाम व्याख्याओं के साथ आपके सवाल ने मेरा सिर फोड़ना चाहा। क्या आप कुछ ऐसा कह सकते हैं: मैं इस "उदाहरण" कमांड के साथ एक बैच फ़ाइल चलाना चाहता हूं, और मैं चाहता हूं कि कमांड बॉक्स खुले रहने पर खुला रहे। क्या आप जो पूछ रहे हैं? कृपया कोड के एक नज़दीकी नमूने में रखें।
KCotreau

1
+1 से सहमत हैं। क्रिया के लिए थोड़ा, कृपया अपने प्रश्न पर पुनर्विचार करें और यदि संभव हो तो एक उदाहरण का उपयोग करें और एक अधिक संक्षिप्त प्रश्न लिखें।
स्लॉटिशपाइप

2
यह सामान्य व्यवहार है, और जब आपका प्रश्न निश्चित रूप से मान्य होता है, तो आपको यह सवाल करना चाहिए कि आपको कमांड प्रॉम्प्ट को खुले रखने की आवश्यकता क्यों है (अधिकांश उपयोगिताओं को इस चेतावनी को ध्यान में रखकर बनाया गया है)।
ब्रेकथ्रू

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

1
@ रैंडॉल्फ रिचर्डसन, ऐसा इसलिए है क्योंकि उन उपकरणों को कभी भी अंतिम-उपयोगकर्ता द्वारा नहीं देखा जाना चाहिए (आखिरकार, इसलिए हम अब GUI का उपयोग करते हैं)। यदि आपको ऐसी जानकारी की आवश्यकता है, तो अधिकांश आईटी समूह उन्हें उचित सिस्टम जानकारी एकत्र करने और उसे प्रदर्शित करने के लिए बैच फ़ाइलों को भेजेंगे। मैं कोई भी संभव तरीका नहीं देख सकता कि यदि इस प्रश्न का हल मिल जाए, तो यह कम समस्याओं का कारण बन जाएगा, तो यह हल करता है - इसलिए कई चीजें stdoutनिरंतर आधार पर भेजी जाती हैं जो कि एक अच्छे कारण के लिए कभी भी दिखाई नहीं देती थीं।
ब्रेकथ्रू

जवाबों:


27

मेरे पास एक समाधान है जो केवल .cmdऔर .batफाइलों पर ही लागू हो सकता है :

regeditहर एक को खोलें और जाएं:

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
[HKEY_CLASSES_ROOT\cmdfile\shell\open\command] 

अब "डिफ़ॉल्ट कुंजी मान" को बदलें cmd.exe /k "%1" %*। अब, प्रत्येक बैच स्क्रिप्ट विंडो अपने निष्पादन के बाद खुली रहेगी।

ध्यान दें कि यह उपयोग करने जैसा है cmd.exe /c cmd.exe /k program.bat, जिसका अर्थ है कि एक और सीएमडी उदाहरण माता-पिता में लॉन्च किया जाएगा। मैं नहीं पाया कि पहला /cतर्क कैसे लिख सकता हूँ ।

आप ऐसा कर भी सकते हैं [exefile], लेकिन यदि निष्पादन योग्य GUI है तो अब यह एक खाली कंसोल बॉक्स दिखाएगा।


4
यहां एकमात्र समाधान के लिए +1 जो वास्तव में दिए गए प्रश्न का उत्तर देता है। दुर्भाग्य से, मुझे लगता है कि यह एक स्मृति रिसाव होने की प्रतीक्षा कर सकता है। जब कोई सेवा CMD लाइन में CMD.EXE निर्दिष्ट किए बिना एक नई बैच फ़ाइल लॉन्च करती है तो क्या होता है? क्या उस मामले में इस कोड का उपयोग नहीं किया जाएगा? क्या यह एक गैर-संवादात्मक डेस्कटॉप पर एक नई विंडो बनाने और इसे तब तक खुला रखने के लिए नहीं है जब तक आप पुनः आरंभ नहीं करते हैं?
krowe2

@APerson आपके संपादन ने शामिल नहीं करके आदेश को तोड़ दिया *। कृपया संपादन करते समय अधिक सावधान रहें!
not2qubit

@ not2qubit क्षमा करें, ध्यान नहीं दिया कि मैंने दो के बजाय तीन तारांकन हटा दिए हैं। करूँगा।
एपर्सन

17

उद्धरण Microsoft :

जब कंसोल से जुड़ी अंतिम प्रक्रिया समाप्त हो जाती है या फ्री कॉनसोल को कॉल किया जाता है तो कंसोल बंद हो जाता है।

दूसरे शब्दों में, Win32 कंसोल विंडो हमेशा बंद रहेगी जब उसके अंदर चल रहा आखिरी प्रोग्राम बाहर निकलता है, और आप इसे बदल नहीं सकते।


(16-बिट MS-DOS कार्यक्रमों के लिए, Windows गुण संवाद में "बाहर निकलने पर बंद करें" एक विकल्प प्रदान करता है, लेकिन यह ऊपर दिए गए व्यवहार के लिए एक अपवाद नहीं है: यह NTVDM प्रक्रिया है जो खिड़की को खुला रखती है। इसके अलावा, यह विकल्प है। फिर से प्रति कार्यक्रम।)


13
+1 यह समझने के लिए कि विंडोज़ कैसे और क्यों कंसोल को बंद करती है (जैसा कि ज्यादातर लोग कहते हैं, जो "OMG क्यों नहीं कह सकता है!" यह डिजाइन के अनुसार व्यवहार कर रहा है, और इसे उस तरह से रहना चाहिए जैसे कि IMHO। यह प्राथमिक कारण है कि हमारे पास मानक स्ट्रीम और बैच फाइलें पहले स्थान पर हैं।
ब्रेकथ्रू

27
@ सवाल यह है कि How can I do Xनहीं In your opinion, should I do X। यह उत्तर अप्रभावी है, इसका मतलब है कि एक्स असंभव है, जब आंशिक समाधान पहले ही कहीं और प्रस्तुत किए जा चुके हैं। (-1)
18

7

बस अपने बैच फ़ाइल के स्थान पर एक कमांड प्रॉम्प्ट खोलें, और उस विंडो के भीतर चलाने के लिए अपने बैच फ़ाइल के नाम से मैन्युअल रूप से कुंजी।

1. उस फ़ोल्डर में जाएं जहां आपका निष्पादन योग्य रहता है।
2. राइट-राइट क्लिक करें और "कमांड विंडो यहां से"
चुनें। निष्पादन योग्य और हिट दर्ज करने के नाम पर 3. टाइप करें
। प्रक्रिया चलनी चाहिए, लेकिन खिड़की खुली रहनी चाहिए


1
मैं Shift + राइट क्लिक के बारे में नहीं जानता था। इसके अलावा, हालाँकि, आप exe को एक cmd विंडो में ड्रैग-ड्रॉप कर सकते हैं, जो स्वचालित रूप से आपके लिए मार्ग में रखता है।
शानदार

1
यह आमतौर पर मेरे लिए काम करता है, लेकिन यह स्पष्ट रूप से एक निश्चित बात नहीं है क्योंकि मैं यहां एक समाधान की तलाश कर रहा हूं क्योंकि यह मेरी वर्तमान स्थिति में काम नहीं कर रहा है।
RenniePet

यह सबसे आसान समाधान है और इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए
विक्की कपाड़िया

4

cmd.exe /kआपको कुछ बैच के साथ परेशानी देगा। यदि बैच exit 1(बिना /B) आपका कंसोल बंद हो जाएगा। एक चाल का उपयोग करना है:

cmd.exe /k cmd /c ...

सभी बैच फ़ाइलों के लिए डिफ़ॉल्ट रूप से इसका उपयोग करने के लिए, सेट करें HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default)और HKEY_CLASSES_ROOT\batfile\shell\open\command\(default)करने के लिए "%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*


1
मैंने सोचा था कि "%*"पूर्ण पैरामीटर सूची को पास करता है, तो क्या यह पहले पैरामीटर को दो बार पारित नहीं करेगा, एक बार "%1"फिर से और पहले पैरामीटर के रूप में "%*"?
केविन फ़गन

1
@KevinFegan मैंने कारण की जाँच नहीं की है, लेकिन% 1 को उद्धरणों को रखना चाहिए, जिसका अर्थ है कि यह संभवतः कुछ मामलों में दोहरा उद्धरण होगा। इस बीच एक अंतर भी है %1 %2 %3 ..और %*जो मुझे अभी याद नहीं है लेकिन %1 %2 %3कुछ मामलों में काम करता है जहां %*विफल रहता है।
वर्नट

3

मैं सिर्फ एक गूंगा समाधान पर grawityजवाब पढ़ने के बाद मारा ।

मेरा उपयोग मामला काम के समय एक सांत्वना वातावरण स्थापित कर रहा था जहां सभी अधिक उचित समाधान अवरुद्ध हैं। मुझे बस इतना ही चाहिए कि PATH को सेट करें और कुछ डोसिएक एलियासेस को कॉन्फ़िगर करें और शेल में डंप करें।

मेरा समाधान (सिर्फ Win7 पर परीक्षण किया गया) cmdबैच फ़ाइल में अंतिम पंक्ति के रूप में जोड़ें । यह एक नेस्टेड कमांड प्रॉम्प्ट चलाता है जो अपने माता-पिता के वातावरण को विरासत में देता है। वह बच्चा शेल आपके द्वारा बाहर निकलने तक बैच प्रक्रिया को खुला रखता है, जिस बिंदु पर बैच की कोई बाल प्रक्रिया नहीं है और बाहर भी निकलती है।


2

PAUSE का उपयोग करने के बजाय (मैं जब आवश्यक हो तो CHOICE या TIMEOUT का उपयोग करना पसंद करता हूं), आप यहां समाधान का उपयोग कर सकते हैं: 886848 / how to-make-windows-बैच-फाइल-पॉज-जब-डबल-क्लिक किया गया

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

CHOICE का उपयोग करके, आप उपयोगकर्ता को विभिन्न प्रकार की क्रियाओं का चयन करने की क्षमता को प्रोग्राम कर सकते हैं, और TIMEOUT का उपयोग करके एक समय की देरी (अनअटेंडेड) के बाद विंडो को बंद कर सकते हैं। यदि आप कमांड प्रॉम्प्ट विंडो के भीतर से बैच फ़ाइल चलाते हैं, तो ये रोकें कष्टप्रद हो सकती हैं।

यदि आप बैच फ़ाइल को कमांड प्रॉम्प्ट विंडो से चलाया गया था, तो जुड़ा हुआ समाधान आपको यह तय करने देगा कि क्या आप पोज़ को छोड़ना चाहते हैं।

आप दिए गए लिंक पर अधिक पढ़ सकते हैं, लेकिन इसकी मूल बातें यह है कि यह पर्यावरण चर का उपयोग करता है:

%cmdcmdline%

यह निर्धारित करने के लिए कि बैच फ़ाइल कमांड विंडो से चलाई गई थी या नहीं।

तो, आप इसे इस तरह से उपयोग करते हैं:

उस बिंदु पर जहां बैच फ़ाइल बाहर निकल जाएगी, आप कुछ कोड इस तरह से जोड़ते हैं:

echo %cmdcmdline:"=-% | find /i "cmd /c --%~dpf0%-"
if %errorlevel% NEQ 0 goto :EOF
pause
goto :EOF

rem if %errorlevel% EQU 0 batch-file: %~dpf0 was executed from Windows Explorer, ...
rem if %errorlevel% NEQ 0 batch-file: %~dpf0 was executed from within a Command Prompt

1

सबसे अच्छा तरीका है कि मैं इसे पाने के लिए मिल गया है कि शुरुआत का उपयोग करके एक बैच फ़ाइल से अपनी बैच फ़ाइलों को कॉल करें।

इसलिए यदि आप सामान्य रूप से go.bat नामक फाइल चलाते हैं, तो आप go2.bat जैसी दूसरी बैच फ़ाइल बनाएँगे

go2.bat की सामग्री बस होगी

start go.bat

पहली विंडो तुरंत बंद हो जाती है, लेकिन आपका go.bat चालू रहता है


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

1

यह विंडोज रजिस्ट्री एडिटर के संस्करण 5.00 के लिए काम करता है।

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

[HKEY_CLASSES_ROOT\cmdfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

एक फ़ाइल में उपरोक्त cmds को कुछ इस तरह से सेव करें cmdbatfile-open.regऔर इसे निष्पादित करें!


2
स्टैक एक्सचेंज में आपका स्वागत है! मैंने आपके लिए आपके उत्तर में प्रारूपण तय कर दिया है। प्रारूपण सहायता के लिए यहाँ देखें। इसके अलावा, जब आप कोड पोस्ट करते हैं, तो कृपया यह स्पष्ट करना याद रखें कि यह वास्तव में क्या करता है। आप यह भी पढ़ सकते हैं कि उत्तर देने के लिए कैसे-कैसे
ब्लैकलाइट शाइनिंग

1

मान लीजिए कि आपके पास दो बैच फाइलें हैं, जिन्हें आप अपने स्वयं के इंस्टेंस में लॉन्च करना चाहते हैं और यदि उनके निष्पादन योग्य बाहर निकलते हैं तो खुला रखें। चलो उन दो बैचों A.batऔर कहते हैं B.bat

अब सादगी के लिए आपके पास उन दोनों को लॉन्च करने के लिए एक बैच फ़ाइल हो सकती है, चलो उस launch_both.batसामग्री के साथ कॉल करें :

start cmd /k "A.bat & cmd /c"
start cmd /k "B.bat & cmd /c"

यदि आप exitदो बैच फ़ाइलों में से एक में कॉल करते हैं तो यह अपेक्षित रूप से काम नहीं कर सकता है । जिसे परखने की जरूरत होगी।


0

विंडोज 10 का उपयोग करने वाले उपयोगकर्ताओं के लिए, ध्यान दें कि उपरोक्त उत्तर में से कोई भी वर्तमान में विंडोज 10 के लिए काम नहीं करता है।

विंडोज 10 के लिए, यदि आपके पास स्क्रिप्ट तक पहुंच है, तो आपको अंत में निम्नलिखित कोड जोड़ना होगा:

read

वह कोड बंद होने से पहले इनपुट का इंतजार करेगा।


याद रखें कि विंडोज 10 (5 साल पहले) से पहले प्रश्न पूछा गया था, कृपया अपना जवाब अधिक जानकारी के साथ संपादित करें
yass

0

डाउनग्रेड किए गए PSIXO के जवाब में - "यह उत्तर पहले से ही सवाल में शामिल था। - Ro Yo Mi Jan 20 '16 at 5:06" - नहीं, यह नहीं था। पिछले जवाब थे: "विराम", जो काम नहीं किया। PSIXO का उत्तर था: "और ठहराव", जो काम करता है। कृपया डाउनग्रेड करने से पहले अधिक सावधानी से पार्स करें। मैंने इसे एक IDLE प्रॉम्प्ट से चलाया, और इसने काम किया:

    >>> os.system('dir ^ & pause')
    0
    >>> 

दूसरी ओर:

    >>> os.system('dir ^ pause')
    1
    >>>

काम नहीं किया (cmd प्रॉम्प्ट पर उड़ा, और वास्तव में एक त्रुटि (1)) को वापस कर दिया। उस उत्तर के लिए PSIXO को धन्यवाद, जिसकी मुझे आवश्यकता थी। हेनरी।

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