วิธีการป้องกันพรอมต์คำสั่งจากการปิดหลังจากการดำเนินการ?


54

ปัญหาของฉันคือว่าใน Windows มีหน้าต่างบรรทัดคำสั่งที่ปิดทันทีหลังจากดำเนินการ เพื่อแก้ปัญหานี้ฉันต้องการให้การทำงานเริ่มต้นเป็นแบบเปิดหน้าต่างไว้ โดยปกติพฤติกรรมนี้สามารถหลีกเลี่ยงได้ด้วยสามวิธีที่อยู่ในใจของฉัน:

  1. วางpauseบรรทัดหลังโปรแกรมแบตช์เพื่อให้ผู้ใช้กดปุ่มก่อนออก
  2. การเรียกใช้แบตช์ไฟล์เหล่านี้หรือบรรทัดคำสั่งอื่น ๆ ที่จัดการเครื่องมือ (แม้จะเริ่มให้บริการเริ่มต้นใหม่หรืออื่น ๆ ที่net start xyคล้ายกัน) ภายในcmd.exe(เริ่ม - เรียกใช้ - cmd.exe)
  3. เรียกใช้โปรแกรมเหล่านี้ด้วยcmd /kสิ่งนี้: cmd /k myprogram.bat

แต่มีบางกรณีที่ผู้ใช้:

  1. เรียกใช้โปรแกรมเป็นครั้งแรกและไม่ทราบว่าโปรแกรมที่กำหนดจะทำงานใน Command Prompt (ตัวประมวลผลคำสั่งของ Windows) เช่นเมื่อรันทางลัดจากเมนู Start (หรือจากที่อื่น) หรือ
  2. พบว่าไม่สะดวกที่จะเรียกใช้ cmd.exe ตลอดเวลาและไม่มีเวลา / โอกาสในการเขียนโค้ดของคำสั่งเหล่านี้อีกครั้งทุกที่เพื่อหยุดชั่วคราวหลังจากพวกเขาหรือหลีกเลี่ยงการออกอย่างชัดเจน

ฉันได้อ่านบทความเกี่ยวกับการเปลี่ยนพฤติกรรมเริ่มต้นของcmd.exeเมื่อเปิดมันอย่างชัดเจนด้วยการสร้างรายการ AutoRunและจัดการเนื้อหาในตำแหน่งเหล่านี้:

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

(รายการ AutoRun คือ_String values_... )

ฉันใส่cmd /d /kค่าเพื่อลอง แต่ไม่เปลี่ยนพฤติกรรมของสิ่งที่กล่าวถึงข้างต้นเลย ... มันเพิ่งเปลี่ยนพฤติกรรมของหน้าต่างบรรทัดคำสั่งเมื่อเปิดมันอย่างชัดเจน (Start-Run- cmd.exe)

แล้วมันทำงานอย่างไร คุณช่วยให้ความคิดในการแก้ปัญหานี้ได้ไหม


10
คำถามของคุณที่มีคำอธิบายทั้งหมดทำให้หัวของฉันต้องการที่จะระเบิด คุณสามารถพูดสิ่งที่ชอบ: ฉันต้องการเรียกใช้แบทช์ไฟล์ด้วยคำสั่ง "ตัวอย่าง" นี้และฉันต้องการให้กล่องคำสั่งเปิดอยู่เมื่อเสร็จ นั่นคือสิ่งที่คุณถาม กรุณาใส่รหัสใกล้ตัวอย่าง
KCotreau

1
+1 เห็นด้วย เล็กน้อยที่จะ verbose โปรดทบทวนคำถามของคุณและถ้าเป็นไปได้ใช้ตัวอย่างและเขียนคำถามรวบรัดมากขึ้น
slotishtype

2
นี่เป็นพฤติกรรมปกติและในขณะที่คำถามของคุณถูกต้องแน่นอนคุณควรตั้งคำถามว่าทำไมคุณต้องเปิดพรอมต์คำสั่งไว้หลังจากนั้น
Breakthrough

