Một số cách để gọi một tệp loạt cửa sổ từ một tệp khác hoặc từ dấu nhắc. Cái nào trong trường hợp nào?


92

Tệp lô ( called.bathoặc called.cmd) cửa sổ có thể được gọi từ tệp lô ( caller.bathoặc caller.cmd) khác hoặc dấu nhắc cmd.exe tương tác theo một số cách:

  1. gọi trực tiếp: called.bat
  2. sử dụng lệnh gọi: call called.bat
  3. sử dụng lệnh cmd: cmd /c called.bat
  4. sử dụng lệnh bắt đầu: start called.bat

Tôi khá khó phân biệt mục đích sử dụng của chúng dựa trên văn bản trợ giúp: khi nào thì sử dụng cái nào? ví dụ: tại sao tôi có thể sử dụng lệnh 'call' thay vì gọi trực tiếp. Khác biệt là gì?

Tôi quan tâm đến một số báo cáo tóm tắt phân tích tất cả 4 khả năng (và những khả năng khác nếu thiếu) từ các quan điểm khác nhau: các trường hợp sử dụng được đề xuất mà chúng được thiết kế để phù hợp, quá trình sinh sản, bối cảnh thực thi, môi trường, xử lý mã trả về.

Lưu ý: Tôi đang sử dụng Windows XP SP3.

Câu trả lời:


101
  1. Tệp lô sẽ được thực thi bởi phiên bản cmd.exe hiện tại (hoặc một phiên bản cmd.exe mới nếu được nhấp đúp trong Explorer).

  2. Tương tự như # 1, chỉ có tác dụng khi được sử dụng bên trong tệp batch / cmd. Trong một tệp lô, không có 'lệnh gọi', tệp lô mẹ kết thúc và quyền điều khiển được chuyển đến tệp lô được gọi; với 'call' chạy tệp lô con và tệp lô mẹ tiếp tục với các câu lệnh sau cuộc gọi.

  3. Chạy tệp loạt trong phiên bản cmd.exe mới.

  4. Start sẽ chạy tệp loạt trong một phiên bản cmd.exe mới trong một cửa sổ mới và người gọi sẽ không đợi hoàn thành.


7
Lưu ý cho lựa chọn 4, lệnh bắt đầu nên luôn luôn được theo sau bởi một 'danh hiệu' , vì vậy nếu bạn không cần phải có tiêu đề, bạn nên có dấu ngoặc kép trống, ví dụ:start "" [options] command
Daryn

@Daryn liên kết đó chỉ đề cập rằng bạn luôn phải có một liên kết, nhưng thậm chí Microsoft còn nói rằng Microsoft mô tả tham số là tùy chọn. Họ không cho tôi biết tại sao nó phải là "bắt buộc". Thậm chí một số ví dụ của họ ở dưới cùng cũng bỏ qua tham số tiêu đề.
Adam Plocher

5

Một điều không rõ ràng từ các nhận xét ở đây: Khi bạn gọi một tệp loạt từ một tệp khác bằng cách chỉ sử dụng tên của nó (Trường hợp số 1 trong câu hỏi ban đầu), việc thực thi sẽ dừng lại từ tệp lô đang gọi. Ví dụ, trong những dòng sau:

called.bat
echo Hello

Dòng 'echo Hello' (và bất kỳ thứ gì theo sau nó) sẽ không được gọi. Nếu bạn sử dụng từ khóa 'call', việc thực thi sẽ tiếp tục sau cuộc gọi. Vì vậy, trong trường hợp này:

call called.bat
echo Hello

Dòng 'echo Hello' sẽ được gọi.

Ngoài ra, tất cả các biến được đặt trong tệp call.bat cũng sẽ được chuyển trở lại quá trình gọi.

Hãy tưởng tượng một tệp 'call.bat' có dòng này:

set MYVAR=hello

Sau đó,% MYVAR% sẽ có sẵn cho tệp loạt đang gọi nếu nó được sử dụng:

call called.bat

Nhưng, nó sẽ không sử dụng

REM starts a new cmd.exe process
start called.bat   

REM stops and replaces current cmd.exe process with a new one
called.bat        
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.