Jalankan file .bat dalam tugas yang dijadwalkan tanpa jendela

143

Saya memiliki tugas yang dijadwalkan yang memulai skrip batch yang berjalan robocopysetiap jam. Setiap kali menjalankan jendela muncul di desktop dengan output robocopy, yang saya tidak ingin melihat.

Saya berhasil membuat jendela tampak diminimalkan dengan membuat pekerjaan yang dijadwalkan berjalan

cmd /c start /min mybat.bat

tapi itu memberi saya jendela perintah baru setiap jam. Saya terkejut dengan ini, diberikan cmd /c"Melakukan perintah yang ditentukan oleh string dan kemudian berakhir" - Saya pasti telah salah mengerti dokumen.

Apakah ada cara untuk menjalankan skrip batch tanpa muncul jendela cmd?

Tom Dunham
sumber
Saya menemukan ini jawaban yang lebih disukai stackoverflow.com/questions/6568736/…
Efekt

Jawaban:

144

Anda bisa menjalankannya diam-diam menggunakan file Windows Script sebagai gantinya. Metode Jalankan memungkinkan Anda menjalankan skrip dalam mode tidak terlihat. Buat .vbsfile seperti ini

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

dan jadwalkan. Argumen kedua dalam contoh ini menetapkan gaya jendela. 0 berarti "sembunyikan jendela."

Sintaks lengkap dari metode Run :

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

Argumen:

  • objek: objek WshShell.
  • strCommand: Nilai string yang menunjukkan baris perintah yang ingin Anda jalankan. Anda harus memasukkan parameter apa pun yang ingin Anda sampaikan ke file yang dapat dieksekusi.
  • intWindowStyle: Opsional. Nilai integer yang menunjukkan tampilan jendela program. Perhatikan bahwa tidak semua program memanfaatkan informasi ini.
  • bWaitOnReturn: Opsional. Nilai Boolean yang menunjukkan apakah skrip harus menunggu program untuk menyelesaikan eksekusi sebelum melanjutkan ke pernyataan berikutnya dalam skrip Anda. Jika disetel ke true, eksekusi skrip berhenti hingga program selesai, dan Run mengembalikan kode kesalahan apa pun yang dikembalikan oleh program. Jika disetel ke false (default), metode Run kembali segera setelah memulai program, secara otomatis mengembalikan 0 (tidak ditafsirkan sebagai kode kesalahan).
percikan
sumber
+1, hanya menulis hal yang persis sama
Sam Cogan
Saya melihatnya sebelum Anda menghapusnya. Saya kira kita berdua bot. ;-)
splattne
1
nama pengguna, saya benar-benar berpikir bahwa Sam layak mendapatkannya lebih dari saya. Tapi terima kasih! Dan jangan menyebut saya dan Jon Skeet dalam kalimat yang sama. Itu penistaan! ;-)
splattne
3
Untuk pertanyaan "Apakah ada cara untuk menjalankan skrip batch tanpa muncul jendela cmd?", Itu memberikan jawaban yang sangat langsung: Jalankan dengan menggunakan file Windows Script.
Mark Meuer
2
@Lee Saya kira tanda kutip ganda diperlukan jika jalur Anda berisi spasi.
splattne
58

Apakah Anda menjalankan ini sebagai tugas yang dijadwalkan? Jika demikian atur agar dijalankan sebagai akun pengguna yang berbeda maka itu tidak akan terlihat oleh pengguna yang masuk. Jika skrip tidak memerlukan akses jaringan ke item yang memerlukan auth windows (seperti berbagi file atau printer), Anda dapat menjalankannya sebagai "nt authority \ system" dan biarkan kata sandi kosong. Pada Windows 7, cukup atur pengguna ke SYSTEM, dan tekan OK.

(Anda mungkin harus menggunakan pengguna nyata jika Anda menggunakan robocopy ...)

JR

