Bagaimana mencegah prompt perintah menutup setelah eksekusi?

54

Masalah saya adalah bahwa di Windows, ada jendela baris perintah yang menutup segera setelah eksekusi. Untuk mengatasi ini, saya ingin perilaku default agar jendela tetap terbuka. Biasanya, perilaku ini dapat dihindari dengan tiga metode yang muncul di benak saya:

  1. Menempatkan pausebaris setelah program batch untuk meminta pengguna untuk menekan tombol sebelum keluar
  2. Menjalankan file batch ini atau alat manipulasi baris perintah lainnya (bahkan layanan memulai, memulai ulang, dll. Dengan net start xyatau yang serupa) di dalam cmd.exe(Start - Run - cmd.exe)
  3. Menjalankan program-program ini dengan cmd /kseperti ini: cmd /k myprogram.bat

Tetapi ada beberapa kasus lain di mana pengguna:

  1. Menjalankan program pertama kali dan tidak tahu bahwa program yang diberikan akan berjalan di Command Prompt (Windows Command Processor) misalnya ketika menjalankan jalan pintas dari menu Mulai (atau dari tempat lain), ATAU
  2. Menemukannya sedikit tidak nyaman untuk menjalankan cmd.exe sepanjang waktu dan tidak memiliki waktu / kesempatan untuk menulis ulang kode dari perintah ini di mana-mana untuk menjeda mereka atau menghindari keluar secara eksplisit.

Saya telah membaca sebuah artikel tentang mengubah perilaku default cmd.exeketika membukanya secara eksplisit, dengan membuat entri AutoRun dan memanipulasi kontennya di lokasi-lokasi ini:

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

(Item AutoRun adalah _String values_...)

Saya memberi cmd /d /knilai untuk mencobanya, tetapi ini tidak mengubah perilaku barang yang disebutkan di atas sama sekali ... Itu hanya mengubah perilaku jendela baris perintah saat membukanya secara eksplisit (Start-Run- cmd.exe).

Jadi bagaimana cara kerjanya? Bisakah Anda memberi saya ide untuk menyelesaikan masalah ini?

Sk8erPeter
sumber
10
Pertanyaan Anda dengan semua penjelasan membuat kepala saya ingin meledak. Bisakah Anda mengatakan sesuatu seperti: Saya ingin menjalankan file batch dengan perintah "contoh" ini, dan saya ingin kotak perintah tetap terbuka saat selesai. Itukah yang kamu tanyakan? Silakan masukkan contoh kode yang dekat.
KCotreau
1
+1 Setuju. Sedikit untuk diucapkan, pertimbangkan kembali pertanyaan Anda dan, jika mungkin, gunakan contoh dan buat pertanyaan yang lebih ringkas.
slotishtype
2
Ini adalah perilaku normal, dan sementara pertanyaan Anda tentu saja valid, Anda harus mempertanyakan mengapa Anda perlu menjaga command prompt tetap terbuka setelahnya (sebagian besar utilitas dibuat dengan mempertimbangkan peringatan ini).
Terobosan
1
Menurut pendapat saya, ini bukan pertanyaan nyata. Saat Anda hanya menginstruksikan pengguna untuk menggunakan file batch sebagai gantinya. Jika itu bukan maksud dari pertanyaan, harap klarifikasi pertanyaan Anda dengan menghapus informasi yang membingungkan dan jelaskan apa tujuan sebenarnya Anda. Sulit untuk memberikan jawaban yang tepat jika tidak jelas ...
Tamara Wijsman
1
@Randolf Richardson, itu karena alat-alat tersebut tidak seharusnya dilihat oleh pengguna akhir yang pernah (setelah semua, itu sebabnya kami menggunakan GUI sekarang). Jika Anda memang membutuhkan informasi tersebut, sebagian besar grup IT akan mengirimkan file batch untuk mengumpulkan mereka informasi sistem yang sesuai dan menampilkannya. Saya tidak dapat melihat cara yang mungkin bahwa jika solusi untuk pertanyaan ini ditemukan, itu akan menyebabkan lebih sedikit masalah daripada memecahkannya - begitu banyak hal yang dikirim stdoutsecara konstan yang tidak pernah dimaksudkan untuk terlihat karena alasan yang baik.
Terobosan

Jawaban:

27

Saya punya solusi yang hanya bisa diterapkan pada .cmddan .batfile:

Buka regeditdan buka masing-masing dari:

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

Sekarang ubah "Nilai kunci default" menjadi cmd.exe /k "%1" %*. Sekarang, setiap jendela skrip batch akan tetap terbuka setelah eksekusi.

Perhatikan bahwa ini seperti menggunakan cmd.exe /c cmd.exe /k program.bat, yang berarti bahwa instance CMD lain akan diluncurkan ke induk. Saya tidak dapat menemukan cara menimpa /cargumen pertama .

