Komut isteminin yürütmeden sonra kapanması nasıl önlenir?


54

Benim sorunum şu ki, Windows'ta, yürütmeden hemen sonra kapanan komut satırı pencereleri var. Bunu çözmek için, varsayılan davranışın pencerenin açık tutulması olmasını istiyorum. Normalde, bu davranış aklıma gelen üç yöntemle önlenebilir:

  1. pauseToplu programlardan sonra bir satır koymak , kullanıcının çıkmadan önce bir tuşa basmasını istemek için
  2. Bu toplu iş dosyalarını veya diğer komut satırı işlem araçlarını (hatta hizmet başlatma, yeniden başlatma vb. net start xyVeya benzeri bir şeyle) cmd.exeçalıştırma (Başlat - Çalıştır - cmd.exe)
  3. Bu programları şununla çalıştırma cmd /k: cmd /k myprogram.bat

Ancak kullanıcının içinde bulunduğu başka durumlar da var:

  1. Programı ilk kez çalıştırır ve verilen programın Komut İsteminde (Windows Komut İşlemcisi) çalışacağını bilmez, örneğin Başlat menüsünden (veya başka bir yerden) bir kısayol çalıştırırken, VEYA
  2. Cmd.exe aracını her zaman çalıştırmak biraz rahatsız edicidir ve bu komutların kodunu her yerde duraklatmak veya açıkça çıkmamak için kodunu yeniden yazmak için zaman / fırsat bulamaz.

AutoRun girişi oluşturma ve içeriğini şu konumlarda değiştirme ile açıkça açarken varsayılan davranışını değiştirme hakkında bir makale okudum :cmd.exe

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

(AutoRun öğeleri _String values_...)

cmd /d /kDenemek için bir değer olarak koydum , ancak bu yukarıda belirtilenlerin davranışını değiştirmedi ... Açıkça açılırken komut satırı penceresinin davranışını değiştirdi (Start-Run- cmd.exe).

Peki nasıl çalışıyor? Bana bu sorunu çözmek için herhangi bir fikir verebilir misiniz?


10
Tüm açıklamalarla ilgili sorunuz kafamı patlatmak istedi. Şunun gibi bir şey söyleyebilir misiniz: Bu "example" komutuyla bir toplu iş dosyası çalıştırmak istiyorum ve komut kutusunun tamamlandığında açık kalmasını istiyorum. İstediğin bu mu? Lütfen kodun yakın bir örneğini koyun.
KCotreau,

1
+1 Anladım. Biraz ayrıntılı, lütfen sorunuzu tekrar gözden geçirin ve mümkünse bir örnek kullanın ve daha özlü bir soru oluşturun.
slotishtype

2
Bu normal bir davranıştır ve sorunuz kesinlikle geçerli olsa da, komut istemini neden açık tutmanız gerektiğini sormalısınız (çoğu uygulama akılda tutularak oluşturulmuştur).
Atılım

1
Bence bu gerçek bir soru değil. Kullanıcıya bunun yerine bir toplu iş dosyası kullanmasını söylerken. Sorunun amacı bu değilse, lütfen kafa karıştırıcı bilgileri kaldırarak sorunuzu netleştirin ve asıl amacınızın ne olduğunu açıklayın.
Belirsiz

