Windows XP veya üstü Windows: Bir toplu iş dosyasını arka planda pencere görüntülenmeden nasıl çalıştırabilirim?


121

Benzer bir soruyu zaten yanıtladığımı biliyorum ( Windows önyüklendiğinde Toplu Dosyayı arka planda çalıştırma ), ancak bu sefer bir toplu işlem başlatmam gerekiyor:

  • başka bir partiden
  • herhangi bir konsol penceresi görüntülenmeden,
  • görünmez partiye geçirilen tüm argümanlar ile .

İlk parti bir konsol penceresinde yürütülür. Ancak, ikinci partinin (ilk tarafından eşzamansız bir şekilde başlatılan ) bir konsol penceresi de görüntülemesini istemiyorum .

Tam da bunu yapan bir VBScript betiği buldum ve senaryoyu başkalarının başvurması için bir cevap olarak koydum , ancak başka fikirleriniz / çözümleriniz varsa, katkıda bulunmaktan çekinmeyin.

Not: Windows komut işlemcisinin konsol penceresi, birçok kişi tarafından gerçekten doğru değil DOS penceresi olarak adlandırılmıştır.


Cevaplar için hepinize teşekkür ederim. Anladığım kadarıyla, görünmez bir modda çalıştırmak için eşzamansız olarak bir komut dosyası çağırmam gerekirse:

  • Zaten bir konsol penceresindeki ikinci bir komut dosyasından start /byeterlidir.
  • Windows'tan, ikinci bir pencere tetiklemeden çözümüm hala geçerli.

Toplu iş dosyasını BAŞKA BİR toplu iş dosyasından mı başlatıyorsunuz? Bu zaten çalışan toplu iş dosyasının bir penceresi var mı?
Oddthinking

Evet, bu diğer (ilk) parti bir DOS penceresinde yürütülür. Bununla birlikte, ikinci partinin (eşzamansız bir şekilde ilk tarafından başlatılması) ayrıca bir pencere görüntülemesini istemiyorum (bir 'başlat / b' komutuyla gerçekleşir)
VonC

Yanıtlar:


53

Eşzamansız olarak çalışmak için ikinci toplu iş dosyasına ihtiyacınız var mı? Tipik olarak, bir toplu iş dosyası callkomutla eşzamanlı olarak bir başkasını çalıştırır ve ikincisi, ilkinin penceresini paylaşır.

Sen edebilirsiniz kullanmak start /b second.bat bir ikinci parti dosyasını başlatmak için bir o hisseleri ilk kişinin penceresi birinciden eşzamanlı. Her iki toplu iş dosyası konsola aynı anda yazarsa, çıktı çakışır ve muhtemelen çözülemez. Ayrıca, exitikinci toplu iş dosyanızın sonuna bir komut koymak isteyeceksiniz veya cmdher şey bittiğinde ikinci bir kabuğun içinde olacaksınız .


1
Doğru. Start / b'nin yeni bir pencere açacağına inandım, ancak bir DOS penceresinden çalıştırılırsa aynı pencereleri paylaşır.
VonC

110

İşte olası bir çözüm:

İlk betiğinizden ikinci betiğinizi aşağıdaki satırı ile arayın:

wscript.exe invis.vbs run.bat %*

Aslında, bir vbs betiğini şu şekilde çağırıyorsunuz:

  • komut dosyanızın [yol] \ adı
  • komut dosyanızın ihtiyaç duyduğu diğer tüm argümanlar ( %*)

Ardından, invis.vbs komut dosyanızı Windows Script Host Run () yöntemiyle çağırır ve bu yöntem şunları alır:

  • intWindowStyle: 0, "görünmez pencereler" anlamına gelir
  • bWaitOnReturn: false, ilk betiğinizin ikinci betiğinizin bitmesini beklemesine gerek olmadığı anlamına gelir

İşte invis.vbs:

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False

3
2 bin görüntüleme ve ne harika bir gönderi + yanıt, bu konuya daha fazla insan oy vermeli
Ric Tokyo

Mükemmel Çözüm, tam da ihtiyacım olan şey.
nikhil

Tek sorun, bunun ileride bulunması zor olan "cmd.exe" adlı bir işlem oluşturmasıdır.
Aditya Gupta

12

Toplu iş dosyasını bir exe'ye dönüştürün. Bat To Exe Converter veya Online Bat To Exe Converter'ı deneyin ve onu bir hayalet uygulama, yani pencere olmadan çalıştırma seçeneğini seçin.


3
Mümkün, ancak bu durumda fazladan herhangi bir adımdan kaçınmaya çalışacağım.
VonC

21
Genelde o kadar paranoyak değilim ama isimsiz birinin benim için o exe'yi oluşturmasına izin vermek çok aptalca olmaz mı? Her türlü kötü niyetli şey enjekte edilebilir.
Tobias

9

Bunun, bir toplu iş dosyasını DOS penceresini açmadan çalıştırmanın en kolay ve en kısa çözümü olduğunu düşünüyorum, periyodik olarak çalışacak bir dizi komut programlamak istediğinizde çok rahatsız edici olabilir, bu nedenle DOS penceresi sürekli açılır, işte çözümünüz . Toplu iş dosyasını çağırmak için bir VBS Komut Dosyası kullanın ...

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 
Set WshShell = Nothing 