1
ในความคิดของฉันนี่ไม่ใช่คำถามจริง ตามที่คุณเพิ่งแนะนำให้ผู้ใช้ใช้ไฟล์แบตช์แทน หากนั่นไม่ใช่เจตนาของคำถามโปรดชี้แจงคำถามของคุณโดยการลบข้อมูลที่สับสนและอธิบายว่าเป้าหมายที่แท้จริงของคุณคืออะไร มันยากที่จะเกิดขึ้นกับคำตอบที่ถูกต้องหากยังไม่ชัดเจน ...
Tamara Wijsman

1
@Randolf ริชาร์ดว่าเป็นเพราะเครื่องมือเหล่านั้นไม่ควรที่จะเห็นจากผู้ใช้ปลายที่เคย (หลังจากทั้งหมดที่ว่าทำไมเราใช้ GUIs ตอนนี้) หากคุณต้องการข้อมูลดังกล่าวกลุ่มไอทีส่วนใหญ่จะส่งไฟล์แบตช์ออกเพื่อรวบรวมข้อมูลระบบที่เหมาะสมและแสดงมัน ฉันไม่เห็นวิธีที่เป็นไปได้ที่หากพบวิธีแก้ปัญหาสำหรับคำถามนี้จะทำให้เกิดปัญหาน้อยลงจากนั้นจึงแก้ไขได้ - มีหลายสิ่งที่ส่งไปยัง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หมายความว่าอินสแตนซ์ CMD อื่นจะถูกเรียกใช้ในพาเรนต์หนึ่ง ฉันไม่พบวิธีเขียนทับ/cอาร์กิวเมนต์แรก

คุณสามารถทำได้ด้วย[exefile]แต่ตอนนี้มันจะแสดงกล่องคอนโซลที่ว่างเปล่าถ้าปฏิบัติการมี GUI


4
+1 สำหรับการมีทางออกเดียวที่นี่ซึ่งตอบคำถามจริง น่าเสียดายที่ฉันคิดว่านี่อาจจะเป็นความทรงจำรั่วที่เกิดขึ้น จะเกิดอะไรขึ้นเมื่อเซอร์วิสเปิดไฟล์แบตช์ใหม่โดยไม่ระบุ CMD.EXE ในบรรทัด CMD รหัสนี้จะไม่ถูกใช้ในกรณีนั้นหรือไม่? นี่จะเป็นการสร้างหน้าต่างใหม่บนเดสก์ท็อปที่ไม่ใช่แบบโต้ตอบและเปิดค้างไว้จนกว่าคุณจะรีสตาร์ทหรือไม่
krowe2

@APerson *แก้ไขของคุณยากจนคำสั่งโดยไม่รวมถึง โปรดระวังเมื่อแก้ไข!
not2qubit

@ not2qubit ขออภัยไม่ได้สังเกตว่าฉันลบเครื่องหมายดอกจันสามตัวแทนที่จะเป็นสอง จะทำ.
APerson

17

อ้างถึงMicrosoft :

คอนโซลถูกปิดเมื่อกระบวนการล่าสุดที่เชื่อมต่อกับยุติหรือโทร FreeConsole

กล่าวอีกนัยหนึ่งหน้าต่างคอนโซล Win32 จะปิดเสมอเมื่อโปรแกรมสุดท้ายที่ทำงานอยู่ในนั้นออกจากโปรแกรมและคุณไม่สามารถเปลี่ยนแปลงได้


(สำหรับโปรแกรม MS-DOS 16 บิต Windows เสนอตัวเลือก "ปิดเมื่อออก" ในกล่องโต้ตอบคุณสมบัติ แต่นี่ไม่ใช่ข้อยกเว้นสำหรับพฤติกรรมข้างต้น: เป็นกระบวนการ NTVDM ที่เปิดหน้าต่างไว้นอกจากนี้ตัวเลือกนี้คือ อีกครั้งต่อโปรแกรม)


