“Grup işini sonlandır (E / H)” onayı nasıl bastırılır?


153

Cmd'de, Ctrl + C tuşlarına bastığımızda, hedef uygulamanın sonlandırılmasını sağlarız, ancak hedef uygulama bir toplu iş dosyasından çağrılırsa, bu "Toplu işin sonlandırılması (E / H)" onayı alırız. Toplu işi sonlandırmamayı seçtiğim bir örneği asla hatırlayamıyorum. Bu onayı nasıl atlayabiliriz?


Hiç sgmoore'un cevabını denedin mi? superuser.com/questions/35698/…
Arjan

10
“Toplu işi sonlandırmamayı seçtiğim bir örneği asla hatırlayamıyorum.” Ve aslında, çoğu durumda, hayır cevabı
verseniz

@PhiLho - Senaryolarım girdikten sonra her zaman devam ettiği için bu doğru olamaz N. Toplu komut dosyasının girdikten sonra sonlandırıldığı yerde hangi senaryoya sahip olduğunuzu merak ediyorum N.
dbenham

Bunun kolay olacağını umuyordum, ancak her zaman olduğu gibi Microsoft, basit bir şeyi kıçınıza çekti. Aşağıdaki cevapların tümü, bu küçük sıkıntıyı önlemek için çok fazla çaba harcıyor. Sadece bunu çözmek için basit bir yol olmadığı konusunda endişeliyim. Cidden Microsoft, bu istemin amacı nedir? Evet eminim, bu yüzden Ctrl + C ...
Chev

Bu sorun, en azından hatırlamak ve faydalanmak için beni neden olan -ncygwin için anahtar ping daha sık.
palswim

Yanıtlar:


53

AFAIK bu davranış olarak tasarım gereği ve komut yorumlayıcı tarafından kontrol edilemez. Yorumlayıcıyı doğrudan derlemediğiniz ve derlemediğiniz sürece, "haritalama" veya hatta "durdurma" yöntemi yoktur.


39
Bu hayal kırıklığı yaratıyor :(
Srikanth

Evet hayal kırıklığı yaratıyor. Daha da hayal kırıklığı yaratan şey, varsayılan olarak XP altında hiçbir şey yapmayan BREAK komutunun istemi değiştirmek için kullanılmış olabileceğidir…
Synetech

3
Doğru olmasına rağmen tercüman farklı startdavranamaz, superuser.com/questions/35698/… 'de önerilen sgmoore'u kullanmak benim için mükemmel bir çözüm gibi görünüyor.
Arjan


57

İki kez Ctrl+ tuşuna basın C.


5
Bu işe yaramayacak, ancak istemi tekrar ediyor.
Joey

8
Bunu yaparak veritabanımı yeni öldürdüm! Betik "duraklat" bekliyordu, bu yüzden CTRL-C yaptım ve sonra bilgi istemi geldi, bu yüzden tekrar CTRL-C yaptım ve sonra toplu iş hapilly devam etti ve veritabanımı sildi! @see superuser.com/questions/740004/…
Sebastien Diot

2
OP'nin sorduğu şey bu değildi. ^ C'den sonra kolayca "N" yazabiliyordu.
vladr

3
@vladr, daha sonra vurmak yerine vurmak Ctrlve Ctekrar vurmak için çok kolaydır . YEnter
Nick T,

20
@SebastienDiot Bir betiğin üzerinde verileri kalıcı olarak yok etme potansiyeli olan yeni bir teknik denediniz mi? Bu ... Cesur.
Temel

57

Bu sitede etkili bir çözüm buldum:

script2.cmd < nul

Bunu her seferinde yazmak zorunda kalmamak için script.cmdyukarıdaki satırla aynı klasörde adı verilen ikinci bir komut dosyası yazdım . Bu tekniği yalnızca XP'de test ettim, ancak diğerleri bunu Win 7'de onayladı.

Nathan ekliyor: Başka bir seçenek de aşağıdaki kodu bir dosyada aynı şeyi yapan script.cmd dosyasının üstüne koymak:

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
)

