Bagaimana cara menekan konfirmasi "Hentikan pekerjaan batch (Y / T)"?

154

Dalam cmd, ketika kita menekan Ctrl + C kita mendapatkan aplikasi target dihentikan tetapi jika aplikasi target dipanggil dari file batch, kita mendapatkan konfirmasi "Hentikan pekerjaan batch (Y / N)" ini. Saya tidak pernah dapat mengingat contoh di mana saya memilih untuk tidak menghentikan pekerjaan batch. Bagaimana kita bisa melewatkan konfirmasi ini?

Srikanth
sumber
Apakah Anda pernah mencoba jawaban sgmoore? superuser.com/questions/35698/…
Arjan
10
"Aku tidak pernah bisa mengingat contoh di mana aku memilih untuk tidak menghentikan pekerjaan batch." Dan sebenarnya, dalam banyak kasus, pekerjaan itu dihentikan bahkan jika Anda menjawab Tidak ...
PhiLho
@PhiLho - Itu tidak benar, karena skrip saya selalu berlanjut setelah saya masuk N. Saya ingin tahu skenario apa yang Anda miliki di mana script batch berakhir setelah Anda masuk N.
dbenham
Saya berharap ini akan mudah, tetapi seperti biasa Microsoft telah membuat sesuatu yang sederhana menyebalkan. Jawaban di bawah ini semuanya terlalu banyak upaya untuk menghindari gangguan kecil ini. Saya hanya kesal karena tidak ada cara sederhana untuk menyelesaikan ini. Serius Microsoft, apa gunanya prompt ini? Ya saya yakin, itu sebabnya saya menekan Ctrl + C ...
Chev
Masalah ini setidaknya menyebabkan saya mengingat dan menggunakan -nsakelar untuk cygwin ping lebih sering.
palswim

Jawaban:

52

AFAIK Anda tidak bisa karena perilaku ini dirancang dan dikendalikan oleh penerjemah perintah. Tidak ada metode "pemetaan" atau bahkan "mencegat" ini kecuali jika Anda membatalkan kompilasi dan mengkompilasi ulang penerjemah secara langsung.

BinaryMisfit
sumber
39
Itu mengecewakan :(
Srikanth
Ya itu mengecewakan. Apa yang lebih mengecewakan adalah bahwa perintah BREAK, yang secara default tidak apa-apa di bawah XP, bisa digunakan untuk mengaktifkan prompt ...
Synetech
3
Meskipun itu mungkin benar, tidak ada yang bisa membuat penerjemah berperilaku berbeda, menggunakan startseperti yang disarankan sgmoore di superuser.com/questions/35698/… tampaknya solusi yang sangat baik bagi saya.
Arjan
1
Ini dia: superuser.com/a/498798/56101
Totty.js
58

Tekan Ctrl+ Cdua kali.

Kirill V. Lyadvinsky
sumber
5
Ini tidak akan berhasil tetapi mengulangi prompt.
Joey
8
Saya baru saja membunuh basis data saya dengan melakukan itu! Script sedang menunggu pada "jeda", jadi saya melakukan CTRL-C, dan kemudian prompt datang, jadi saya melakukan CTRL-C lagi, dan kemudian file batch dengan senang hati melanjutkan, dan menghapus database saya! @lihat superuser.com/questions/740004/…
Sebastien Diot
2
Bukan itu yang diminta OP. Dia bisa dengan mudah mengetik "N" setelah ^ C.
vladr
3
@vladr itu jauh lebih mudah untuk menahan Ctrldan tekan Clagi dibandingkan memukul Ykemudian Enter.
Nick T
21
@SebastienDiot Anda mencoba teknik baru pada skrip yang berpotensi menghancurkan data secara permanen? Itu ... Berani.
Dasar
58

Di situs ini , saya menemukan solusi yang efektif:

script2.cmd < nul

Untuk tidak harus mengetik ini setiap kali saya membuat skrip kedua disebut script.cmddi folder yang sama dengan baris di atas. Saya telah menguji teknik ini hanya pada XP, tetapi orang lain telah mengkonfirmasi pada Win 7.

Nathan menambahkan: opsi lain adalah meletakkan kode berikut di bagian atas script.cmd yang melakukan hal yang sama dalam satu file:

rem Bypass "Terminate Batch Job" prompt.
if "%~1"=="-FIXED_CTRL_C" (
   REM Remove the -FIXED_CTRL_C parameter
   SHIFT
) ELSE (
   REM Run the batch with <NUL and -FIXED_CTRL_C
   CALL <NUL %0 -FIXED_CTRL_C %*
   GOTO :EOF
)
Gringo Suave
sumber
2
Jika Anda memanggil file batch dari dalam dirinya sendiri (tanpa menggunakan perintah CALL), eksekusi "secara permanen" ditransfer. Jika STDIN dialihkan ke NUL, prompt "Terminate Batch Job" masih akan muncul, tetapi tidak akan menunggu (karena STDIN hilang) untuk input. Ini bekerja untuk saya ...
William
3
Ini bekerja di Windows 7.
William
17
Ini berfungsi, kecuali jika Anda memerlukan input pengguna dalam batch.
Augusto Men
2
@William, Hanya memanggil script tidak bekerja untuk saya, tapi saya datang dengan solusi: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]). Panggilan itu sendiri secara rekursif, tetapi dengan argumen kedua kalinya. Jika skrip Anda memiliki argumen, Anda berpotensi menggunakan argumen posisi pertama yang tidak digunakan. Itu bisa bermasalah jika skrip Anda memiliki banyak argumen. Skrip saya tidak perlu argumen atau input pengguna.
jpmc26
Jawaban jpmc bekerja untuk saya. Apakah gema darn Terminate (y / n)? pesan di akhir kemudian, tetapi tidak berhenti untuk itu.
ggb667
29

