it-swarm.asia

"Toplu işi sonlandır (E/H)" onayı nasıl bastırılır?

Cmd'de, Ctrl + C tuşlarına bastığımızda hedef uygulamanın sonlandırılmasını sağlıyoruz, 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?

146
Srikanth

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.

47
BinaryMisfit

Basın Ctrl+C iki defa.

57

Bu sitesinde , etkili bir çözüm buldum:

script2.cmd < nul

Bunu her seferinde yazmak zorunda kalmamak için, yukarıdaki satırla aynı klasörde script.cmd adlı ikinci bir komut dosyası yaptım. Bu tekniği yalnızca XP üzerinde 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
)
54
Gringo Suave

Install Clink ve "terminate_autoanswer" ayarını değiştirin. ayar dosyası burada olmalıdır : 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!

26
Macke

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

Örneğin:

@ echo off 
 
 set my_command = ping.exe 
 set my_params = -t www.google.com 
 
 echo Komutu tarafından yürütülecek 'start':% my_command%% my_params% 
 
 ::/B veya/WAIT kullanılmadığı zaman, bu yeni bir pencere açarken, 
 :: toplu iş dosyası geçerli pencerede devam edecek: 
 
 start% my_command%% my_params% 
 
 echo. 
 echo Bu satır ÖNCE çalıştırılacak 'başlangıç' bile bitmiştir. Bu nedenle, bu 
 Eko toplu iş dosyası, diğer penceredeki Ctrl-C tuşlarına basmadan ÖNCE tamamlayacaktır. 
 Echo. 
 
 :: Sadece 'duraklat' kullanımının test edilmesi için "Devam etmek için herhangi bir tuşa basın", 
 :: 'echo' komutlarının çıktısını görmek için. 'Ping' komutunu çalıştıran 
 :: penceresindeki Ctrl-C tuşlarına bastığınızdan emin olun (bu pencerede değil). Ya da basitçe 
 :: karıştığında bir sonraki satırı kaldır: 
 
 Duraklat 

(Windows XP'de test edilmiştir.)

17
sgmoore

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

En son epifiyetim, bir cmd.exe örneğini bir başkasıyla değiştirerek bir el çabukluğu (veya konsol penceresi). Bu, komut/program start cmd /k aracılığıyla ve ardından .BAT dosyasındaki exit komutuyla gerçekleştirerek gerçekleştirilir.

Orijinal konsol penceresi kaybolur ve yerine yenisini kullanarak temiz bir şekilde durdurulabilir. Ctrl-C.

Aşağıdaki kesilebilir bir traceroute örneği düşünün Ctrl+C, ya da tamamlandıysa, kullanıcıyı C:\> 'a geri döndürme İstemi:

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

13
ViperGeek

Gringo'nun çözümü iyidir, ancak argüman listesinden (yani python myscript.py %*) geçen komut dosyalarıyla iyi çalışmaz, çünkü SHIFT%* dosyasını güncellemez. geçici çözümler var , ancak belirli sınırlamaları var.

İş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.

7
Olegs Jeremejevs

Bkz. bu Yığın Taşması sorusu .

Ancak, cmd.exe düzeltme eki bunun için yapacağım bir şey değil.

4
Joey

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

0
user31480

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

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

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

Start, Start-Process 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" İstemi yoktur.

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

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

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

0
Ƭᴇcʜιᴇ007

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

Bu https://stackoverflow.com/a/8185270/1170023 bu çözüme yol açmasına yardımcı oldu:

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

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

0
Il Cognato

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

Bu toplu iş dosyası, yürürlükteki dizinin kullanıcı dizinim olduğu Prompt komutundan çalıştırdığımda yürütü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
bonipet

ücretsiz bir CMD yerine geçen TCC/LE (CMD ++ olarak düşünür), toplu iş sözleşmesini sonlandırmak için bir seçeneğe sahiptir. Bu seçeneği TCC Başlangıç ​​Yapılandırması İletişim Kutusu 'de bulabilirsiniz.

Ctrl-C'deki Toplu İş Dosyasını İptal Et : Control-C düğmesine bastığınızda normal komut istemiyle toplu iş dosyası işlemini iptal edin.

Ekran görüntüsü:

 TCC/LE options

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'nin üst kü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 iyileştirmeler 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
Charles Roper