2
Bir toplu iş dosyasını kendi içinden (CALL komutunu kullanmadan) çağırırsanız, yürütme "kalıcı olarak" aktarılır. STDIN NUL'a yönlendirilirse, herhangi bir "Toplu İşi Sonlandır" istemi görünmeye devam eder, ancak giriş için beklemeyecektir (çünkü STDIN gitti). Bu benim için çalışıyor ...
William

3
Bu, Windows 7'de çalışır.
William

17
Toplu iş içinde kullanıcı girişi gerekmedikçe çalışır.
Augusto Men

2
@William, sadece senaryo benim için işe yaramadı çağırarak, ama geçici bir çözüm ile geldi: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]). Özyinelemeli olarak çağırır, ancak ikinci kez bir argümanla. Komut dosyanızın argümanları varsa, potansiyel olarak ilk kullanılmamış konumsal argümanı kullanabilirsiniz. Komut dosyanızın çok fazla argümanı varsa, bu sorunlu olabilir. Komut dosyamın bağımsız değişkenlere veya kullanıcı girişine ihtiyacı yoktu.
jpmc26

jpmc'nin cevabı benim için çalıştı. Bu lanet olası Sonlandır (y / n) yankılanıyor mu? sonra mesaj olsa da bitiyor, ancak bunun için durmuyor.
ggb667

28

Clink'i kurun ve "terminate_autoanswer" ayarını değiştirin. Ayarlar dosyası burada olmalı : 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

Bu daha sonra herhangi bir cmd.exe penceresiyle "sadece çalışır". Ne çalıştığını veya başka bir şeyi değiştirmenize gerek yok, çünkü cmd.exe'deki piggy backs.

Lanet olsun harika, IMO!


Clink fantastik ama bu benim için çalışmıyor, cmd.exe veya Console2 kullanıyor. Hala soruyor ve otomatik olarak doldurulmuyor.
iono

@tometoftom: Ayarlar dosyasını yukarıdaki gibi değiştirdiniz mi? Bunu işe almak için yapmak zorundaydım. (Dosyayı Windows Vista ve üst sürümlerine doğru şekilde kaydetmek için yönetici olmanız gerektiğini unutmayın ...)
Macke

3
Ah, hala zar yok. derin iç
çekişe

3
@iono İngilizce olmayan Windows sürümünüz var mı? Bu durumda, birkaç gün önce 0.4.3
şlamar

3
İlgili: cmder kullananlar için ayar açıktır \cmder\config\settings. Burada ilgili konuya bakın github.com/cmderdev/cmder/issues/1666
edmundo096

17

Uygulamanız normal şekilde tamamlandıktan sonra toplu iş dosyasında herhangi bir şey yapmanız gerekmiyorsa, startkomutun kullanılması , toplu iş dosyasının Ctrl-C tuşlarına bastığınızda zaten bitmesini sağlar. Ve dolayısıyla mesaj görünmeyecektir.

Örneğin:

@Eko kapalı

set my_command = ping.exe
my_params = -t www.google.com’u ayarlayın

'start' tarafından çalıştırılacak olan echo komutu:% my_command%% my_params%

:: / B veya / WAIT kullanılmazsa, o zaman bu yeni bir pencere yaratacak,
:: Bu toplu iş dosyasının yürütülmesi mevcut pencerede devam edecektir:

başlangıç% my_command%% my_params%

Eko.
echo Bu satır 'start' bile bitmeden ÖNCE yürütülecektir. Yani bu
yankı toplu iş dosyası, bir diğer pencerede Ctrl-C tuşlarına basmadan ÖNCE tamamlayacaktır.
Eko.

:: Sadece test için "devam etmek için herhangi bir tuşa basın" ifadesini göstermek için 'duraklat'ı kullanın
:: 'echo' komutlarının çıktısı. Pencerede Ctrl-C tuşlarına bastığınızdan emin olun.
:: 'ping' komutunu çalıştırır (bu pencerede değil). Veya sadece kaldırın
:: karıştığında bir sonraki satır:

Duraklat