13
+1 สำหรับการทำความเข้าใจว่าทำไมและปิดหน้าต่างคอนโซลอย่างไร (ตรงข้ามกับคนส่วนใหญ่ที่พูดว่า "OMG ทำไมไม่สามารถเปิดอยู่ได้ !!!!!!!!!!! 1111one") มันทำตัวตามที่ออกแบบไว้และมันควรจะเป็นแบบนั้น IMHO นี่คือเหตุผลหลักว่าทำไมเรามีสตรีมมาตรฐานและไฟล์แบตช์ในตอนแรก
พัฒนา

27
@Breakthrough คำถามคือไม่How can I do X In your opinion, should I do Xคำตอบนี้ไม่ช่วยเหลือก็หมายความว่า X เป็นไปไม่ได้เมื่อมีการนำเสนอโซลูชั่นบางส่วนแล้วที่อื่น (-1)
Superbest

7

เพียงเปิดพรอมต์คำสั่งที่ตำแหน่งของไฟล์แบตช์ของคุณและป้อนชื่อแบทช์ไฟล์ของคุณด้วยตนเองเพื่อเรียกใช้ภายในหน้าต่างนั้น

1. ไปที่โฟลเดอร์ที่ไฟล์ปฏิบัติการของคุณอยู่
2. คลิกขวาและเลือก "หน้าต่างคำสั่งจากที่นี่"
3. ประเภทในชื่อไฟล์ปฏิบัติการและกด Enter
4. กระบวนการควรทำงาน แต่หน้าต่างควรเปิดอยู่


1
ฉันไม่รู้เกี่ยวกับ Shift + คลิกขวา อย่างไรก็ตามนอกจากนี้คุณสามารถลากวาง exe ลงในหน้าต่าง cmd ซึ่งจะใส่เส้นทางให้คุณโดยอัตโนมัติ
Superbest

1
มันใช้งานได้ดีสำหรับฉัน แต่ดูเหมือนจะไม่แน่ใจเพราะฉันกำลังค้นหาวิธีแก้ไขปัญหาอย่างแม่นยำเพราะมันไม่ทำงานในสถานการณ์ปัจจุบันของฉัน
RenniePet

นี่เป็นทางออกที่ง่ายที่สุดและต้องทำเครื่องหมายเป็นคำตอบที่ถูกต้อง
Vicky Kapadia

4

cmd.exe /kจะทำให้คุณมีปัญหากับแบทช์บางอย่าง ถ้าชุดงานexit 1(ไม่มี/B) คอนโซลของคุณจะถูกปิด เคล็ดลับคือการใช้:

cmd.exe /k cmd /c ...

ที่จะใช้นี้โดยเริ่มต้นสำหรับไฟล์ batch ทั้งหมดตั้งค่า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"และอีกครั้งเป็นพารามิเตอร์แรกของ"%*"?
Kevin Fegan

1
@KevinFegan ฉันยังไม่ได้ตรวจสอบเหตุผล แต่% 1 ควรเก็บราคาไว้ซึ่งหมายความว่าอาจจะมีการเสนอราคาซ้ำซ้อนในบางกรณี นอกจากนี้ยังมีความแตกต่างระหว่าง%1 %2 %3 ..และ%*ที่ฉันจำไม่ได้ตอนนี้ แต่%1 %2 %3งานในบางกรณีที่%*ล้มเหลว
Wernight

3

ฉันเพิ่งจะแก้ปัญหาโง่หลังจากอ่านgrawityคำตอบของ

กรณีการใช้งานของฉันคือการตั้งค่าสภาพแวดล้อมคอนโซลในที่ทำงานซึ่งโซลูชั่นที่เหมาะสมกว่าทั้งหมดถูกปิดกั้น ทั้งหมดที่ฉันต้องการคือการตั้งค่าเส้นทางและกำหนดค่านามแฝง doskey บางส่วนและถูกทิ้งลงในเปลือก

