Windows XP trở lên Windows: Làm cách nào để chạy một tệp hàng loạt trong nền mà không có cửa sổ nào được hiển thị?


121

Tôi biết tôi đã trả lời một câu hỏi tương tự ( Chạy tệp Batch trong nền khi cửa sổ khởi động ), nhưng lần này tôi cần khởi chạy một loạt:

  • từ một lô khác,
  • mà không có bất kỳ cửa sổ bảng điều khiển nào được hiển thị,
  • với tất cả các đối số được chuyển đến lô vô hình.

Lô đầu tiên được thực hiện trong một cửa sổ giao diện điều khiển. Tuy nhiên, tôi không muốn đợt thứ hai (được khởi chạy bởi đợt thứ nhất theo cách không đồng bộ ) cũng hiển thị cửa sổ bảng điều khiển.

Tôi đã nghĩ ra một kịch bản VBScript làm được điều đó và tôi đặt kịch bản này như một câu trả lời để những người khác tham khảo , nhưng nếu bạn có ý tưởng / giải pháp khác, hãy đóng góp.

Lưu ý: Cửa sổ giao diện điều khiển của bộ xử lý lệnh Windows được nhiều người đặt tên không thực sự đúng là cửa sổ DOS.


Cảm ơn tất cả mọi người vì đã trả lời. Theo những gì tôi hiểu, nếu tôi cần gọi một tập lệnh không đồng bộ để chạy ở chế độ ẩn:

  • Từ một tập lệnh thứ hai đã có trong cửa sổ bảng điều khiển, start /blà đủ.
  • Từ Windows, không cần kích hoạt cửa sổ thứ hai , giải pháp của tôi vẫn hợp lệ.

Bạn đang khởi chạy tệp lô từ một tệp lô KHÁC? Tệp hàng loạt đã chạy này có cửa sổ không?
Oddthinking

Có, lô khác (đầu tiên) này được thực thi trong cửa sổ DOS. Tuy nhiên, tôi không muốn lô thứ hai (khởi chạy bởi lô thứ nhất theo cách không đồng bộ) cũng hiển thị một cửa sổ (điều này sẽ xảy ra với lệnh 'start / b')
VonC

Câu trả lời:


53

Bạn có cần tệp lô thứ hai chạy không đồng bộ không? Thông thường, một tệp hàng loạt chạy một tệp khác đồng bộ vớicall lệnh và thứ hai sẽ chia sẻ cửa sổ của đầu tiên.

Bạn có thể sử dụng start /b second.bat để khởi động một tập tin batch thứ hai một đồng bộ từ đó cổ phiếu cửa sổ đầu tiên của bạn đầu tiên của bạn. Nếu cả hai tệp hàng loạt ghi đồng thời vào bảng điều khiển, đầu ra sẽ bị chồng chéo và có thể không thể giải mã được. Ngoài ra, bạn sẽ muốn đặt một exitlệnh ở cuối tệp lô thứ hai của mình hoặc bạn sẽ ở trong trình cmdbao thứ hai sau khi mọi thứ hoàn tất.


1
Chính xác. Tôi tin rằng start / b sẽ mở một cửa sổ mới, nhưng nếu được thực thi từ một cửa sổ DOS, nó sẽ chia sẻ cùng một cửa sổ.
VonC

110

Đây là một giải pháp khả thi:

Từ tập lệnh đầu tiên của bạn, hãy gọi tập lệnh thứ hai với dòng sau:

wscript.exe invis.vbs run.bat %*

Trên thực tế, bạn đang gọi một tập lệnh vbs với:

  • [đường dẫn] \ tên tập lệnh của bạn
  • tất cả các đối số khác mà script của bạn cần ( %*)

Sau đó, invis.vbs sẽ gọi tập lệnh của bạn bằng phương thức Windows Script Host Run () , thực hiện:

  • intWindowStyle: 0 có nghĩa là "cửa sổ vô hình"
  • bWaitOnReturn: false nghĩa là tập lệnh đầu tiên của bạn không cần đợi tập lệnh thứ hai của bạn hoàn thành

Đây là 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
2k quan điểm và những gì một lớn + bài đăng của câu trả lời, nhiều người nên được lên bầu chủ đề này
Ric Tokyo

Giải pháp tuyệt vời, chính xác những gì tôi cần.
nikhil

Vấn đề duy nhất là điều này tạo ra một quá trình có tên "cmd.exe", rất khó tìm thấy trong tương lai.
Aditya Gupta

12

Chuyển đổi tệp hàng loạt thành exe. Hãy thử Bat To Exe Converter hoặc Online Bat To Exe Converter , và chọn tùy chọn để chạy nó dưới dạng ứng dụng ma, tức là không có cửa sổ.


3
Có thể, nhưng tôi sẽ cố gắng tránh bất kỳ bước bổ sung nào trong trường hợp này.
VonC

21
Tôi thường không hoang tưởng như vậy nhưng sẽ rất ngu ngốc khi để ai đó ẩn danh tạo exe đó cho tôi? Tất cả các loại nội dung độc hại có thể được đưa vào.
Tobias

9