Instal Clink dan ubah pengaturan "terminate_autoanswer". Pengaturan File harus berada di sini : C:\Users\<username>\AppData\Local\clink\settings.

# name: Auto-answer terminate prompt
# type: enum
# Automatically answers cmd.exe's 'Terminate batch job (Y/N)?' prompts. 0 =
# disabled, 1 = answer 'Y', 2 = answer 'N'.
terminate_autoanswer = 1

Ini kemudian "hanya bekerja" dengan jendela cmd.exe. Anda tidak perlu mengubah apa yang sedang berjalan atau sebaliknya, karena denting piggy-back pada cmd.exe.

Luar biasa, IMO!

Macke
sumber
Denting fantastis tetapi ini tidak berhasil bagi saya, menggunakan cmd.exe atau Console2. Masih bertanya dan tidak diisi otomatis.
iono
@tometoftom: Apakah Anda mengubah file pengaturan seperti di atas? Saya harus melakukan itu untuk membuatnya bekerja. (Perhatikan bahwa Anda harus menjadi admin untuk menyimpan file dengan benar di Windows Vista dan yang lebih tinggi ...)
Macke
3
Ah, masih belum ada dadu. desahan dalam-dalam Microsoft, demi Tuhan ...
iono
3
@iono apakah Anda memiliki versi Windows non-Inggris? Dalam hal ini denting tidak dapat secara otomatis menjawab konfirmasi hingga rilis 0.4.3 beberapa hari yang lalu: github.com/mridgers/clink/releases/tag/0.4.3
schlamar
3
Terkait: bagi mereka yang menggunakan cmder , pengaturannya aktif \cmder\config\settings. Lihat masalah yang terkait di sini github.com/cmderdev/cmder/issues/1666
edmundo096
17

Jika Anda tidak perlu melakukan apa pun dalam file batch setelah aplikasi Anda selesai secara normal, maka menggunakan startperintah memastikan bahwa file batch sudah selesai pada saat Anda menekan Ctrl-C. Dan karenanya pesan tidak akan muncul.

Sebagai contoh:

@echo mati

atur my_command = ping.exe
atur my_params = -t www.google.com

Perintah echo untuk dieksekusi oleh 'start':% my_command%% my_params%

:: Ketika TIDAK menggunakan / B atau / TUNGGU maka ini akan membuat jendela baru, sementara
:: eksekusi file batch ini akan berlanjut di jendela saat ini:

mulai% my_command%% my_params%

gema.
echo Baris ini akan dieksekusi SEBELUM 'start' bahkan selesai. Jadi ini
file batch echo akan selesai SEBELUM satu menekan Ctrl-C di jendela lainnya.
gema.

:: Hanya untuk pengujian, gunakan 'jeda' untuk menampilkan "Tekan sembarang tombol untuk melanjutkan", untuk melihat
:: output dari perintah 'echo'. Pastikan untuk menekan Ctrl-C di jendela
:: yang menjalankan perintah 'ping' (bukan di jendela ini). Atau cukup hapus
:: baris berikutnya ketika bingung:

jeda

(Diuji pada Windows XP.)

