Làm cách nào để chạy tệp dơi trong nền từ tệp dơi khác?


91

Tôi có một tập lệnh "thiết lập" mà tôi chạy vào buổi sáng để khởi động tất cả các chương trình mà tôi cần. Bây giờ một số trong số đó cần thiết lập môi trường bổ sung, vì vậy tôi cần bọc chúng trong các tập lệnh BAT nhỏ.

Làm cách nào để chạy tập lệnh như vậy trên Windows XP ở chế độ nền?

CALL env-script.bat chạy nó một cách đồng bộ, tức là tập lệnh thiết lập chỉ có thể tiếp tục sau khi lệnh trong env-script đã kết thúc.

START/B env-script.bat chạy một phiên bản CMD.exe khác trong cùng một dấu nhắc lệnh, khiến nó ở trạng thái thực sự lộn xộn (tôi thấy đầu ra của CMD.exe lồng nhau, bàn phím bị chết trong một thời gian, tập lệnh không được thực thi).

START/B CMD env-script.batmang lại kết quả tương tự. Không có cờ nào trong CMD có vẻ phù hợp với hóa đơn của tôi.

Câu trả lời:


72

Trên thực tế, những điều sau đây hoạt động tốt đối với tôi và tạo các cửa sổ mới:

test.cmd:

@echo off
start test2.cmd
start test3.cmd
echo Foo
pause

test2.cmd

@echo off
echo Test 2
pause
exit

test3.cmd

@echo off
echo Test 3
pause
exit

Kết hợp điều đó với các tham số start, chẳng hạn như /minMoshe đã chỉ ra nếu bạn không muốn các cửa sổ mới xuất hiện trước mặt mình.


1
Được rồi, điều này hoạt động nhưng không hoàn hảo 100%: Sau khi tôi nhấn "QUAY LẠI" trong "Thử nghiệm 2", cửa sổ đó không đóng. Có ý kiến ​​gì không?
Aaron Digulla

Bạn có thể thêm "lối ra" vào các lô đã tạo để đóng chúng lại sau đó. Xin lỗi, đã không kiểm tra xa như vậy :)
Joey

trên thực tế, start script1.bat \ n start script2.bat \ n start scriptN.bat là đủ đối với tôi
andrej

142

Hai tuổi, nhưng để hoàn thiện ...

Phương pháp tiếp cận nội tuyến, tiêu chuẩn: (tức là hành vi bạn sẽ có khi sử dụng &trong Linux)

START /B CMD /C CALL "foo.bat" [args [...]]

Lưu ý: 1. CALLđược ghép nối với tệp .bat vì nó thường đi đến đâu .. (tức là Đây chỉ là phần mở rộng của CMD /C CALL "foo.bat"biểu mẫu để làm cho nó không đồng bộ. Thông thường, cần phải lấy đúng mã thoát, nhưng đó không phải là vấn đề đây.); 2. Dấu ngoặc kép xung quanh tệp .bat chỉ cần thiết nếu tên chứa khoảng trắng. (Tên có thể là một đường dẫn trong trường hợp đó có nhiều khả năng xảy ra hơn.).

Nếu bạn không muốn đầu ra:

START /B CMD /C CALL "foo.bat" [args [...]] >NUL 2>&1

Nếu bạn muốn bat được chạy trên một bảng điều khiển độc lập: (tức là một cửa sổ khác)

START CMD /C CALL "foo.bat" [args [...]]

Nếu bạn muốn cửa sổ khác hoạt động sau đó:

START CMD /K CALL "foo.bat" [args [...]]

Lưu ý: Đây thực sự là biểu mẫu kém trừ khi bạn có người dùng muốn sử dụng cửa sổ đã mở như một bảng điều khiển bình thường. Nếu bạn chỉ muốn cửa sổ chạy xung quanh để xem kết quả đầu ra, tốt hơn hết bạn nên đặt dấu chấm PAUSEở cuối tệp dơi. Hoặc thậm chí, hãy thêm ^& PAUSEvào sau dòng lệnh:

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE

10
&là một toán tử "và sau đó" (thuật ngữ?). (ví dụ: cmd1 & cmd2nghĩa là do "cmd1" và sau đó là "cmd2". Không giống như &&toán tử, việc thực thi "cmd2" không phụ thuộc vào việc thoát thành công "cmd1".) Lệnh ^thoát &để nó đi vào các đối số của CMD thay vì bị tiêu thụ và chạy bởi cùng một bảng điều khiển đã chạy START.
antak

Điều này rất hữu ích, cảm ơn. Tôi vừa định chuyển một số tập lệnh sang Linux, vì các hướng dẫn khác startcmdkhông cung cấp đầy đủ chức năng mà tôi tìm kiếm. Câu trả lời của bạn đóng đinh nó.
Lặp lại

