Komut satırı çıktısını bastır


118

Bunun gibi basit bir toplu iş dosyam var:

Eko kapalı

taskkill / im "test.exe" / f> nul

Duraklat

"Test.exe" çalışmıyorsa, şu mesajı alıyorum:

HATA: "test.exe" işlemi bulunamadı.

Çıkışı NUL'a yeniden yönlendirmeme rağmen bu hata mesajı neden görüntüleniyor?

Bu çıktıyı nasıl bastırabilirim?

Yanıtlar:


212

Hata iletileri genellikle gitmek Çünkü stderrdeğil stdout.

Çağrıyı şuna değiştirin:

taskkill /im "test.exe" /f >nul 2>&1

ve her şey daha iyi olacak.

Bu işe yarar çünkü stdoutdosya tanımlayıcısı 1'dir ve stderrgeleneksel olarak dosya tanımlayıcısı 2'dir. (0 stdin, tesadüfen.) 2>&1Çıktı dosyası tanımlayıcısı 2'yi yeni 1 değerinden kopyalar, bu da boş aygıta yeniden yönlendirilir.

Bu sözdizimi (gevşek bir şekilde) birçok Unix kabuğundan ödünç alınmıştır, ancak kabuk sözdizimi ile CMD.EXE arasında ince farklar olduğu için dikkatli olmanız gerekir.

Güncelleme: OP'nin NULburaya yazdığım "dosyanın" özel doğasını anladığını biliyorum , ancak bir yorumcu bunu anlamadı ve bu yüzden konuya biraz daha ayrıntılı olarak girmeme izin verin.

MSDOS'un en eski sürümlerine kadar geri gidersek, belirli dosya adları dosya sistemi çekirdeği tarafından önceliklendirildi ve aygıtlara atıfta bulunmak için kullanıldı. Bu isimlerden en erken listesi dahil NUL, PRN, CON, AUXve COM1içinden COM4. NULboş cihazdır. Okuma veya yazma için her zaman açılabilir, üzerine herhangi bir miktar yazılabilir ve her zaman başarılı okur ancak veri döndürmez. Diğerleri arasında paralel yazıcı bağlantı noktası, konsol ve dört adede kadar seri bağlantı noktası bulunur. MSDOS 5 itibariyle, birkaç tane daha ayrılmış isim vardı, ancak temel kural çok iyi oluşturulmuştu.

Windows oluşturulduğunda, MSDOS çekirdeğinin üzerinde oldukça ince bir uygulama geçiş katmanı olarak hayata başladı ve bu nedenle aynı dosya adı kısıtlamalarına sahipti. Windows NT kendi başına gerçek bir işletim sistemi olarak yaratıldığında, benzer isimler NULve COM1bunların ortadan kaldırılmasına izin vermeyecek kadar geniş çapta çalıştığı varsayılıyordu. Bununla birlikte, yeni cihazların her zaman gerçek dosyalar için bu adların gelecekteki kullanıcılarını engelleyecek isimler alacağı fikri açıkçası mantıksızdır.

Windows NT ve takip eden tüm sürümler (2K, XP, 7 ve şimdi 8) , çekirdek kodundan ve dikkatlice oluşturulmuş ve oldukça taşınabilir olmayan kullanıcı alanı kodundan çok daha ayrıntılı NT Ad Alanı kullanır . Bu ad alanında, aygıt sürücüleri \Deviceklasörden görülebilir . Geriye dönük uyumluluğu desteklemek için \DosDevices, herhangi bir dosya sistemi klasöründe ayrılmış dosya adlarının listesini uygulayan klasörü kullanan özel bir mekanizma vardır . Kullanıcı kodu, normal Win32 API'sinin altındaki bir API katmanı kullanarak bu dahili ad alanına göz atabilir; Kernel ad alanını keşfetmek için iyi bir araç , Microsoft'taki SysInternals grubundan WinObj'dir .

Windows'taki dosyaların (ve cihazların) yasal adlarını çevreleyen kuralların tam bir açıklaması için, MSDN'deki bu sayfa hem bilgilendirici hem de ürkütücü olacaktır. Kurallar olması gerekenden çok daha karmaşıktır ve "en uzun yasal tam nitelikli yol adı ne kadar uzun?" Gibi bazı basit soruları yanıtlamak aslında imkansızdır.


5
Cevap için teşekkürler ve en önemlisi açıklama için.
JosephStyons

Bir tavsiye: taskkill /im "test.exe" /f >%temp%\nul 2>&1 & del %temp%\nul. Bu, boş bir boş dosyanın yerel dizine yerleştirilmesini önleyecektir
Samy Bencherif

11
@SamyBencherif, NULayrılmış bir dosya adıdır ve NUL cihazıyla eşleşir . NULHerhangi bir dizinde isimlendirilmiş gerçek bir dosya oluşturamazsınız .
RBerteig

7

Bunun yerine şu komut dosyasını kullanın:

@taskkill/f /im test.exe >nul 2>&1
@pause

Ne 2>&1kısmı aslında yapıyor, o yönlendirir olmasıdır stderrçıktı stdout. Aşağıda daha iyi açıklayacağım:

@ taskkill / f / im test.exe> ​​nul 2> & 1

"Test.exe" görevini sonlandırın. Yönlendir stderriçin stdout. Ardından, yönlendirme stdoutiçin nul.

@Duraklat

Press any key to continue . . . Biri bir tuşa basana kadar duraklatma mesajını gösterin .

NOT: @Sembol, her komutun istemini gizler. Bu şekilde 8 bayta kadar tasarruf edebilirsiniz.

Senaryonuzun en kısa versiyonu olabilir: karakter yönlendirme için ilk kez kullanılan ve komutlar ikinci kez ayırmak için olduğu. Bir satırda iki kez karakter gerekmez. Bu kod, gönderdiğinizin 49 bayt olmasına rağmen sadece 40 bayttır! Aslında 9 bayt tasarruf ettim. Daha temiz bir kod için yukarıya bakın.
@taskkill/f /im test.exe >nul 2>&1&pause
&
@


Evet, gönderinin yarısının aslında kodunuzu nasıl kısaltacağınız olduğunu biliyorum.
EKons

3

mysqldump şununla çalışmaz: > nul 2> & 1
Bunun yerine şunu kullanın: 2> nul
Bu stderr mesajını bastırır: "Uyarı: Komut satırı arayüzünde bir parola kullanmak güvenli olmayabilir"


0

Bunun yerine bunu da yapabilirsiniz:

tasklist | find /I "test.exe" > nul && taskkill /f /im test.exe > nul

Sorunun bağlamının toplu komut dosyaları olmasına rağmen, PowerShell'de yukarıdaki sözdiziminin " dosya dışı: FileStream'den dosya olmayan bir cihazı açmasının istendiğini gördüm ." Com1: "veya" lpt1: "gibi cihazlar için destek için: ' yazıp bir IntPtr olarak bir OS kolu almak FileStream kurucular kullanın. CreateFile çağrı "çözüm değiştirmektir > nulile >$null.
savak
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.