Tôi nghĩ đây là giải pháp dễ nhất và ngắn nhất để chạy một tệp hàng loạt mà không cần mở cửa sổ DOS, nó có thể rất mất tập trung khi bạn muốn lên lịch một nhóm lệnh để chạy định kỳ, vì vậy cửa sổ DOS liên tục bật lên, đây là giải pháp của bạn. . Sử dụng VBS Script để gọi tệp loạt ...

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

Sao chép các dòng ở trên vào trình chỉnh sửa và lưu tệp với phần mở rộng .VBS. Chỉnh sửa tên tệp .BAT và đường dẫn cho phù hợp.


1
Cách tiếp cận thú vị, chắc chắn ngắn hơn giải pháp của tôi. +1
VonC

Giải pháp tuyệt vời. Đọc điều này, tôi nhận thấy rằng không thực sự cần thiết phải sử dụng Set WshShell = Nothing, làm việc tốt cho tôi và bạn có thể có một cách thậm chí còn nhỏ hơn để làm điều đó.
Patrick Bard

7

Đây là bộ sưu tập của tôi về các cách để đạt được điều đó - và thậm chí hơn thế nữa - nếu có thể, tôi đã cố gắng trả lại cả PID của quá trình bắt đầu (tất cả các tập lệnh được liên kết có thể được tải xuống và lưu với bất kỳ tên nào bạn thấy thuận tiện):

1) Giải pháp IEXPRESS có thể sử dụng ngay cả trên các máy win 95/98 cũ. Iexpress là một công cụ thực sự cổ xưa vẫn được đóng gói với Windows - vì các đối số chỉ chấp nhận lệnh và các đối số của nó.

Ví dụ sử dụng:

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

2) NHIỆM VỤ - Một lần nữa chỉ chấp nhận hai đối số - lệnh và đối số, đồng thời kiểm tra xem nó có được bắt đầu với quyền nâng cao hay không và nếu có thể, hãy lấy PID của quá trình với WEVTUTIL (khả dụng từ Vista trở lên, do đó phiên bản windows mới hơn sẽ nhận được Lệnh PID).

Ví dụ sử dụng:

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

3) 'WScript.Shell' - tập lệnh là trình bao bọc đầy đủ của 'WScript.Shell' và mọi tùy chọn khả thi đều có thể được thiết lập thông qua các tùy chọn dòng lệnh. Nó là một kết hợp jscript / batch và có thể được gọi là một con dơi.

Cách sử dụng ví dụ (để biết thêm thông tin, hãy in trợ giúp với '-h'):

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

4) 'Win32_ProcessStartup' - một lần nữa trình bao bọc đầy đủ và tất cả các tùy chọn đều có thể truy cập được thông qua các đối số dòng lệnh. không ẩn một số tùy chọn như tọa độ X / Y có thể được sử dụng (không áp dụng cho mọi tệp thực thi - nhưng ví dụ: cmd.exe chấp nhận tọa độ).

Cách sử dụng ví dụ (để biết thêm thông tin, hãy in trợ giúp với '-h'):

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

5) Các. Giải pháp NET . Hầu hết các tùy chọn của tùy chọn ProcessStartInfo đều được sử dụng (nhưng cuối cùng tôi đã quá mệt mỏi để bao gồm mọi thứ):

Cách sử dụng ví dụ (để biết thêm thông tin, hãy in trợ giúp với '-h'):

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

2

Trong câu hỏi khác, tôi đã đề xuất autoexnt . Điều đó cũng có thể xảy ra trong tình huống này. Chỉ cần đặt dịch vụ để chạy theo cách thủ công (tức là không tự động khi khởi động). Khi bạn muốn chạy lô của mình, hãy sửa đổi tệp autoexnt.bat để gọi tệp lô bạn muốn và khởi động dịch vụ autoexnt.

Tệp lô để bắt đầu điều này, có thể trông như thế này (chưa được kiểm tra):

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

Lưu ý rằng các tệp hàng loạt bắt đầu theo cách này sẽ chạy với tư cách là người dùng hệ thống, có nghĩa là bạn không có quyền truy cập vào mạng chia sẻ tự động. Nhưng bạn có thể sử dụng mạng để kết nối với máy chủ từ xa.

Bạn phải tải xuống Bộ tài nguyên Windows 2003 để có được nó. Bộ tài nguyên cũng có thể được cài đặt trên các phiên bản cửa sổ khác, chẳng hạn như Windows XP.


1
Thật thú vị, nhưng quá mức cần thiết cho kịch bản này.
VonC

2

Chạy nó dưới một tên người dùng khác, sử dụng "runas" hoặc bằng cách lên lịch nó cho một người dùng khác trong Tác vụ theo lịch trình của Windows.


Có thể, nhưng không chính xác những gì tôi đang theo đuổi (cuộc gọi không đồng bộ trực tiếp trong nền)
VonC

0

Bạn có thể chạy tệp .bat của mình thông qua tệp .vbs
Sao chép mã sau vào tệp .vbs của bạ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

Bạn cũng có thể sử dụng

start /MIN notepad.exe

PS: Thật không may, tình trạng cửa sổ thu nhỏ phụ thuộc vào lệnh chạy. VG không hoạt động

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