1
@Randolf Richardson, çünkü bu araçların hiç bir son kullanıcı tarafından görülmemesi gerekiyordu (sonuçta, bu yüzden GUI'leri şimdi kullanıyoruz). Bu tür bilgilere ihtiyacınız varsa, çoğu BT grubu onlara uygun sistem bilgilerini toplamak ve görüntülemek için toplu iş dosyaları gönderir. Bu soruya bir çözüm bulunursa, daha az soruna neden olacak, o zaman çözülecek bir yol göremiyorum - pek çok şey stdoutsürekli olarak asla iyi bir nedenden dolayı görünür olmayacak şekilde gönderilir .
Atılım

Yanıtlar:


27

Yalnızca uygulayabileceğim bir çözüme sahibim .cmdve .batdosyalar:

regeditve her birine git:

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

Şimdi "Varsayılan anahtar değeri" olarak değiştirin cmd.exe /k "%1" %*. Şimdi, her toplu komut dosyası penceresi yürütüldükten sonra açık kalacaktır.

Bunun kullanmaya benzer cmd.exe /c cmd.exe /k program.batolduğunu, başka bir CMD örneğinin üst öğeye yerleştirileceği anlamına geldiğini unutmayın . İlk /cargümanın üzerine nasıl yazılacağını bulamadım .

Bunu da yapabilirsiniz [exefile], ancak çalıştırılabilir bir GUI varsa, şimdi boş bir konsol kutusu gösterecektir.


4
Burada verilen soruyu gerçekten cevaplayan tek çözüm için +1. Ne yazık ki, bunun olmasını bekleyen bir bellek sızıntısı olabileceğini düşünüyorum. Bir hizmet, CMD satırında CMD.EXE belirtilmeden yeni bir toplu iş dosyası başlattığında ne olur? Bu kod bu durumda kullanılmayacak mı? Bu etkileşimli olmayan bir masaüstünde yeni bir pencere oluşturup yeniden başlatana kadar açık bırakmayacak mı?
krowe2

@APerson Düzenlemeniz, komutu dahil etmeden komutu bozdu *. Lütfen düzenleme yaparken daha dikkatli olun!
not2qubit

@ not2qubit Üzgünüm, iki yerine üç yıldız işareti sildiğimi fark etmedim. Yapacağım.
APerson

17

Microsoft alıntı :

Eklenen son işlem FreeConsole'u sonlandırdığında veya aradığında konsol kapanır.

Başka bir deyişle, Win32 konsol penceresi içinde çalışan son programdan çıktığında daima kapanır ve bunu değiştiremezsiniz.


(16 bit MS-DOS programları için Windows, özellikler iletişim kutusunda "Çıkışta kapat" seçeneği sunar, ancak bu yukarıdaki davranış için bir istisna değildir: pencereyi açık tutan NTVDM işlemidir. Ayrıca, bu seçenek yine program başına.)


13
Anlamak için 1 nasıl ve niçin yakın konsol pencereleri (aksine sadece söyleyenler en "OMG NEDEN AÇIK KALMAK CAN NOT !!!!!!!!!!! 1111one"). Tasarlandığı gibi davranıyor ve bu şekilde kalmalı IMHO. Bu, standart akışların ve toplu iş dosyalarının ilk etapta olmasının temel nedenidir.
Atılım

27
@Breathrough Soru How can I do X, değil In your opinion, should I do X. Bu cevap yararsızdır, kısmi çözümler zaten başka yerde sunulduğunda, X'in imkansız olduğu anlamına gelir. (-1)
Superbest

7

Yalnızca toplu iş dosyanızın konumundaki bir komut istemi açın ve bu pencerede çalıştırmak için toplu iş dosyanızın adını el ile girin.

1. Çalıştırılabilir klasörün bulunduğu klasöre
gidin 2.Shift-Sağ tıklayın ve "Buradan Komut Penceresi"
ni seçin . 3. Çalıştırılabilir adının adını girin ve enter tuşuna basın
. 4. İşlem çalışmalı, ancak pencere açık kalmalı


1
ÜstKrkt + Sağ tıklamayı bilmiyordum. Ayrıca, exe'yi sürükleyip bırakarak bir otomatik olarak cmd penceresine sürükleyebilirsiniz.
Superbest

1
Bu genellikle benim için işe yarar, ama görünüşe göre kesin bir şey değil çünkü tam olarak bir çözüm arıyorum çünkü şu anki durumumda çalışmıyor.
RenniePet

bu en kolay çözümdür ve doğru cevap olarak işaretlenmelidir
Vicky Kapadia

4

cmd.exe /kBazı parti ile size sorun verecektir. Toplu iş exit 1(olmadan /B) konsolunuz kapalı olacaktır. Bir hile kullanmaktır:

cmd.exe /k cmd /c ...

Bunu tüm toplu iş dosyalarında varsayılan olarak kullanmak için, HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default)ve tuşlarını HKEY_CLASSES_ROOT\batfile\shell\open\command\(default)kullanın "%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*.


1
Bunun "%*"tam parametre listesini geçtiğini düşündüm , bu yüzden ilk parametreyi ilk parametre olarak iki kez, bir kez "%1"ve bir kez daha geçemez "%*"mi?
Kevin Fegan

1
@KevinFegan Sebebini kontrol etmedim, ancak% 1 ifadeleri bazı durumlarda muhtemelen çift tırnaklı olacağı anlamına gelmeli. Şu anda hatırlamadığım %1 %2 %3 ..ve %*hatırlamadığım bir fark var ama %1 %2 %3bazı durumlarda %*başarısız oluyor.
Wernight

3

Ben sadece grawitycevabını okuduktan sonra aptal bir çözüme çarptım.

Kullanım durumum, daha makul olan tüm çözümlerin engellendiği işte bir konsol ortamı oluşturmaktı. İhtiyacım olan tek şey PATH'yi ayarlamak ve bazı kısayol takma adlarını yapılandırmak ve kabuğa atılmak.

