it-swarm-vi.tech

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

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 robocopy mỗ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 đã ngạc nhiên về đ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?

144
Tom Dunham

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 .vbs tập tin 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 chạy :

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

Đối số:

  • đố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).
145
splattne

Bạn đang chạy này như là một nhiệm vụ theo lịch trình? Nếu vậy, đặt 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

59
John Rennie

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".

29
Peter Meinl

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 như CMDOW, nhưng điều này phù hợp hơn.

18
rocketmonkeys

CMDOW là một công cụ tuyệt vời cho phép bạn thực hiện nhiều, nhiều thứ cho các 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 
9
itsadok

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

start /b <command>
5
rashfeather

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ẽ một cách hữu ích tự chuyển hướng đến bất cứ điều gì các phím tắt trỏ đến.

5
Doug Kavendek

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ử CMDOW trước đây, nhưng tôi muốn cung cấp một độ phân giải tương tự khác, mà [mặc dù không được cài đặt trên Windows] vẫn có tính 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- phiên bản bit và đó là NirCmd .

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ừ phần exec của Tham chiếu 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/ ẩn /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 đã thử chạy một công việc ROBOCOPY và đã thử phương thức 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 lệnh nâng cao Nhắc. 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 ROBOCOPY 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 có thể vẫn 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 hiển thị, cho bất cứ điều gì điều này có giá trị với bất cứ ai.

1
rubynorails

Một giải pháp khác tôi đã sử dụng là Ẩn bắt đầ

0
SteveC