Bir .bat dosyasını penceresiz olarak zamanlanmış bir görevde çalıştırın


143

robocopyHer saat çalışan bir toplu komut dosyasını başlatan zamanlanmış bir görevim var . Her seferinde bir pencere açıldığında, gerçekten görmek istemediğim robocopy'nin çıktısıyla masaüstünde beliriyor.

Zamanlanmış işi yürüterek pencerenin küçültülmüş görünmesini sağladım.

cmd /c start /min mybat.bat

ama bu bana her saat yeni bir komut penceresi veriyor. cmd /c"Dizeyle belirtilen komutu yerine getirir ve sonra sonlandırır" derken şaşırdım - dokümanlar yanlış anlamış olmalı.

Toplu iş komut dosyasını bir cmd penceresi açmadan çalıştırmanın bir yolu var mı?


Bunu daha çok tercih edilen bir cevap olarak buldum stackoverflow.com/questions/6568736/…
Efekt

Yanıtlar:


144

Bunun yerine bir Windows Script dosyası kullanarak sessizce çalıştırabilirsiniz. Çalıştırma Yöntemi, bir komut dosyasını görünmez modda çalıştırmanıza izin verir. Bunun .vbsgibi bir dosya oluşturun

Dim WinScriptHost
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Scheduled Jobs\mybat.bat" & Chr(34), 0
Set WinScriptHost = Nothing

ve bunu programlayın. Bu örnekteki ikinci argüman pencere stilini belirler. 0, "pencereyi gizle" anlamına gelir.

Run yönteminin tam sözdizimi :

 object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

Argümanlar:

  • nesne: WshShell nesnesi.
  • strCommand: Çalıştırmak istediğiniz komut satırını gösteren dize değeri. Yürütülebilir dosyaya iletmek istediğiniz tüm parametreleri içermelisiniz.
  • intWindowStyle: İsteğe bağlı. Program penceresinin görünümünü belirten tamsayı değeri. Tüm programların bu bilgileri kullanmadığını unutmayın.
  • bWaitOnReturn: İsteğe bağlı. Komut dosyanızdaki bir sonraki ifadeye devam etmeden önce komut dosyasının programın yürütülmesini bitirmesini bekleyip beklemeyeceğini gösteren Boolean değeri. True olarak ayarlanırsa, komut dosyası yürütme program bitene kadar durur ve Çalıştır program tarafından döndürülen herhangi bir hata kodunu döndürür. False (varsayılan) olarak ayarlanırsa, Çalıştır yöntemi programı başlattıktan hemen sonra otomatik olarak 0 döndürerek (hata kodu olarak yorumlanmayacaktır) döner.

+1, tamamen aynı şeyi yazdı
Sam Cogan

Silmeden önce gördüm. Sanırım ikimiz de botuz. ;-)
splattne

1
kullanıcı adı, dürüst olmak gerekirse, Sam'in benden daha çok hakettiğini düşünüyorum. Ama yine de teşekkürler! Ve aynı cümlede benden ve Jon Skeet'ten bahsetme. Bu küfürdür! ;-)
splattne

3
"Toplu bir komut dosyasını bir cmd penceresi açmadan çalıştırmanın bir yolu var mı?" Sorusuna, çok doğrudan bir yanıt verir: Bir Windows Komut Dosyası dosyası kullanarak çalıştırın.
Mark Meuer

2
@Lee Yolunuz boşluk içeriyorsa çift tırnak gerekli olduğunu sanırım.
splattne

58

Bunu zamanlanmış bir görev olarak mı çalıştırıyorsunuz? Öyleyse, farklı bir kullanıcı hesabı olarak çalışacak şekilde ayarlanmışsa, oturum açan kullanıcı tarafından görülmez. Komut dosyası, windows auth (veya dosya paylaşımları veya yazıcılar gibi) gerektiren öğelere ağ erişimi gerektirmiyorsa, "nttorite \ system" olarak çalıştırabilir ve şifreyi boş bırakabilirsiniz. Windows 7'de kullanıcıyı sadece SİSTEM olarak ayarlayın ve Tamam'a basın.

(Eğer robokopi kullanıyorsanız, muhtemelen gerçek bir kullanıcı kullanmak zorundasınız ...)

JR


3
Teşekkürler - bu benim için .vbs seçeneğinden daha az güçtü.
mackenir