John Rennie
sumber
3
Terima kasih - ini kurang merepotkan saya daripada opsi .vbs.
mackenir
8
Saya mengatur pengguna "Jalankan sebagai" ke SISTEM (yang kemudian diubah o NT AUTHORITY \ SYSTEM) dan itu berhasil untuk saya. Saya tidak lagi melihat jendela CMD popup ketika tugas terjadwal saya berjalan. Terima kasih!
Ryan Stille
1
+1, ini elegan. Pastikan untuk memasukkan "sistem" sebagai nama pengguna, lalu win7 melakukan sisanya untuk Anda. Perhatikan bahwa Anda TIDAK mendapatkan akses jaringan ke internet, hanya saja tidak ke jaringan berbagi dan hal-hal yang memerlukan auth windows.
samsmith
1
Pengguna sistem sederhana dan elegan, TIP hebat! +1!
Matteo Conta
1
Lihat Menerapkan Model Administratif Least-Privilege . Apakah penggunaan akun Sistem untuk ini merupakan pelanggaran kebijakan Least-Privilege? Jika demikian maka administrator harus tahu untuk tidak melakukan ini dalam kebanyakan situasi.
user34660
29

Cukup konfigurasikan Tugas Terjadwal sebagai "Jalankan apakah pengguna masuk atau tidak".

Peter Meinl
sumber
6
Sempurna! Anda bahkan dapat menonaktifkan penyimpanan kredensial dan kemudian ini menjadi lebih aman daripada SISTEM menjalankannya!
binki
17

Anda juga dapat mencoba CHP (Buat proses tersembunyi) , melakukan persis seperti yang Anda pikirkan ...

CHP.EXE mybat.bat

Berjalan tanpa jendela perintah. Sempurna! Dibuat oleh orang yang sama dengan CMDOW, tetapi ini lebih tepat.

kunci roket
sumber
Bekerja dengan sempurna ketika Anda perlu menjalankan tugas dalam konteks pengguna yang masuk ("Pemicu: terhubung ke sesi pengguna", "Jalankan tugas sebagai: Pengguna")
Sergei
1
ini bukan alat
bawaan
9

CMDOW adalah alat awsome yang memungkinkan Anda melakukan banyak, banyak hal untuk windows dari baris perintah.

Salah satu hal paling sederhana yang harus dilakukan adalah menyembunyikan jendela saat ini (biasanya sebagai baris pertama dalam file bat) dengan:

cmdow @ /hid

atau memulai proses tersembunyi baru dengan

cmdow /run /hid mybat.bat 
itsadok
sumber
4
Baik saran ini maupun saran Rocketmonkeys melibatkan pengunduhan alat baru, yang berarti lebih banyak kompatibilitas pada berbagai desktop orang. Dipanggang, menggunakan perintah windows jauh lebih baik.
IanVaughan
Plus cmdow dideteksi sebagai "berbahaya" oleh beberapa program anti-virus ( tidak berbahaya, tetapi deteksi itu sendiri dapat menyebabkan beberapa masalah jika file cmdow dikarantina ...).
Otiel
3
masih ada konsol popup, cukup flash sangat cepat.
Bambu
5

Coba gunakan skrip dengan

start /b <command>

sumber
1
Ini tidak bekerja, Status Terjadwal-> Status menyatakan "Tidak dapat memulai", itu dengan: start / b C: \ file.bat: dan: start / b "C: \ file.bat": tetapi: C: \ file.bat: berfungsi dengan baik.
IanVaughan
1
Karena startbukan program, itu adalah perintah. Anda perlu menentukan cmdsebagai program untuk dijalankan dan /c start /b <file>sebagai argumen. Namun, ini masih tidak akan berhasil karena masih akan membuat jendela konsol untuk cmddan mem-flash jendela hitam di layar.
Synetech
1
Dapat juga mengonfirmasi dengan @Synetech bahwa ini tidak akan membuat jendela baru, tetapi Anda masih harus membuka jendela konsol untuk memulainya. Ini memang perintah praktis, tetapi tidak dapat digunakan seperti yang diminta dengan Tugas Terjadwal.
JonathanDavidArndt
5

Anda dapat membuat pintasan ke file kumpulan, mengatur pintasan untuk mulai diminimalkan (di properti pintasan, tab 'Pintasan'), dan kemudian mengatur pekerjaan untuk memulai pintasan.