โซลูชันของฉัน (เพิ่งทดสอบบน Win7) เป็นเพิ่มcmdเป็นบรรทัดสุดท้ายในแบตช์ไฟล์ สิ่งนี้จะรันพรอมต์คำสั่งที่ซ้อนอยู่ซึ่งสืบทอดสภาพแวดล้อมของพาเรนต์ child shell นั้นเปิดกระบวนการแบทช์ไว้จนกว่าคุณจะออกจากที่จุดนั้น batch ไม่มีกระบวนการลูกและยังออก


2

แทนที่จะใช้ PAUSE (ฉันชอบ CHOICE หรือหมดเวลาที่จะใช้หยุดชั่วคราวเมื่อมีความจำเป็น), คุณสามารถใช้วิธีการแก้ปัญหาที่นี่: 886,848 / วิธีที่จะทำให้หน้าต่างชุดไฟล์หยุดเมื่อ-ดับเบิลคลิก

ด้วยวิธีนี้หากคุณคลิกที่ไฟล์แบตช์หรือลิงค์ (ทางลัด) จากภายใน Windows Explorer คุณสามารถหยุดโปรแกรมแบตช์ไฟล์ไว้ก่อนที่จะออกเพื่อให้คุณสามารถดูผลลัพธ์ของโปรแกรมและข้อความแสดงข้อผิดพลาดใด ๆ

การใช้ 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 ยังคงเปิดอยู่


ทำงานได้ฉันใส่ชื่อของ command prompt ที่ปฏิบัติการได้ในไฟล์ bat หนึ่งไฟล์ (1.bat) ซึ่งเรียกว่าการใช้คำสั่ง start จากไฟล์ bat ตัวที่สอง "start 1.bat" หน้าต่างคำสั่งยังคงเปิดอยู่
ejectamenta

1

สิ่งนี้ใช้ได้กับ Windows Registry Editor เวอร์ชั่น 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 ด้านบนในไฟล์ที่เรียกว่า like like cmdbatfile-open.regและเรียกใช้งาน!


2
ยินดีต้อนรับสู่ Stack Exchange! ฉันได้แก้ไขการจัดรูปแบบในคำตอบของคุณแล้ว ดูที่นี่สำหรับความช่วยเหลือในการจัดรูปแบบ นอกจากนี้เมื่อคุณโพสต์รหัสโปรดอย่าลืมอธิบายสิ่งที่มันทำ นอกจากนี้คุณยังอาจต้องการที่จะอ่านวิธีการในการตอบ
Blacklight Shining

1

สมมติว่าคุณมีไฟล์แบตช์สองไฟล์ที่คุณต้องการเปิดใช้ในอินสแตนซ์ของตัวเองและเปิดไว้ถ้าออกจากไฟล์ปฏิบัติการ ให้เรียกทั้งสองแบทช์และA.batB.bat

ตอนนี้เพื่อความง่ายคุณสามารถมีไฟล์แบตช์เพื่อเปิดทั้งสองมาลองเรียกมันlaunch_both.batด้วยเนื้อหา:

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

อาจไม่ทำงานอย่างที่คาดไว้หากคุณโทรหาexitหนึ่งในสองแบตช์ไฟล์ ที่จะต้องมีการทดสอบ


0

สำหรับผู้ใช้ที่ใช้ Windows 10 โปรดทราบว่าไม่มีคำตอบใด ๆ ข้างต้นที่ใช้ได้กับ Windows 10 ในปัจจุบัน

สำหรับ Windows 10 หากคุณสามารถเข้าถึงสคริปต์คุณต้องเพิ่มรหัสต่อไปนี้ในตอนท้าย:

read

รหัสนั้นจะรออินพุตก่อนปิด


จำคำถามที่ถามก่อน Windows 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 สำหรับคำตอบที่ฉันต้องการ เฮนรี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.