8
"Farklı çalıştır" kullanıcısını SYSTEM (daha sonra NT AUTHORITY \ SYSTEM olarak değiştirdi) kullanıcısına ayarladım ve bu benim için çalıştı. Zamanlanmış görevim çalıştığında, artık açılan CMD penceresini göremiyorum. Teşekkürler!
Ryan Stille

1
+1, bu zarif. Kullanıcı adı olarak "sistem" girdiğinizden emin olun, sonra win7 sizin için gerisini yapar. İnternete ağ erişimi sağladığınızı, sadece ağ paylaşımlarına ve Windows'ta kimlik doğrulaması gerektiren şeylere sahip olmadığınızı unutmayın.
samsmith,

1
Sistem kullanıcısı basit ve zarif, harika bir ipucu! +1!
Matteo Conta

1
En Az Ayrıcalıklı İdari Modellerin Uygulanması bölümüne bakınız . Sistemin kullanımı bunun hesabını En Az Ayrıcalık politikalarına aykırı mıdır? Öyleyse yöneticiler çoğu durumda bunu yapmamayı bilmelidir .
user34660,

29

Zamanlanmış Görevi "Kullanıcının oturum açıp açmadığını çalıştır" olarak yapılandırmanız yeterlidir.


6
Mükemmel! Kimlik bilgileri deposunu bile devre dışı bırakabilirsiniz ve ardından bu SYSTEM'in çalıştırılmasından daha güvenli olur!
Binki

17

CHP'yi de (Gizli işlem oluştur) deneyebilirsiniz , tam olarak düşündüğünüzü yapar ...

CHP.EXE Instagram Hesabındaki Resim ve Videoları mybat.bat

Komut penceresi olmadan çalışır. Mükemmel! CMDOW ile aynı kişiler tarafından yapılmıştır, ancak bu daha uygundur.


Görevi, oturum açmış kullanıcı bağlamında çalıştırmanız gerektiğinde mükemmel çalışır ("Tetikleyici: kullanıcı oturumuna bağlanıldığında", "Görevi farklı çalıştır: Kullanıcılar")
Sergei

1
Bu yerleşik bir araç değil
JonnyRaa

9

CMDOW , pencerelere komut satırından birçok, birçok şey yapmanıza izin veren bir awsome aracıdır.

Yapılacak en basit şeylerden biri mevcut pencereyi gizlemek (genellikle yarasa dosyasındaki ilk satır olarak):

cmdow @ /hid

veya ile yeni bir gizli işlem başlatmak

cmdow /run /hid mybat.bat 

4
Hem bu hem de Rocketmonkey'lerin önerisi, çeşitli halkların masaüstlerinde daha fazla uyumluluk anlamına gelen yeni araçlar indirmeyi içeriyor. Windows komutları kullanılarak yapılan fırınlama daha iyidir.
IanVaughan

Artı cmdow, bazı virüsten koruma programları tarafından "tehlikeli" olarak algılanır ( tehlikeli değildir , ancak cmdow dosyası karantinaya alınmışsa, algılamanın kendisi bazı sorunlara neden olabilir ...).
Otiel

3
hala açılan bir konsol var, sadece çok hızlı yanıp sönüyor.
Bambu

5

Betiği ile çağırmayı deneyin

start /b <command>

1
Bu işe yaramazsa, Zamanlanmış Görev-> Durum "Başlatılamadı" ifadesini gösterir: şununla: start / b C: \ file.bat: ve: / b "C: \ file.bat": ama: C: \ file.bat: gayet iyi çalışıyor.
IanVaughan

1
Çünkü startbir program değil, bir komuttur. cmdÇalıştırılacak program ve /c start /b <file>bağımsız değişken olarak belirtmeniz gerekir . Ancak, bu hala işe yaramayacak çünkü cmdekranda bir siyah pencere açacak ve ekranda siyah bir pencere açacaktır.
Synetech

1
Ayrıca @Synetech ile bunun yeni bir pencere açmayacağını doğrulayabilir, ancak başlatmak için hala bir konsol penceresinin açık olması gerekir. Bu gerçekten kullanışlı bir komuttur ancak Zamanlanmış Görevler'de istenildiği gibi kullanılamaz.
JonathanDavidArndt

5

Toplu iş dosyasına bir kısayol oluşturabilir, simge durumuna küçültülecek şekilde kısayol ayarlayabilir (kısayolun özelliklerinde 'Kısayol' sekmesini) ve ardından kısayolu başlatacak işi ayarlayabilirsiniz.

