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?
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.
Basın Ctrl+C iki defa.
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
)
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!
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.)
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.
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.
Bkz. bu Yığın Taşması sorusu .
Ancak, cmd.exe düzeltme eki bunun için yapacağım bir şey değil.
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).
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.
"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
)
Komutun sonuna <nul ekleyerek batch stdin komutunu null değerine yönlendirin.
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ü!
ü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’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.