Chạy tệp .bat trong tác vụ theo lịch trình mà không có cửa sổ


143

Tôi có một tác vụ theo lịch trình bắt đầu một tập lệnh bó chạy robocopymỗi giờ. Mỗi khi nó chạy một cửa sổ bật lên trên màn hình nền với đầu ra của robocopy, điều mà tôi không thực sự muốn thấy.

Tôi quản lý để làm cho cửa sổ xuất hiện thu nhỏ bằng cách thực hiện công việc theo lịch trình

cmd /c start /min mybat.bat

nhưng điều đó cho tôi một cửa sổ lệnh mới mỗi giờ. Tôi đã rất ngạc nhiên bởi điều này, được đưa ra cmd /c"Thực hiện lệnh được chỉ định bởi chuỗi và sau đó chấm dứt" - Tôi đã hiểu nhầm các tài liệu.

Có cách nào để chạy một tập lệnh bó mà không xuất hiện cửa sổ cmd không?


Tôi thấy đây là một câu trả lời thích hợp hơn stackoverflow.com/questions/6568736/
triệt

Câu trả lời:


144

Thay vào đó, bạn có thể chạy nó một cách im lặng bằng tệp Windows Script. Phương thức Run cho phép bạn chạy một tập lệnh ở chế độ vô hình. Tạo một .vbstệp như thế này

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

và lên lịch cho nó Đối số thứ hai trong ví dụ này đặt kiểu cửa sổ. 0 có nghĩa là "ẩn cửa sổ."

Cú pháp đầy đủ của phương thức Run :

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

Tranh luận:

  • đối tượng: đối tượng WshShell.
  • strCommand: Giá trị chuỗi cho biết dòng lệnh bạn muốn chạy. Bạn phải bao gồm bất kỳ tham số nào bạn muốn chuyển đến tệp thực thi.
  • intWindowStyle: Tùy chọn. Giá trị nguyên cho thấy sự xuất hiện của cửa sổ chương trình. Lưu ý rằng không phải tất cả các chương trình đều sử dụng thông tin này.
  • bWaitOnReturn: Tùy chọn. Giá trị Boolean cho biết liệu tập lệnh có nên đợi chương trình kết thúc thực thi hay không trước khi tiếp tục câu lệnh tiếp theo trong tập lệnh của bạn. Nếu được đặt thành true, thực thi tập lệnh tạm dừng cho đến khi chương trình kết thúc và Run trả về bất kỳ mã lỗi nào được chương trình trả về. Nếu được đặt thành false (mặc định), phương thức Run sẽ trả về ngay sau khi khởi động chương trình, tự động trả về 0 (không được hiểu là mã lỗi).

+1, chỉ cần viết chính xác điều tương tự
Sam Cogan

Tôi đã nhìn thấy nó trước khi bạn xóa nó. Tôi đoán cả hai chúng tôi đều là bot. ;-)
splattne

1
Tên người dùng, tôi thành thật nghĩ rằng Sam xứng đáng với nó nhiều hơn tôi. Nhưng dù sao cũng cảm ơn bạn! Và đừng nhắc đến tôi và Jon Skeet trong cùng một câu. Đó là sự báng bổ! ;-)
splattne

3
Đối với câu hỏi "Có cách nào để chạy tập lệnh bó mà không bật cửa sổ cmd không?", Nó đưa ra một câu trả lời rất trực tiếp: Chạy nó bằng tệp Windows Script.
Đánh dấu Meuer

2
@Lee Tôi đoán dấu ngoặc kép là cần thiết nếu đường dẫn của bạn chứa khoảng trắng.
splattne

58

Bạn đang chạy này như là một nhiệm vụ theo lịch trình? Nếu vậy, thiết lập nó để chạy như một tài khoản người dùng khác thì nó sẽ không hiển thị cho người dùng đã đăng nhập. Nếu tập lệnh không cần truy cập mạng vào các mục cần windows auth (như chia sẻ tệp hoặc máy in), bạn có thể chạy nó dưới dạng "nt thẩm quyền \ system" và để trống mật khẩu. Trên Windows 7, chỉ cần đặt người dùng thành HỆ THỐNG và nhấn OK.

(Bạn có thể phải sử dụng một người dùng thực sự mặc dù nếu bạn đang sử dụng bản sao ...)

JR


3
Cảm ơn - điều này ít gây rắc rối cho tôi hơn tùy chọn .vbs.
mackenir