Önemli : Kısayolun yolunu, Çalıştır metin alanına yazıp, '.lnk' uzantısı ile tamamlayarak manuel olarak belirtmeniz gerekir; sadece buna göz denerseniz, bu olacak yardımsever için ne kısayol noktaları kendisini yönlendirir.


Bu, Windows 10 x64'te çalışmıyor, bu açılır bir pencere açar "Bu dosyayı nasıl açmak istersiniz?"
Jan

1

Bu sorunun halihazırda Windows’a özgü mükemmel bir çözünürlükle cevaplandırıldığını ve bu nedenle en uyumlu olması gerektiğini biliyorum ve tamamen katılıyorum.

Ayrıca @ splattne'nin yorumuna katılmıyorum (ancak gerçek cevabını değil) - referans verilen diğer konu başlığındaki kararın krediyi hakettiğini söylemek istedim. Bu cevap, komut dosyasını farklı bir kullanıcı (SYSTEM) olarak çalıştırmayı içerir; bu, komut dosyası kök erişimine izin vermenin hemen hemen eşdeğeridir. Ayrıca, ROBOCOPYağ erişimi gerektiren (John Rennie tarafından belirtildiği gibi) işler için başarısız olur .

Daha CMDOWönce hiç denemedim , ancak [Windows'ta yerel olarak yüklü olmasa da] çoğu sürüm için hala oldukça taşınabilir olan ve hem 32, hem de 64 bit sürümlerinde gelen, başka bir benzer çözüm önermek istiyorum. NirCmd .

NirCmd, sayısız seçeneğe sahip çok güçlü bir araçtır. Bunlardan en faydalı olanı, şahsen sadece aşağıdakileri uygulayarak gizli komut pencerelerini açabilmektir:

c:\path\to\nircmd.exe exec hide "c:\path\to\mybat.bat"

Gönderen execbölümünde NirCmd Komut Referansı :

exec [show/hide/min/max] [application + command-line]

Bir uygulamayı çalıştırır ve isteğe bağlı olarak yürütülen uygulama için bir veya daha fazla komut satırı parametresi belirtin. [Show / hide / min / max] parametresi , çalışan uygulamanın görünür olup olmayacağını belirtir. 'Hide' belirtilmişse, çalışan uygulama kullanıcıya görünmez. 'Max' belirtilmişse, çalışan uygulama penceresi büyütülecektir. 'Min' belirtilirse, çalışan uygulama penceresi simge durumuna küçültülür.

EDIT: Bir ROBOCOPYişi çalıştırmaya çalışıyordum ve bu cevaptaki yöntemi denedim ve ağ erişim ayrıcalıklarını düzenledikten sonra bile çalışmadı. Komut dosyasını çift tıklamayı denedim ve çalışmasını sağlayamadım, ancak yalnızca yükseltilmiş bir komut istemi altında çalışmasını sağlayabilirim. Toplu iş dosyasına bir kısayol oluşturdum ve Yönetici olarak çalıştırmasını sağladım ve çift tıklatarak çalıştırmayı başarabildim, ancak sona erdirdiğim yöntem SİSTEM olarak gizlenmiş olarak çalıştırmaktı (biliyorum, biliyorum) - ancak ROBOCOPYtoplu iş dosyası doğru izinlere sahip olduğu sürece, buna değer.

2 EDIT: bazı nedenlerden dolayı, SYSTEM (muhtemelen daha önce başvurulan ağ erişim şey) olarak çalışmayacaktı - Ben sadece ROBOCOPY/ L bayrağı olmadan çalıştıktan sonra fark ettim , temelde sadece bir simülasyon ve [görünüşte] aslında uzaktaki sisteme bağlanıyorum, ancak toplu iş dosyasını en yüksek ayrıcalıklara sahipken çalıştırdığımda ve gizli kutuyu işaretlediğimde ve arka planda oturum açmış kullanıcı olarak çalıştırabilirim. .



-2

Toplu iş dosyanızın sonuna bir çıkış komutu yerleştirmeyi deneyin. Bu komut dosyası tamamlandığında komut penceresini kapatmalıdır.


-2

Çıktıyı gizlemek için (pencerede olmasa da), bunu toplu iş dosyanızın başına ekleyin:

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