sgmoore
sumber
Saya tidak tahu apakah startmemang akan membantu, tetapi kedengarannya masuk akal bagi saya. Jadi saya ingin tahu apakah downvote menyiratkan bahwa ini TIDAK akan berhasil? Atau mungkin siapa pun yang downvoted tidak tahu perintah Windows start(atau terutama start /waitdan start /b)? Lihat microsoft.com/resources/documentation/windows/xp/all/proddocs/… lalu. Tolong jelaskan downvote?
Arjan
starttidak akan bekerja Setiap kali cmd menjalankan file batch, mengetuk Ctrl + C akan menyebabkan proses yang sedang berjalan berakhir dan menampilkan pertanyaan.
Joey
1
+1 berfungsi untuk saya. Namun, / b mematikan penanganan Ctrl + C (yang menjengkelkan).
Nick Bolton
3
Ini bagus jika Anda mengklik dua kali file batch. Tetapi bagaimana jika Anda memulai file batch di konsol?
Helgi
8
(Berbicara dari Windows 7, tidak yakin apakah berlaku untuk XP) Pengembang yang tidak berpikiran dipekerjakan oleh Microsoft untuk mengkode startperintah membuat keputusan bodoh untuk membuat judul jendela wajib dan opsional pada saat yang sama - dengan cara yang agak membingungkan. Jadi jika pernah Anda %my_command%dilampirkan dalam tanda kutip ganda, itu menjadi judul jendela dan param pertama %my_params%menjadi perintah . Agar aman, gunakan start "some title here" %my_command% %my_params%. Sebagian besar hanya menggunakan ""dan mengutuk pengembang karena tidak menggunakan opsi /TITLEatau /Tsebagai gantinya untuk menetapkan judul.
ADTC
13

Saya telah berjuang dengan keinginan ini untuk menghindari prompt "Hentikan pekerjaan batch" untuk sementara waktu.

Pencerahan terakhir saya sedikit sulap (atau jendela konsol), dengan mengganti satu instance dari yang cmd.exelain. Ini dilakukan dengan mengeksekusi perintah / program melalui start cmd /kdiikuti segera oleh exitdalam .BATfile.

Jendela konsol asli menghilang dan yang pengganti dapat dihentikan dengan bersih melalui Ctrl- C.

Pertimbangkan contoh berikut dari tracerouteyang dapat terganggu oleh Ctrl+ C, atau diizinkan untuk menyelesaikan, mengembalikan pengguna ke C:\>prompt:

@echo off

set timeout=100
if not "%2"=="" set timeout=%2

start cmd /k tracert -w %timeout% %1
exit

Penggantian lingkungan dari juru bahasa baru mungkin bukan untuk semua orang, tetapi, dengan mata telanjang, terlihat dan bekerja dengan baik untuk saya.

ViperGeek
sumber
+1 Pendekatan yang sangat baru dan meskipun saya setuju ini bukan pengganti yang tepat, itu bekerja dengan baik (meskipun Anda memang khawatir ketika Anda memulai posting Anda dengan "mengganti cmd.exe" - alarm keamanan berdering sampai saya sampai ke contoh dan menyadari apa maksudmu)
Dasar
Anda harus menggunakan exit /buntuk keluar dari skrip batch
Sebastian Godelet
1
@SebastianGodelet: Itu saran yang bagus secara umum, tetapi di sini maksudnya memang untuk menutup jendela konsol (asli) , mengingat bahwa perintah target diluncurkan di jendela baru .
mklement0
Mengapa menggunakan "cmd / k" (biarkan penerjemah tetap terbuka) alih-alih "/ c"? Hanya untuk dapat melihat output perintah?
Raúl Salinas-Monteagudo
9

Solusi Gringo baik, tetapi tidak bekerja dengan baik dengan skrip yang meneruskan daftar argumen (yaitu python myscript.py %*), karena SHIFTtidak diperbarui %*. Ada beberapa solusi , tetapi mereka memiliki keterbatasan tertentu.

Inilah modifikasi yang akhirnya saya dapatkan:

IF [%JUSTTERMINATE%] == [OKAY] (
    SET JUSTTERMINATE=
    python myscript.py %*
) ELSE (
    SET JUSTTERMINATE=OKAY
    CALL %0 %* <NUL
)

99. (9)% tanpa cacat.

Olegs Jeremejevevs
sumber
Ini tidak akan berfungsi jika myscript.pyingin membaca dari stdin.
jamesdlin
4

Lihat pertanyaan Stack Overflow ini .

Namun, menambal cmd.exe bukanlah sesuatu yang akan saya lakukan untuk itu.

Joey
sumber
0

Dalam kasus saya itu adalah file ping.bat yang tepat di direktori pengguna saya (C: \ Users \ di Vista atau C: \ Documents and Settings \ di XP) yang memegang pekerjaan batch tanpa batas.

File batch ini dieksekusi setiap kali saya menjalankan ping dari command prompt di mana direktori saat ini adalah direktori pengguna saya. Ping-ing dari jendela Run, atau dari direktori pengguna lain berjalan dengan baik.

Menghapus file dari dir pengguna saya dan masalahnya teratasi!


sumber
0

Mulai bekerja, tetapi sekarang jendela yang dibuka oleh file batch diubah dari opsi yang saya miliki dan "properti" dinonaktifkan (tidak akan merespons).


