Windows XP atau yang lebih baru Windows: Bagaimana cara menjalankan file batch di latar belakang tanpa jendela yang ditampilkan?

121

Saya tahu saya telah menjawab pertanyaan serupa ( Menjalankan File Batch di latar belakang saat windows boot ), tetapi kali ini saya perlu meluncurkan batch:

  • dari kelompok lain,
  • tanpa jendela konsol yang ditampilkan,
  • dengan semua argumen yang diteruskan ke kumpulan tak terlihat.

Batch pertama dijalankan di jendela konsol. Namun, saya tidak ingin batch kedua (diluncurkan oleh yang pertama secara asinkron ) juga menampilkan jendela konsol.

Saya telah membuat skrip VBScript yang melakukan hal itu, dan saya menempatkan skrip sebagai jawaban untuk dirujuk orang lain , tetapi jika Anda memiliki ide / solusi lain, silakan berkontribusi.

Catatan: Jendela konsol dari prosesor perintah Windows dinamai jendela DOS yang tidak benar oleh banyak orang.


Terima kasih atas jawabannya. Dari apa yang saya pahami, jika saya perlu memanggil skrip secara asinkron untuk berjalan dalam mode tak terlihat:

  • Dari skrip kedua yang sudah ada di jendela konsol, start /bsudah cukup.
  • Dari Windows, tanpa memicu jendela kedua , solusi saya masih valid.
VonC
sumber
Anda meluncurkan file batch dari file batch LAIN? Apakah file batch yang sudah berjalan ini memiliki jendela?
Oddthinking
Ya, batch (pertama) lainnya ini dijalankan di jendela DOS. Namun, saya tidak ingin batch kedua (diluncurkan oleh yang pertama dengan cara asynchronous) juga menampilkan jendela (yang akan terjadi dengan perintah 'start / b')
VonC

Jawaban:

53

Apakah Anda memerlukan file batch kedua untuk berjalan secara asynchronous? Biasanya satu file batch menjalankan file lainnya secara sinkron dengan filecall perintah, dan yang kedua akan membagikan jendela yang pertama.

Anda dapat menggunakan start /b second.bat untuk meluncurkan file batch kedua secara sinkron dari jendela pertama yang membagikan jendela pertama Anda. Jika kedua file batch menulis ke konsol secara bersamaan, hasilnya akan tumpang tindih dan mungkin tidak dapat terbaca. Juga, Anda ingin meletakkan exitperintah di akhir file batch kedua Anda, atau Anda akan berada dalam cmdshell kedua setelah semuanya selesai.

P Ayah
sumber
1
Benar. Saya percaya start / b akan membuka jendela baru, tetapi jika dijalankan dari jendela DOS, itu berbagi jendela yang sama.
VonC
110

Berikut adalah solusi yang mungkin:

Dari skrip pertama Anda, panggil skrip kedua Anda dengan baris berikut:

wscript.exe invis.vbs run.bat %*

Sebenarnya, Anda memanggil skrip vbs dengan:

  • [path] \ nama skrip Anda
  • semua argumen lain yang dibutuhkan oleh skrip Anda ( %*)

Kemudian, invis.vbs akan memanggil skrip Anda dengan metode Windows Script Host Run () , yang membutuhkan:

  • intWindowStyle: 0 berarti "jendela tak terlihat"
  • bWaitOnReturn: false berarti skrip pertama Anda tidak perlu menunggu skrip kedua selesai

Inilah 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
VonC
sumber
3
2k penayangan dan pos + jawaban yang luar biasa, lebih banyak orang harus memilih utas ini
Ric Tokyo
Solusi Hebat, persis yang saya butuhkan.
nikhil
Satu-satunya masalah adalah ini menciptakan proses bernama "cmd.exe", yang sulit ditemukan di masa mendatang.
Aditya Gupta
12

Ubah file batch menjadi file exe. Coba Bat To Exe Converter atau Online Bat To Exe Converter , dan pilih opsi untuk menjalankannya sebagai aplikasi hantu, yaitu tanpa jendela.

Rob Kam
sumber
3
Mungkin, tetapi saya akan mencoba menghindari langkah tambahan dalam hal ini.
VonC
21
Saya biasanya tidak begitu paranoid tetapi bukankah sangat bodoh membiarkan seseorang tanpa nama menghasilkan exe itu untuk saya? Semua jenis hal berbahaya bisa disuntikkan.
Tobias
9

Saya pikir ini adalah solusi termudah dan terpendek untuk menjalankan file batch tanpa membuka jendela DOS, ini bisa sangat mengganggu ketika Anda ingin menjadwalkan serangkaian perintah untuk dijalankan secara berkala, sehingga jendela DOS terus muncul, inilah solusi Anda . Gunakan VBS Script untuk memanggil file batch ...

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