Anda juga dapat melakukannya dengan [exefile], tetapi sekarang akan menampilkan kotak konsol kosong jika executable memiliki GUI.

not2qubit
sumber
4
+1 karena memiliki satu-satunya solusi di sini yang benar-benar menjawab pertanyaan yang diberikan. Sayangnya, saya pikir ini mungkin kebocoran memori yang menunggu untuk terjadi. Apa yang terjadi ketika layanan meluncurkan file batch baru tanpa menentukan CMD.EXE di baris CMD? Bukankah kode ini akan digunakan dalam kasus itu? Bukankah ini akan membuat jendela baru pada desktop non-interaktif dan membiarkannya terbuka sampai Anda me-restart?
krowe2
@ OrangSunting Anda melanggar perintah dengan tidak menyertakan *. Harap lebih berhati-hati saat mengedit!
not2qubit
@ not2qubit Maaf, saya tidak melihat bahwa saya menghapus tiga tanda bintang, bukan dua. Akan melakukan.
APerson
17

Kutip Microsoft :

Konsol ditutup ketika proses terakhir yang melekat padanya berakhir atau memanggil FreeConsole.

Dengan kata lain, jendela konsol Win32 akan selalu ditutup ketika program terakhir yang berjalan di dalamnya keluar, dan Anda tidak dapat mengubahnya.


(Untuk program MS-DOS 16-bit, Windows menawarkan opsi "Tutup saat keluar" dalam dialog properti, tetapi ini bukan pengecualian untuk perilaku di atas: ini adalah proses NTVDM yang membuat jendela tetap terbuka. Juga, opsi ini adalah lagi per program.)

grawity
sumber
13
+1 untuk memahami bagaimana dan mengapa konsol windows ditutup (berbeda dengan kebanyakan yang hanya mengatakan "OMG MENGAPA TIDAK TINGGAL DIBUKA !!!!!!!!!!! 1111one"). Ini berperilaku seperti yang dirancang, dan itu harus tetap seperti itu IMHO. Ini adalah alasan utama mengapa kami memiliki stream standar dan file batch di tempat pertama.
Terobosan
27
@Breakthrough Pertanyaannya adalah How can I do X, bukan In your opinion, should I do X. Jawaban ini tidak membantu, itu menyiratkan X tidak mungkin, ketika solusi parsial telah disajikan di tempat lain. (-1)
Biasa
7

Cukup buka prompt perintah di lokasi file batch Anda, dan masukkan secara manual nama file batch Anda untuk menjalankannya di dalam jendela itu.

1.Navigate ke folder mereka di mana executable Anda
klik 2.Shift-kanan dan pilih "Command Window dari sini"
3.type dalam nama executable dan tekan enter
proses 4. harus menjalankan, tetapi jendela harus tetap terbuka

Lee Harrison
sumber
1
Saya tidak tahu tentang Shift + Klik kanan. Namun, Anda juga dapat menyeret-jatuhkan exe ke jendela cmd, yang secara otomatis menempatkan path untuk Anda.
Biasa
1
Ini biasanya bekerja untuk saya, tetapi tampaknya bukan hal yang pasti karena saya di sini mencari solusi justru karena itu tidak berfungsi dalam situasi saya saat ini.
RenniePet
ini adalah solusi yang paling mudah dan harus ditandai sebagai jawaban yang benar
Vicky Kapadia
4

cmd.exe /kakan memberi Anda masalah dengan beberapa batch. Jika bets exit 1(tanpa /B) konsol Anda akan ditutup. Triknya adalah menggunakan:

cmd.exe /k cmd /c ...

Untuk menggunakan ini secara default untuk semua file batch, atur HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default)dan HKEY_CLASSES_ROOT\batfile\shell\open\command\(default)ke "%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*.

Wernight
sumber
1
Saya pikir itu "%*"melewati daftar parameter lengkap, jadi bukankah ini akan melewati parameter pertama dua kali, sekali "%1"dan lagi sebagai parameter pertama "%*"?
Kevin Fegan
1
@KevinFegan Saya belum memeriksa alasannya tetapi% 1 harus menyimpan tanda kutip yang artinya mungkin akan dikutip dua kali lipat dalam beberapa kasus. Ada juga perbedaan antara %1 %2 %3 ..dan %*yang saya tidak ingat sekarang tetapi %1 %2 %3bekerja dalam beberapa kasus di mana %*gagal.
Wernight
3

Saya baru saja menemukan solusi bodoh setelah membaca grawityjawaban.

Kasing saya sedang menyiapkan lingkungan konsol di tempat kerja di mana semua solusi yang lebih masuk akal diblokir. Yang saya butuhkan adalah mengatur PATH dan mengkonfigurasi beberapa alias doskey dan dibuang ke shell.

Solusi saya (baru diuji pada Win7) sebagai tambahkan cmdsebagai baris terakhir dalam file batch. Ini menjalankan prompt perintah bersarang yang mewarisi lingkungan induknya. Cangkang anak itu menahan proses batch terbuka sampai Anda EXIT, di mana batch tidak memiliki proses anak dan juga keluar.