8
Tôi đặt người dùng "Chạy với tư cách" thành HỆ THỐNG (sau này nó đã thay đổi o NT AUTHORITY \ HỆ THỐNG) và nó hoạt động với tôi. Tôi không còn thấy cửa sổ bật lên CMD khi tác vụ theo lịch trình của tôi chạy. Cảm ơn!
Ryan Stille

1
+1, đây là thanh lịch. Hãy chắc chắn nhập "hệ thống" làm tên người dùng, sau đó win7 sẽ làm phần còn lại cho bạn. Lưu ý rằng bạn KHÔNG có quyền truy cập mạng vào internet, chỉ cần không chia sẻ mạng và những thứ cần windows auth.
samsmith

1
Người dùng hệ thống đơn giản và thanh lịch, TIP tuyệt vời! +1!
Matteo Conta

1
Xem Thực hiện các mô hình hành chính tối thiểu . Việc sử dụng tài khoản Hệ thống cho việc này có vi phạm các chính sách Ít đặc quyền nhất không? Nếu vậy thì quản trị viên nên biết để không làm điều này trong hầu hết các tình huống.
user34660

29

Chỉ cần định cấu hình Tác vụ theo lịch là "Chạy cho dù người dùng có đăng nhập hay không".


6
Hoàn hảo! Bạn thậm chí có thể vô hiệu hóa lưu trữ thông tin xác thực và sau đó điều này sẽ an toàn hơn so với việc HỆ THỐNG chạy nó!
binki

17

Bạn cũng có thể thử CHP (Tạo quy trình ẩn) , thực hiện chính xác những gì bạn nghĩ ...

CHP.EXE mybat.bat

Chạy không có cửa sổ lệnh. Hoàn hảo! Được tạo bởi cùng một người với CMDOW, nhưng điều này phù hợp hơn.


Hoạt động hoàn hảo khi bạn cần chạy tác vụ trong ngữ cảnh của người dùng đã đăng nhập ("Kích hoạt: khi kết nối với phiên người dùng", "Chạy tác vụ như: Người dùng")
Sergei

1
đây không phải là một công cụ tích hợp
JonnyRaa

9

CMDOW là một công cụ tuyệt vời cho phép bạn thực hiện nhiều thao tác trên cửa sổ từ dòng lệnh.

Một trong những điều đơn giản nhất để làm là ẩn cửa sổ hiện tại (thường là dòng đầu tiên trong tệp bat) với:

cmdow @ /hid

hoặc bắt đầu một quy trình ẩn mới với

cmdow /run /hid mybat.bat 

4
Cả đề xuất này và Rocketmonkeys đều liên quan đến việc tải xuống các công cụ mới, có nghĩa là khả năng tương thích nhiều hơn trên các máy tính để bàn khác nhau. Việc nướng trong, sử dụng các lệnh windows là tốt hơn nhiều.
IanVaughan

Cộng với cmdow được phát hiện là "nguy hiểm" bởi một số chương trình chống vi-rút ( không nguy hiểm, nhưng bản thân việc phát hiện có thể gây ra một số vấn đề nếu tệp cmdow bị cách ly ...).
Otiel

3
Vẫn còn giao diện điều khiển popup, chỉ cần flash rất nhanh.
Tre

5

Hãy thử gọi kịch bản với

start /b <command>

1
Điều này không hoạt động, Tác vụ theo lịch trình-> Trạng thái "Không thể bắt đầu", đó là: start / b C: \ file.bat: và: start / b "C: \ file.bat": nhưng: C: \ file.bat: hoạt động tốt.
IanVaughan

1
Bởi vì startkhông phải là một chương trình, nó là một lệnh. Bạn cần chỉ định cmdlà chương trình để chạy và /c start /b <file>làm đối số. Tuy nhiên, điều này vẫn không hoạt động vì nó vẫn sẽ tạo ra một cửa sổ giao diện điều khiển cmdvà flash một cửa sổ màu đen trên màn hình.
Synetech

1
Cũng có thể xác nhận với @Synetech rằng điều này sẽ không tạo ra một cửa sổ mới, nhưng bạn vẫn cần phải mở một cửa sổ giao diện điều khiển để khởi động nó. Đây thực sự là một lệnh tiện dụng, nhưng không thể được sử dụng theo yêu cầu với Tác vụ theo lịch trình.
JonathanDavidArndt

5

Bạn có thể tạo lối tắt cho tệp bó, đặt phím tắt để bắt đầu thu nhỏ (trong thuộc tính của phím tắt, tab 'Phím tắt'), sau đó đặt công việc để bắt đầu phím tắt.