sumber
0

Cukup arahkan batch stdin ke null dengan menambahkan <nul ke akhir perintah.

Il Cognato
sumber
2
Saya pikir Anda mungkin berarti <nul (sebagai> nul mengirim semua stdout ke nol).
Brian Phillips
0

Saya mengalami ini dengan EXE yang tampaknya melemparkan ^ C ke batch induk saat keluar, menyebabkan prompt "Hentikan Batch Job" bahkan pada keluar yang bersih.

Solusi yang saya pilih untuk digunakan adalah menjalankan batch dengan "Mulai", mirip dengan jawaban lain, tetapi dari prompt PowerShell (atau melalui metode penerjemah PowerShell dari CMD, jika Anda memilih).

Sekarang tahun 2018, dan di Windows 10 Microsoft telah mulai mengganti CMD dengan PowerShell sebagai prompt perintah yang disukai, jadi secara default sudah tersedia di GUI, secara default.

Startadalah alias untuk Mulai-Proses .

Saat dijalankan, itu hanya meluncurkan dan kembali. Jadi, ketika Anda menghentikan proses yang diluncurkan, tidak ada prompt "Terminate Batch Job".

Secara default tidak menunggu, jadi tidak ada argumen tambahan di luar perintah dan argumen itu diperlukan.

Menggunakan start mything.exe -mythings -argumentsdalam batch saya bekerja dengan sempurna.

Dalam skrip PowerShell harus didahului oleh path mereka untuk diluncurkan, jadi saya menjalankan file batch saya sebagai .\host.bat.

Ƭᴇcʜιᴇ007
sumber
0

TCC / LE , yang merupakan pengganti CMD gratis (anggap sebagai CMD ++), memiliki opsi untuk menekan prompt pekerjaan batch yang diakhiri. Anda dapat menemukan opsi di Dialog Konfigurasi TCC Startup :

Batalkan File Batch pada Ctrl-C : Batalkan pemrosesan file batch tanpa prompt seperti biasa ketika Anda menekan Control-C.

Tangkapan layar:

Opsi TCC / LE

Jika Anda belum pernah mendengar tentang TCC / LE sebelumnya, berikut adalah beberapa uraian dari situs ini:

TCC / LE adalah pengganti untuk baris perintah CMD (prompt perintah Windows standar). TCC / LE adalah superset dari CMD, dengan 111 perintah internal (CMD memiliki kurang dari 40), 240 variabel dan fungsi internal, dan ratusan perangkat tambahan untuk perintah CMD yang ada.

TCC / LE bekerja dengan aplikasi baris perintah dan file batch yang ada, tetapi menawarkan peningkatan besar dalam baris perintah dan kemampuan file batch, dan menambahkan ribuan fitur baru ke jendela command prompt Anda.

Saya menggunakan TCC / LE selama bertahun-tahun dan 4NT sebelumnya. Saya punya banyak cinta untuk itu dan dapat merekomendasikannya. Satu-satunya alasan saya masih tidak menggunakannya adalah karena saya hampir secara eksklusif menggunakan PowerShell sekarang.

Charles Roper
sumber
0

Alasan utama untuk menekan "Terminate batch job (Y / N)", adalah untuk menjalankan program dalam satu lingkaran (misalnya: jalankan kembali jika macet).

Https://stackoverflow.com/a/8185270/1170023 ini membantu mengarah ke solusi ini:

@ECHO OFF
rem assumes you have installed pslist from sysinternals to windows PATH

:RUN
echo Starting GoldenEye Dedicated Server
start "" srcds.exe -console -game gesource +maxplayers 16 +map ge_complex

:LOOP
pslist srcds >nul 2>&1
if ERRORLEVEL 1 (
  goto RUN
) else (
  rem echo Dedicated server is still running
  timeout /t 5 >nul
  goto LOOP
)
kevinf
sumber
-2

Cara termudah untuk menekan konfirmasi jika Anda menggunakan terminal Hyper , adalah dengan menambahkan plugin hyper-yes .

Ricky Boyce
sumber
Mengapa downvote? Saya telah menyatakan ketika hanya menggunakan Hyper. Sebenarnya ini adalah solusi hebat yang saya gunakan saat menggunakan windows.
Ricky Boyce
1
Pertanyaannya adalah tentang cmd.exe.
Raúl Salinas-Monteagudo
-3

Di akhir skrip Anda, tambahkan saja perintah berikut:
echo
Ini tidak akan "merusak" perilaku skrip Anda, dan sepertinya mencegah CDM untuk bertanya apakah Anda ingin mengakhiri batch.

Henri
sumber
5
Tidak bekerja untuk saya.
Helgi