(Windows XP'de test edilmiştir.)


startGerçekten yardımı olur mu bilmiyorum ama bana mantıklı geliyor. Bu yüzden, aşağı yöndeki oylamanın işe yaramayacağını mı ima ettiğini merak ediyorum. Ya da belki kim aşağı oy kullandıysa, Windows ' start(veya özellikle start /waitve start /b) komutunu bilmiyordur ? Daha sonra microsoft.com/resources/documentation/windows/xp/all/proddocs/… adresine bakın . Lütfen aşağı oylamayı açıkla?
Arjan

startişe yaramayacak. Cmd bir toplu iş dosyası çalıştırdığında, Ctrl + C tuşlarına basmak, o sırada çalışan işlemin soruyu sonlandırmasına ve göstermesine neden olur.
Joey

1
+1 benim için çalışıyor. Bununla birlikte, / b Ctrl + C işlemlerini kapatır (rahatsız edicidir).
Nick Bolton

3
Toplu iş dosyasını çift tıklatıyorsanız bu iyidir. Ancak toplu iş dosyasını konsolda başlatırsanız ne olur?
Helgi

8
(Windows 7’den konuşma, XP’ye uygulanabilir olup olmadığından emin değil) Microsoft’un komutu kodlamak için kiraladığı düşüncesiz geliştirici , aptalca bir pencerenin başlığını aynı anda hem zorunlu hem de isteğe bağlı hale getirmeye karar verdi - oldukça kafa karıştırıcı bir şekilde. Böylece , çift tırnak içine alınmışsa , pencerenin başlığı olur ve ilk param komut olur . Güvende olmak için kullanın . Çoğu , başlığı ayarlamak için geliştiriciyi bir veya seçeneği kullanmadığınız için kullanın ve lanetleyin . start%my_command%%my_params%start "some title here" %my_command% %my_params%""/TITLE/T
ADTC

13

Bir süredir "Parti işini sonlandır" isteminden kaçınmak için bu arzu ile mücadele ediyorum.

Son Epifani, bir örneğini cmd.exebaşka biriyle değiştirerek biraz el çabukluğu (veya konsol penceresi) . Bu komut / program yürütülür ve dosyada start cmd /khemen takip edilir . exit.BAT

Orijinal konsol penceresi kaybolur ve değiştirme Ctrl- - üzerinden temiz bir şekilde durdurulabilir C.

Kullanıcının istemine geri döndürerek + tracerouteile kesilebilecek veya tamamlamasına izin verilebilecek aşağıdaki bir örneği düşünün :CtrlCC:\>

@echo off

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

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

Yeni bir komut yorumlayıcısının ortam değişikliği, herkes için olmayabilir, ama çıplak gözle bakılır ve benim için iyi çalışır.


+1 Çok yeni bir yaklaşım ve ti'nin kesin olarak değiştirilmemesi konusunda hemfikir olmama rağmen, iyi çalışıyor (görevinize "cmd.exe yerine" ile başladığınızda endişelendiyseniz de - örneğe ulaşana ve gerçekleşene kadar güvenlik alarmları çalıyordu) ne demek istediniz)
Temel

exit /btoplu iş komut dosyasından çıkmak için kullanmanız gerekir
Sebastian Godelet

1
@SebastianGodelet: Genel olarak bu iyi bir tavsiye, ancak burada amaç, hedef komutun yeni bir pencerede başlatılması koşuluyla (orjinal) konsol penceresini kapatmak .
mklement0

Neden "/ c" yerine "cmd / k" kullan (tercümanı açık tut)? Sadece komutun çıktısını görebilmek için mi?
Raúl Salinas-Monteagudo

9

Gringo'nun çözümü iyidir, ancak güncelleme yapılmadığından (yani python myscript.py %*) argüman listesinden geçen komut dosyalarıyla iyi SHIFTçalışmaz %*. Orada geçici çözümler , ancak bazı sınırlamaları vardır.

İşte benim dediğim değişiklik:

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

99. (9)% kusursuz.


myscript.pyStdin'den okumak isterse bu işe yaramaz .
jamesdlin


0

Benim durumumda, parti işimi belirsiz bir şekilde tutan kullanıcı dizinimdeki (p: Vista'daki C: \ Users \ veya C: \ Documents and Settings \) ping.bat dosyasıydı.

Bu toplu iş dosyası, geçerli dizinin kullanıcı dizinim olduğu komut isteminden ping işlemi yaptığımda çalıştırıldı. Çalıştır penceresinden veya başka bir kullanıcının dizininden ping atılması iyi çalışıyordu.

Dosyayı kullanıcı dizinimden kaldırdım ve sorun çözüldü!


0

Başlat, ancak şimdi toplu iş dosyası tarafından açılan pencere, sahip olduğum seçeneklerden değiştirildi ve "özellikler" devre dışı bırakıldı (yanıt vermiyor).


0

Komutun sonuna <nul ekleyerek batch stdin komutunu null değerine yönlendirin.


2
Bence <nul demek istediğini (> nul tüm stdout'ları null'a gönderir).
Brian Phillips

0

Bunu, çıkışta ana partiye ^ C atmak gibi görünen bir EXE ile karşılaştım, "Toplu İşi Sonlandır" komut istemine temiz bir çıkışta bile neden oldu.

Kullanmayı seçtiğim çözüm, grubu diğer yanıtlara benzer bir şekilde "Başlat" ile çalıştırıyordu, ancak bir PowerShell isteminden (ya da seçerseniz CMD'den PowerShell yorumlayıcı yöntemi ile) kullanıyordum.

Şimdi 2018 ve Windows 10'da Microsoft, tercih edilen komut istemi olarak CMD'yi PowerShell ile desteklemeye başladı, bu yüzden varsayılan olarak GUI'de hazır durumda.

StartBaşlat İşlemi için bir takma addır .

Çalıştığında, sadece başlattı ve döner. Dolayısıyla başlatılan işlemi durdurduğunuzda, "Toplu İşi Sonlandır" istemi yoktur.

Varsayılan olarak beklemez, bu nedenle komutun ötesinde ek argüman yok ve onun argümanları gerekli.

Partimde kullanmak start mything.exe -mythings -argumentsmükemmel çalıştı.

PowerShell'de komut dosyalarının başlatılma yollarından önce gelmesi gerekir; bu nedenle toplu iş dosyamı şu şekilde çalıştırırım .\host.bat.


0

Ücretsiz bir CMD değişimi olan TCC / LE’nin (CMD ++ olarak düşünün) toplu iş istemini sona erdirme seçeneği vardır. Seçeneği TCC Başlangıç ​​Yapılandırma İletişim Kutusunda bulabilirsiniz :

Ctrl-C'de Toplu Dosyayı İptal Et: Control-C tuşuna bastığınızda genel istemi olmadan toplu iş dosyası işlemini iptal edin.

Ekran görüntüsü:

TCC / LE seçenekleri

TCC / LE’yi daha önce hiç duymadıysanız, işte siteden biraz bulanık:

TCC / LE, CMD komut satırının (varsayılan Windows komut istemi) yerine geçer. TCC / LE, 111 dahili komut (CMD'nin 40'tan daha azına sahiptir), 240 dahili değişken ve fonksiyona ve mevcut CMD komutlarında yüzlerce geliştirmeye sahip bir CMD üstkümesidir.

TCC / LE, mevcut komut satırı uygulamalarınız ve toplu iş dosyalarınızla çalışır, ancak komut satırı ve toplu iş dosyası yeteneklerinde büyük gelişmeler sunar ve komut istemi pencerelerinize binlerce yeni özellik ekler.

TCC / LE'yi yıllarca ve ondan önce 4NT kullandım. Bunun için çok sevgim var ve tavsiye edebilirim. Hala kullanmamamın tek nedeni, artık neredeyse yalnızca PowerShell'i kullanmam.


0

"Grup işini sonlandır (E / H)" yi engellemenin ana nedeni, bir programı bir döngüde çalıştırmaktır (örneğin: çökmesi durumunda yeniden çalıştır).

Bu https://stackoverflow.com/a/8185270/1170023 bu çözüme yol açtı:

@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
)


-3

Komut dosyanızın sonunda, aşağıdaki komutu eklemeniz yeterlidir:
echo
Bu, komut dosyanızın davranışına "zarar vermez" ve CDM'nin toplu işlemi sonlandırmak isteyip istemediğinizi sormasını engelliyor gibi görünüyor.


5
Benim için işe yaramadı.
Helgi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.