Quan trọng : Bạn sẽ cần chỉ định đường dẫn đến lối tắt theo cách thủ công bằng cách nhập nó vào trường văn bản Run, hoàn thành với phần mở rộng '.lnk'; nếu bạn chỉ cố gắng để duyệt đến nó, nó sẽ helpfully chuyển hướng bản thân đến bất cứ điểm shortcut để.


Điều này không hoạt động trên Windows 10 x64, điều này mang đến một cửa sổ bật lên "Bạn muốn mở tệp này như thế nào?"
Ngày

1

Tôi nhận ra câu hỏi này đã được trả lời với độ phân giải hoàn toàn tốt có nguồn gốc từ Windows và do đó nên tương thích nhất và tôi hoàn toàn đồng ý.

Tôi cũng muốn nói rằng tôi không đồng ý với nhận xét của @ splattne (nhưng không phải là câu trả lời thực tế của anh ấy) - rằng độ phân giải trong chuỗi tham chiếu khác xứng đáng được ghi nhận. Câu trả lời đó liên quan đến việc chạy tập lệnh với tư cách là một người dùng khác (HỆ THỐNG), tương đương với việc cấp quyền truy cập tập lệnh gốc. Nó cũng sẽ thất bại đối với các công việc như ROBOCOPY(như được tham chiếu bởi John Rennie), yêu cầu truy cập mạng.

Tôi chưa bao giờ thử CMDOWtrước đây, nhưng tôi muốn cung cấp một độ phân giải tương tự khác, [mặc dù không được cài đặt trên Windows] vẫn có khả năng di động cao đối với hầu hết các phiên bản, và có cả phiên bản 32 và 64 bit, và đó là Niết bàn .

NirCmd là một công cụ rất mạnh có vô số tùy chọn, trong đó hữu ích nhất, cá nhân tôi nhận thấy khả năng của nó là khởi chạy các cửa sổ lệnh ẩn bằng cách thực hiện như sau:

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

Từ execphần Tham khảo lệnh NirCmd :

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

Chạy một ứng dụng và tùy chọn chỉ định một hoặc nhiều tham số dòng lệnh cho ứng dụng được thực thi. Tham số [show / hide / min / max] chỉ định xem ứng dụng đang chạy có hiển thị hay không. Nếu 'ẩn' được chỉ định, ứng dụng đang chạy sẽ không hiển thị cho người dùng. Nếu 'max' được chỉ định, cửa sổ ứng dụng đang chạy sẽ được tối đa hóa. Nếu 'min' được chỉ định, cửa sổ ứng dụng đang chạy sẽ được thu nhỏ.

EDIT: Tôi đã cố gắng chạy một ROBOCOPYcông việc và thử phương pháp trong câu trả lời này và nó không hoạt động, ngay cả sau khi chỉnh sửa các đặc quyền truy cập mạng. Tôi đã thử bấm đúp vào tập lệnh và không thể làm cho nó hoạt động, nhưng chỉ có thể làm cho nó chạy theo dấu nhắc lệnh nâng cao. Tôi đã tạo một lối tắt đến tệp bó và để nó chạy với tư cách Quản trị viên và có thể thực hiện nó bằng cách nhấp đúp vào nó, nhưng phương pháp mà tôi đã kết thúc là chạy nó ẩn như HỆ THỐNG (tôi biết, tôi biết) - nhưng nó hoạt động với ROBOCOPY, với giá trị của nó, miễn là tệp bó có quyền chính xác.

EDIT 2: Vì một số lý do, nó sẽ không hoạt động như HỆ THỐNG (có thể là điều truy cập mạng được tham chiếu trước đó) - Tôi chỉ nhận thấy điều này sau khi thực sự chạy ROBOCOPYmà không có cờ / L, về cơ bản chỉ là mô phỏng và [rõ ràng] không thực sự kết nối với hệ thống từ xa, nhưng khi tôi chạy tệp bó với các đặc quyền cao nhất và kiểm tra hộp ẩn, và tôi vẫn có thể chạy nó với tư cách là người dùng đã đăng nhập trong nền mà không có cửa sổ lệnh nào hiển thị .



-2

Hãy thử đặt một lệnh thoát ở cuối tệp bó của bạn. Điều này sẽ đóng cửa sổ lệnh khi kịch bản được thực hiện.


-2

Để ẩn đầu ra (mặc dù không phải là cửa sổ), hãy thêm phần này vào phần đầu của tệp bó:

@echo off
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.