kitsu.eb
sumber
2

Daripada menggunakan PAUSE (Saya lebih suka PILIHAN atau TIMEOUT daripada menggunakan PAUSE bila perlu), Anda dapat menggunakan solusinya di sini: 886848 / cara membuat windows-batch-file-pause-ketika-diklik dua kali .

Dengan cara ini, jika Anda mengklik file batch atau tautan (pintasan) dari dalam Windows Explorer, Anda dapat menghentikan program file batch sebelum keluar sehingga Anda dapat melihat output program dan pesan kesalahan apa pun.

Menggunakan CHOICE, Anda dapat memprogram kemampuan bagi pengguna untuk memilih berbagai tindakan yang akan diambil, dan menggunakan TIMEOUT dapat membiarkan jendela menutup setelah jeda waktu (tanpa pengawasan). Jika Anda menjalankan file batch dari dalam jendela prompt perintah, jeda ini dapat mengganggu.

Solusi tertaut akan membiarkan Anda memutuskan apakah Anda ingin melewatkan jeda jika file batch dijalankan dari jendela command prompt.

Anda dapat membaca lebih lanjut di tautan yang disediakan, tetapi dasar-dasarnya adalah bahwa ia menggunakan variabel lingkungan:

%cmdcmdline%

untuk menentukan apakah file batch dijalankan dari jendela perintah atau tidak.

Jadi, Anda menggunakannya seperti ini:

Pada titik di mana file batch akan keluar, Anda menambahkan beberapa kode seperti ini:

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
Kevin Fegan
sumber
1

Cara terbaik yang saya temukan untuk mengatasi ini adalah dengan memanggil file batch Anda dari file batch lain menggunakan start.

jadi jika Anda biasanya menjalankan file bernama go.bat, maka Anda akan membuat file batch kedua bernama sesuatu seperti go2.bat

isi go2.bat hanya akan

start go.bat

jendela pertama ditutup segera, tetapi yang menjalankan go.bat Anda tetap terbuka

agradl
sumber
Ini berfungsi, saya hanya meletakkan nama command prompt yang dapat dieksekusi dalam satu file bat (1.bat) yang disebut menggunakan perintah mulai dari file bat kedua "start 1.bat". Jendela perintah tetap terbuka.
ejectamenta
1

Ini berfungsi untuk versi 5.00 dari Windows Registry Editor.

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

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

Simpan cmds di atas dalam file yang disebut sesuatu cmdbatfile-open.regdan laksanakan!

VumC
sumber
2
Selamat Datang di Stack Exchange! Saya telah memperbaiki pemformatan dalam jawaban Anda untuk Anda. Lihat di sini untuk bantuan pemformatan. Juga, ketika Anda memposting kode, harap ingat untuk menjelaskan apa sebenarnya fungsinya. Anda mungkin juga ingin membaca bagaimana cara menjawab .
Blacklight Shining
1

Misalkan Anda memiliki dua file batch yang ingin Anda luncurkan dalam instance mereka sendiri dan tetap terbuka jika file executable mereka keluar. Mari kita panggil dua kelompok itu A.batdan B.bat.

Sekarang untuk kesederhanaan Anda dapat memiliki file batch untuk meluncurkan keduanya, sebut saja itu launch_both.batdengan konten:

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

Mungkin tidak berfungsi seperti yang diharapkan jika Anda memanggil exitsalah satu dari dua file batch. Itu perlu diuji.

Francois
sumber
0

Untuk pengguna yang menggunakan Windows 10, perhatikan bahwa tidak ada jawaban di atas yang saat ini berfungsi untuk Windows 10.

Untuk Windows 10, jika Anda memiliki akses ke skrip, Anda harus menambahkan kode berikut di akhir:

read

Kode itu akan menunggu input sebelum ditutup.

kode jay
sumber
Ingat pertanyaan yang diajukan sebelum Windows 10 (5 tahun yang lalu), harap edit jawaban Anda dengan informasi lebih lanjut
yass
0

Menanggapi penurunan peringkat PSIXO - "Jawaban ini sudah tercakup dalam pertanyaan. - Ro Yo Mi 20 '16 pada 5:06" - TIDAK, itu BUKAN. Jawaban sebelumnya adalah: "jeda", yang TIDAK berfungsi. Jawaban PSIXO adalah: "& jeda", yang TIDAK berfungsi. Harap uraikan lebih hati-hati sebelum menurunkan versi. Saya menjalankan ini dari prompt IDLE, dan itu berhasil:

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

Di samping itu:

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

TIDAK berfungsi (prompt cmd terbalik, dan sebenarnya mengembalikan kesalahan (1)). Terima kasih kepada PSIXO untuk jawaban yang saya butuhkan. Henry.

Henry
sumber