Salin baris di atas ke editor dan simpan file dengan ekstensi .VBS. Edit nama dan jalur file .BAT yang sesuai.

indago
sumber
1
Pendekatan yang menarik, tentu lebih pendek dari solusi saya. +1
VonC
Solusi bagus. Membaca ini, saya perhatikan tidak ada yang benar-benar perlu digunakan Set WshShell = Nothing, berfungsi dengan baik untuk saya dan Anda dapat memiliki cara yang lebih kecil untuk melakukannya.
Patrick Bard
7

Berikut adalah kumpulan cara saya untuk mencapainya - dan bahkan lebih - jika memungkinkan, saya juga telah mencoba mengembalikan PID dari proses yang dimulai (semua skrip yang ditautkan dapat diunduh dan disimpan dengan nama apa pun yang menurut Anda nyaman):

1) IEXPRESS Solusi dapat digunakan bahkan pada mesin win 95/98 lama. Iexpress adalah alat yang sangat kuno yang masih dikemas dengan Windows - karena argumen hanya menerima perintah dan argumennya.

Contoh penggunaan:

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

2) SCHTASKS - Sekali lagi hanya menerima dua argumen - perintah dan argumen. Juga periksa apakah itu dimulai dengan izin yang ditinggikan dan jika mungkin dapatkan PID dari proses dengan WEVTUTIL (tersedia dari Vista dan di atasnya sehingga versi windows yang lebih baru akan menerima PID).

Contoh penggunaan:

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

3) 'WScript.Shell' - skrip adalah pembungkus penuh dari 'WScript.Shell' dan setiap opsi yang memungkinkan dapat diatur melalui opsi baris perintah. Ini adalah jscript / batch hybrid dan dapat disebut sebagai kelelawar.

Contoh penggunaan (untuk info lebih lanjut cetak bantuan dengan '-h'):

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

4) 'Win32_ProcessStartup' - sekali lagi pembungkus penuh dan semua opsi dapat diakses melalui argumen baris perintah. Kali ini WSF / batch hybrid dengan beberapa Jscript dan beberapa potongan kode VBScript - tetapi mengembalikan PID dari proses yang dimulai. tidak tersembunyi beberapa opsi seperti koordinat X / Y dapat digunakan (tidak berlaku untuk setiap eksekusi - tetapi misalnya cmd.exe menerima koordinat).

Contoh penggunaan (untuk info lebih lanjut cetak bantuan dengan '-h'):

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

5) Itu. Solusi NET . Sebagian besar opsi opsi ProcessStartInfo digunakan (tetapi pada akhirnya saya terlalu lelah untuk memasukkan semuanya):

Contoh penggunaan (untuk info lebih lanjut cetak bantuan dengan '-h'):

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

Di pertanyaan lain saya menyarankan autoexnt . Itu juga mungkin dalam situasi ini. Cukup setel layanan untuk dijalankan secara manual (bukan otomatis saat startup). Ketika Anda ingin menjalankan batch Anda, ubah file autoexnt.bat untuk memanggil file batch yang Anda inginkan, dan mulai layanan autoexnt.

Batchfile untuk memulai ini, bisa terlihat seperti ini (belum diuji):

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

Perhatikan bahwa file batch yang dimulai dengan cara ini dijalankan sebagai pengguna sistem, yang berarti Anda tidak memiliki akses ke jaringan bersama secara otomatis. Tapi Anda bisa menggunakan net use untuk menyambung ke server jauh.

Anda harus mengunduh Kit Sumber Daya Windows 2003 untuk mendapatkannya. Resource Kit juga dapat diinstal di versi windows lain, seperti Windows XP.

wimh
sumber
1
Menarik, tapi terlalu berlebihan untuk skenario ini.
VonC
2

Jalankan dengan nama pengguna yang berbeda, menggunakan "runas" atau dengan menjadwalkannya di bawah pengguna lain di Tugas Terjadwal Windows.

JosephStyons
sumber
Mungkin, tetapi tidak persis seperti yang saya cari (panggilan asinkron langsung di latar belakang)
VonC
0

Anda dapat menjalankan file .bat Anda melalui file .vbs.
Salin kode berikut ke file .vbs Anda:

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 
Vinod Chelladurai
sumber
0

Anda juga bisa menggunakan

start /MIN notepad.exe

PS: Sayangnya, status jendela yang diminimalkan tergantung pada perintah untuk dijalankan. VG tidak bekerja

start /MIN calc.exe
pengguna2928048
sumber