Benim çözümüm (sadece Win7'de test edilmiştir) cmd, toplu iş dosyasındaki son satır olarak eklenir . Bu, üst öğesinin ortamını miras alan iç içe bir komut istemi çalıştırır. Bu alt kabuk, siz EXIT'e kadar parti işlemini açık tutar; bu noktada, partinin alt işlemi yoktur ve ayrıca çıkar.


2

PAUSE kullanmak yerine (gerektiğinde PAUSE kullanmak yerine CHOICE veya TIMEOUT'u tercih ederim), çözümü burada kullanabilirsiniz: 886848 / nasıl yapılırken, windows-toplu iş dosyası-duraklatıldığında-çift tıklatıldığında .

Bu şekilde, Windows Gezgini içinden bir toplu iş dosyasına veya bağlantıya (kısayol) tıklarsanız, toplu iş dosyası programından çıkmadan önce duraklatılmasını sağlayabilirsiniz, böylece program çıktısını ve hata mesajlarını görüntüleyebilirsiniz.

CHOICE kullanarak, kullanıcının gerçekleştirmesi gereken çeşitli eylemleri seçme özelliğini programlayabilirsiniz ve TIMEOUT kullanarak, bir süre bekledikten sonra (katılımsız) pencerenin kapanmasına izin verebilir. Toplu iş dosyasını bir komut istemi penceresinden çalıştırırsanız, bu duraklamalar can sıkıcı olabilir.

Bağlantılı çözüm, toplu iş dosyası bir komut istemi penceresinden çalıştırıldıysa duraklamaları atlamak isteyip istemediğinize karar vermenizi sağlar.

Sağlanan bağlantıdan daha fazlasını okuyabilirsiniz, ancak bunun temeli, ortam değişkenini kullanmasıdır:

%cmdcmdline%

Toplu iş dosyasının bir komut penceresinden çalıştırılıp çalıştırılmadığını belirlemek için.

Demek böyle kullanıyorsun:

Toplu iş dosyasının çıkacağı noktada şöyle bir kod eklersiniz:

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

1

Bunu çözmenin en iyi yolu, toplu iş dosyalarınızı başka bir toplu iş dosyasından start kullanarak çağırmak.

normalde go.bat adlı bir dosyayı çalıştırırsanız, go2.bat gibi bir adla ikinci bir toplu iş dosyası oluşturacaksınız.

go2.bat içeriği sadece olur

start go.bat

ilk pencere hemen kapanır, ancak go.bat’inizi çalıştıran pencere açık kalır


Bu çalışır, sadece ikinci bir yarasa dosyasındaki "start 1.bat" start komutunu kullanarak çağrılan bir yarasa dosyasına (1.bat) çalıştırılabilir komut isteminin adını koydum. Komut penceresi açık kalıyor.
ejectamenta

1

Bu, Windows Kayıt Defteri Düzenleyicisi'nin 5.00 sürümü için çalışır.

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

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

Yukarıdaki cmds 'yi benzer bir dosyaya kaydedin ve uygulayın cmdbatfile-open.reg!


2
Stack Exchange'e Hoş Geldiniz! Cevabınızdaki biçimlendirmeyi sizin için düzelttim. Biçimlendirme yardımı için buraya bakın. Ayrıca, kod gönderdiğinizde, lütfen tam olarak ne yaptığını açıklamayı unutmayın. Ayrıca cevaplama konusundaki nasıl yapıldığını okumak isteyebilirsiniz .
Blacklight 24:13

1

Kendi örneğinde başlatmak istediğiniz iki toplu iş dosyanız olduğunu varsayalım ve yürütülebilir dosyaları çıkarsa açık tutun. Bu iki toplu diyelim A.batve B.bat.

Şimdi basitlik için, ikisini de başlatmak için bir toplu iş dosyanız olabilir, hadi launch_both.batiçindekiler ile şunu çağıralım :

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

exitİki toplu iş dosyasından birini çağırırsanız , beklendiği gibi çalışmayabilir . Test edilmesi gerekecek.


0

Windows 10 kullanan kullanıcılar için, yukarıdaki yanıtların hiçbirinin şu anda Windows 10 için işe yaramadığını unutmayın.

Windows 10 için, komut dosyasına erişiminiz varsa, sonuna aşağıdaki kodu eklemeniz gerekir:

read

Bu kod kapanmadan önce bir giriş bekleyecektir.


Sorunun Windows 10'dan (5 yıl önce) önce sorulduğunu unutmayın, lütfen cevabınızı daha fazla bilgi ile düzenleyin
yass '

0

Düşürülmüş PSIXO’nun cevabına - "Bu cevap zaten sorunda ele alındı. - Ro Yo Mi, 20 Ocak 16:06 5:06" Önceki cevaplar: "duraklama", işe yaramadı. PSIXO'nun cevabı şuydu: işe yarayan "& duraklat". Lütfen düşürmeden önce daha dikkatli bir şekilde ayrıştırın. Bunu bir IDLE komut isteminden çalıştırdım ve işe yaradı:

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

Diğer yandan:

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

İşe yaramadı (cmd istemi üzerine eğildi ve aslında bir hata (1) verdi. İhtiyacım olan cevap için PSIXO'ya teşekkürler. Henry.

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.