3
Nếu bạn không muốn đầu ra thì chuyển hướng phải được thoát để nó được chuyển đến CMD. Cũng CALL là không cần thiết:START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
dbenham

1
@dbenham: Mặc dù những gì bạn đang nói có lý, nhưng START /B "" CMD /C PING 127.0.0.1 >NULdường như hoạt động bất chấp và không có gì là đầu ra. (Có thể là do các xử lý I / O CMDkế thừa START.) Tôi đoán sự khác biệt là nếu bạn muốn giữ STARTnguyên đầu ra (lỗi) của nó, đó có lẽ là một ý kiến ​​hay. CALLchỉ ở đó bởi vì tôi cảm thấy đó là một thực tiễn tốt để giữ. (ví dụ: Không sử dụng CALLcho đồng bộ các cuộc gọi dơi sẽ dẫn đến mã lối ra không thể đoán trước, vì vậy tôi luôn cặp cuộc gọi dơi với CALLngay cả khi nó không áp dụng nghiêm ngặt, chẳng hạn như trong trường hợp này.)
antak

7

Vì START là cách duy nhất để thực thi một thứ gì đó ở chế độ nền từ tập lệnh CMD, tôi khuyên bạn nên tiếp tục sử dụng nó. Thay vì sửa đổi / B, hãy thử / MIN để cửa sổ mới tạo không làm phiền bạn. Ngoài ra, bạn có thể đặt mức độ ưu tiên thấp hơn với / LOW hoặc / BELOWNORMAL, điều này sẽ cải thiện khả năng phản hồi hệ thống của bạn.


-1 Vấn đề là START không tạo một cửa sổ mới khi bạn khởi động một tệp BAT; thay vào đó, nó sử dụng lại cửa sổ hiện tại và trộn I / O hai quy trình CMD.
Aaron Digulla

4
Nó không tạo một cửa sổ mới vì bạn đang sử dụng cờ / B. Loại bỏ nó.
Moshe

5

Khác với thuật ngữ tiền cảnh / hậu cảnh. Một cách khác để ẩn cửa sổ đang chạy là thông qua vbscript, nếu nó vẫn còn trong hệ thống của bạn.

DIM objShell
set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("yourcommand.exe", 0, TRUE)

Đặt tên cho nó là sth.vbs và gọi nó từ dơi, đưa vào nhiệm vụ bị loại bỏ, v.v. Cá nhân tôi sẽ vô hiệu hóa vbs mà không cần vội vàng ở bất kỳ hệ thống Windows nào mà tôi quản lý :)


Đối với trường hợp sử dụng cụ thể của tôi, điều này thực sự là giải pháp duy nhất mà tôi có thể nhận được để làm việc ...
Ben

0

Tạo một ứng dụng Windows C # mới và gọi phương thức này từ main:

public static void RunBatchFile(string filename)
{
    Process process = new Process();

    process.StartInfo.FileName = filename;

    // suppress output (command window still gets created)
    process.StartInfo.Arguments = "> NULL";

    process.Start();
    process.WaitForExit();
}

2
Uhm ... Tôi đã hy vọng rằng một cái gì đó đơn giản như vậy sẽ không cần cài đặt Visual Studio ...
Aaron Digulla

1
Cho đến khi PowerShell khả dụng 100% - C # thực sự quá mức cần thiết.
jim

2
Aaron: Trình biên dịch C # được bao gồm trong .NET Framework 2, vì vậy bạn có thể chỉ cần chỉnh sửa một số mã trong trình soạn thảo văn bản và biên dịch nó. Tuy nhiên, vì điều này hoàn toàn có thể xảy ra trong một tệp hàng loạt, tôi cũng muốn nói rằng C # là quá mức cần thiết.
Joey

0

Điều này hoạt động trên cài đặt Windows XP Home của tôi, theo cách Unix:

call notepad.exe & 

7
Tôi nghĩ điều này chỉ hoạt động một cách ngẫu nhiên, và & không cần thiết.
Sam Watkins

2
Yeah, notepad.exe không đồng bộ để bắt đầu.
antak

0

Trên thực tế là khá dễ dàng với tùy chọn này ở cuối:

c: \ start BATCH.bat -WindowStyle Hidden


lệnh Windows startkhông có -WindowStyletùy chọn.
Stephan

@Stephan Arreed. Đường dẫn kỳ lạ ( C:` instead of C: \ Windows`) gợi ý rằng anh ta đã tìm thấy một công cụ ở đâu đó trên Internet và sao chép vào ổ cứng của mình.
Aaron Digulla
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.