Yukarıdaki satırları bir düzenleyiciye kopyalayın ve dosyayı .VBS uzantısıyla kaydedin. .BAT dosya adını ve yolunu uygun şekilde düzenleyin.


1
İlginç bir yaklaşım, kesinlikle benim çözümümden daha kısa. +1
VonC

Harika çözüm. Okuma bu ben fark etmiş bulunuyoruz hayır gerçekten kullanımına ihtiyaç vardır Set WshShell = Nothingbenim için para cezası çalıştı ve bunu yapmak için daha da küçük bir yol olabilir.
Patrick Bard

7

İşte bunu başarmanın ve hatta daha fazlasının mümkün olduğu yerlerde, başlatılan sürecin PID'sini de döndürmeye çalıştım (tüm bağlantılı komut dosyaları indirilebilir ve uygun bulduğunuz adla kaydedilebilir):

1) IEXPRESS çözümü, eski win 95/98 makinelerde bile kullanılabilir. Iexpress, argümanlar yalnızca komutu ve onun argümanlarını kabul ettiği için hala Windows ile paketlenmiş olan gerçekten eski bir araçtır.

Örnek kullanım:

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"

2) SCHTASKS - Yine sadece iki argümanı kabul eder - komut ve argümanlar.Ayrıca, yükseltilmiş izinlerle başlatılıp başlatılmadığını ve mümkünse WEVTUTIL ile işlemin PID'sini alıp almadığını kontrol eder (Vista ve üzeri, bu nedenle pencerelerin yeni sürümü, PID) komutu.

Örnek kullanım:

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"

3) 'WScript.Shell' - komut dosyası 'WScript.Shell'in tam sarmalayıcısıdır ve olası her seçenek komut satırı seçenekleri aracılığıyla ayarlanabilir. Bu bir jscript / batch hibritidir ve yarasa olarak adlandırılabilir.

Örnek kullanım (daha fazla bilgi için '-h' ile yardımı yazdırın):

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

4) 'Win32_ProcessStartup' - yine tam sarmalayıcı ve tüm seçeneklere komut satırı argümanları aracılığıyla erişilebilir.Bu sefer bazı Jscript ve bazı VBScript kod parçaları ile WSF / toplu karma - ancak başlatılan işlemin PID'sini döndürür. gizlenmez X / Y koordinatları gibi bazı seçenekler kullanılabilir (her yürütülebilir dosya için geçerli değildir - ancak örneğin cmd.exe koordinatları kabul eder).

Örnek kullanım (daha fazla bilgi için '-h' ile yardımı yazdırın):

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"

5). NET çözümü . ProcessStartInfo seçeneklerinin çoğu kullanılıyor (ama sonunda her şeyi dahil edemeyecek kadar yorgundum):

Örnek kullanım (daha fazla bilgi için '-h' ile yardımı yazdırın):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal

2

Diğer soruda autoexnt'i önerdim . Bu durumda da mümkündür. Sadece servisi manuel olarak çalışacak şekilde ayarlayın (yani başlangıçta otomatik değil). Toplu işinizi çalıştırmak istediğinizde, autoexnt.bat dosyasını istediğiniz toplu iş dosyasını çağıracak şekilde değiştirin ve autoexnt hizmetini başlatın.

Bunu başlatacak toplu iş dosyası şöyle görünebilir (test edilmemiş):

echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat
net start autoexnt

Bu şekilde başlatılan toplu iş dosyalarının sistem kullanıcısı olarak çalıştığını unutmayın; bu, ağ paylaşımlarına otomatik olarak erişiminiz olmadığı anlamına gelir. Ancak uzak bir sunucuya bağlanmak için net kullanımı kullanabilirsiniz .

Almak için Windows 2003 Kaynak Seti'ni indirmeniz gerekir. Kaynak Seti, Windows XP gibi diğer Windows sürümlerine de yüklenebilir.


1
İlginç, ancak bu senaryo için sıkı bir abartma.
VonC

2

Bunu, "runas" kullanarak veya Windows Zamanlanmış Görevler'de farklı bir kullanıcı altında planlayarak farklı bir kullanıcı adı altında çalıştırın.


Mümkün, ancak tam olarak peşinde olduğum şey değil (arka planda doğrudan eşzamansız çağrı)
VonC

0

.Bat dosyanızı bir .vbs dosyası aracılığıyla çalıştırabilirsiniz
Aşağıdaki kodu .vbs dosyanıza kopyalayın:

Dim WshShell
Dim obj
Set WshShell = WScript.CreateObject("WScript.Shell") 
obj = WshShell.Run("C:\Users\file1.bat", 0) 
obj = WshShell.Run("C:\Users\file2.bat", 0)  and so on
set WshShell = Nothing 

0

Ayrıca kullanabilirsiniz

start /MIN notepad.exe

Not: Ne yazık ki, simge durumuna küçültülmüş pencere durumu çalıştırılacak komuta bağlıdır. VG çalışmıyor

start /MIN calc.exe
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.