Penting : Anda harus menentukan jalur ke pintasan secara manual dengan mengetiknya di bidang Run text, lengkap dengan ekstensi '.lnk'; jika Anda hanya mencoba menjelajahinya, itu akan sangat membantu mengarahkan dirinya sendiri ke jalan pintas apa pun yang ditunjuk.

Doug Kavendek
sumber
Ini tidak berfungsi pada Windows 10 x64, ini memberikan sembulan "Bagaimana Anda ingin membuka file ini?"
Jan
1

Saya menyadari pertanyaan ini telah dijawab dengan resolusi yang sangat baik yang asli untuk Windows dan karenanya harus yang paling kompatibel, dan saya setuju sepenuhnya.

Saya juga ingin mengatakan bahwa saya tidak setuju dengan komentar @ splattne (tetapi bukan jawaban aktualnya) - bahwa resolusi di utas referensi lainnya layak mendapatkan pujian. Jawaban itu melibatkan menjalankan skrip sebagai pengguna yang berbeda (SYSTEM), yang hampir setara dengan memberikan akses root skrip. Ini juga akan gagal untuk pekerjaan seperti ROBOCOPY(sebagaimana dirujuk oleh John Rennie), yang memerlukan akses jaringan.

Saya belum pernah mencoba CMDOWsebelumnya, tetapi saya ingin menawarkan resolusi lain yang serupa, yang [walaupun tidak diinstal pada Windows] masih sangat portabel untuk sebagian besar versi, dan tersedia dalam versi 32 dan 64-bit, dan itu adalah NirCmd .

NirCmd adalah alat yang sangat kuat yang memiliki banyak sekali opsi, yang paling berguna, saya secara pribadi menemukan kemampuannya untuk meluncurkan jendela perintah tersembunyi dengan hanya menjalankan yang berikut:

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

Dari execbagian Referensi Perintah The NirCmd :

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

Menjalankan aplikasi, dan secara opsional tentukan satu atau lebih parameter baris perintah untuk aplikasi yang dieksekusi. Parameter [show / hide / min / max] menentukan apakah aplikasi yang berjalan akan terlihat atau tidak. Jika 'sembunyikan' ditentukan, aplikasi yang sedang berjalan tidak akan terlihat oleh pengguna. Jika 'maks' ditentukan, jendela aplikasi yang sedang berjalan akan dimaksimalkan. Jika 'min' ditentukan, jendela aplikasi yang berjalan akan diminimalkan.

EDIT: Saya mencoba menjalankan ROBOCOPYpekerjaan dan mencoba metode dalam jawaban ini, dan itu tidak berhasil, bahkan setelah mengedit hak akses jaringan. Saya mencoba mengklik dua kali skrip dan tidak bisa berfungsi, tetapi hanya bisa menjalankannya di bawah command prompt yang ditinggikan. Saya memang membuat jalan pintas ke file batch dan menjalankannya sebagai Administrator dan bisa menjalankannya dengan mengklik dua kali, tetapi metode yang akhirnya saya jalankan adalah menjalankannya disembunyikan sebagai SISTEM (saya tahu, saya tahu) - tetapi itu bekerja dengan baik ROBOCOPY, untuk apa nilainya, selama file batch memiliki izin yang benar.

EDIT 2: Untuk beberapa alasan, itu tidak akan berfungsi sebagai SISTEM (mungkin hal akses jaringan yang dirujuk sebelumnya) - Saya hanya memperhatikan ini setelah benar-benar berjalan ROBOCOPYtanpa flag / L, yang pada dasarnya hanya simulasi dan [tampaknya] tidak sebenarnya terhubung ke sistem jarak jauh, tetapi ketika saya menjalankan file batch dengan hak istimewa tertinggi dan memeriksa kotak tersembunyi, dan saya masih bisa menjalankannya sebagai pengguna yang login di latar belakang tanpa jendela perintah yang menunjukkan, untuk apa pun ini layak untuk siapa pun .

rubynorails
sumber
-2

Coba masukkan perintah keluar di akhir file batch Anda. Ini harus menutup jendela perintah ketika skrip selesai.

Brian S. Wilson
sumber
-2

Untuk menyembunyikan output (meskipun bukan jendela), tambahkan ini ke awal file batch Anda:

@echo off
batal
sumber