Có Windows CMD tương đương với exec của Unix shell không?


9

Có bất kỳ tương đương nào trong "exec" của Windows với Unix Shell không? Về cơ bản, tôi cần tránh tạo ra một quy trình mới, để các ống đầu vào / đầu ra được bảo tồn, cũng như quá trình id.

Biên tập:

Vì vậy, đây là vấn đề của tôi. Tôi có một quy trình A bắt đầu một tập lệnh và tập lệnh này kết thúc bằng cách thực hiện một quy trình B. Tôi cần cho A để có được tất cả đầu ra của B, cũng như có thể giết B bằng cách giết quá trình mà nó đã sinh ra (tập lệnh) .

Trên Unix, thực thi B với execcông việc đó.


Không có tương đương, ít nhất là không sử dụng các lệnh và chương trình Windows tiêu chuẩn.
John Gardeniers

Nếu bạn đang cố chạy một tệp thực thi, thay vì một tệp bó khác, không có cách nào (được hỗ trợ / thực tế) để làm việc này. Tuy nhiên, các ống đầu vào / đầu ra thường được kế thừa bởi các ứng dụng chạy trong một tệp bó. Nếu bạn có thể mô tả lý do tại sao bạn muốn làm điều này, chúng tôi có thể đề xuất các lựa chọn thay thế.
Harry Johnston

Quá trình A sẽ nhận được tất cả đầu ra của B, trừ khi tập lệnh ghi đè lên điều này. Đây không phải là làm việc?
Harry Johnston

Có thể sử dụng API Win32 để sắp xếp một tiến trình con sẽ chết khi tiến trình cha mẹ thực hiện, tuy nhiên không có tùy chọn dòng lệnh tích hợp AFAIK. Nếu tôi cung cấp một số mã nguồn (cho Visual C ++), bạn có thể xây dựng nó không?
Harry Johnston

@ Tôi khai thác tập lệnh từ Java, vì vậy, nếu ý tưởng dành cho quy trình A sử dụng API Win32 đó, tôi e rằng điều đó không thể hoạt động, mặc dù tôi rất biết ơn vì nỗ lực này. Tốt hơn là chỉ giải thích điều đó là không thể, và tôi sẽ chấp nhận đó là câu trả lời.
Daniel C. Sobral

Câu trả lời:


7

AFAIK không có. Windows thiếu execv()đó là cách bash exec thực hiện. callhoạt động để gọi các tệp bó (dễ dàng, chỉ cần diễn giải tệp trong trình thông dịch hiện tại, tương tự như .lệnh của bash ) nhưng không phải cho exes.

Điều này làm cho không thể viết các tập lệnh bao bọc một lớp cho các tập lệnh bằng bất kỳ ngôn ngữ nào trên Windows. Bạn sẽ luôn nhận được rằng "Chấm dứt công việc hàng loạt?" tào lao trên Ctrl + C và giết tiến trình hàng loạt (không phải với Ctrl + C, từ trình quản lý tác vụ nói) sẽ không giết tiến trình con. Bây giờ tôi đang tìm kiếm một tệp mẫu C để thực hiện gói này.

CẬP NHẬT: Windows có _execv()lớp tương thích POSIX của nó trong MSVCRT, nhưng AFAIK (chưa thử nghiệm) nó chỉ là một trình bao bọc xung quanh CreateProcessnên nó sẽ luôn tạo ra một quy trình mới, nó không thể thay thế quy trình hiện tại.


2

Tôi nghĩ rằng cuộc gọi làm những gì bạn muốn, nhưng tôi không chắc chắn 100%.


4
Nếu bạn muốn chạy một tệp bó từ tệp khác, mà không khởi chạy phiên bản mới của cmd.exe, cuộc gọi là câu trả lời đúng.
Harry Johnston

1

Bạn có thể xây dựng một lệnh bó động và thực hiện nó dựa trên đầu ra của các hoạt động trước đó. Tôi không chắc đây sẽ là một giải pháp trong trường hợp của bạn, nhưng đoạn mã sau hoạt động tốt.

SET yourDynamicCommand=SET var=1
%yourDynamicCommand%
ECHO var's value is %var%

điều này không làm bất cứ điều gì giống như exec...
Jakuje

-1
  • Thực thi các tệp bó :call
  • Thực thi exe-files : Không cần lệnh, gọi trực tiếp bằng/path/to/exe/something.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.