Có một số cách thực hiện các lệnh khác nhau trên bashvà cmdcùng một tập lệnh.
cmdsẽ bỏ qua các dòng bắt đầu bằng :;, như đã đề cập trong các câu trả lời khác. Nó cũng sẽ bỏ qua dòng tiếp theo nếu dòng hiện tại kết thúc bằng lệnh rem ^, vì ^ký tự sẽ thoát khỏi ngắt dòng và dòng tiếp theo sẽ được coi là nhận xét bởirem .
Đối với việc bashbỏ qua các cmddòng, có nhiều cách. Tôi đã liệt kê một số cách để làm điều đó mà không vi phạm các cmdlệnh:
#Lệnh không tồn tại (không được khuyến nghị)
Nếu không có #lệnh nào khả dụng cmdkhi chạy tập lệnh, chúng ta có thể thực hiện việc này:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Ký #tự ở đầu cmddòng bashcoi dòng đó như một nhận xét.
Ký #tự ở cuối bashdòng được dùng để nhận xét về \rnhân vật, như Brian Tompsett đã chỉ ra trong câu trả lời của mình . Nếu không có điều này, bashsẽ gây ra lỗi nếu tệp có \r\nphần cuối dòng, được yêu cầu bởi cmd.
Bằng cách đó # 2>nul, chúng tôi đang lừa cmdđể bỏ qua lỗi của một số #lệnh không tồn tại , trong khi vẫn thực hiện lệnh sau đó.
Không sử dụng giải pháp này nếu có một #lệnh có sẵn trên PATHhoặc nếu bạn không có quyền kiểm soát các lệnh có sẵn cmd.
Sử dụng echođể bỏ qua #ký tự trêncmd
Chúng tôi có thể sử dụng echovới đầu ra của nó được chuyển hướng để chèn cmdcác lệnh vào bashkhu vực đã nhận xét của:
echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Vì #ký tự không có ý nghĩa đặc biệt trên cmd, nó được coi là một phần của văn bản echo. Tất cả những gì chúng ta phải làm là chuyển hướng đầu ra của echolệnh và chèn các lệnh khác sau nó.
#.batTệp trống
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
Các echo >/dev/null # 1>nul 2> #.batdòng tạo ra một sản phẩm nào #.battập tin trong khi trên cmd(hoặc thay thế hiện có #.bat, nếu có), và không có gì trong khi trên bash.
Tệp này sẽ được sử dụng bởi cmd(các) dòng theo sau ngay cả khi có một số #lệnh khác trên PATH.
Các del #.batlệnh trên cmdđang cụ thể xóa các tập tin đã được tạo ra. Bạn chỉ phải làm điều này ở cmddòng cuối cùng .
Không sử dụng giải pháp này nếu #.battệp có thể nằm trong thư mục làm việc hiện tại của bạn, vì tệp đó sẽ bị xóa.
Khuyến nghị: sử dụng here-document để bỏ qua cmdcác lệnh trênbash
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
Bằng cách đặt ^ký tự ở cuối cmddòng, chúng ta đang thoát khỏi dấu ngắt dòng và bằng cách sử dụng :làm dấu phân cách ở đây tài liệu, nội dung dòng phân cách sẽ không có tác dụng cmd. Bằng cách đó, cmdsẽ chỉ thực hiện dòng của nó sau khi :dòng kết thúc, có cùng hành vi như bash.
Nếu bạn muốn có nhiều dòng trên cả hai nền tảng và chỉ thực thi chúng ở cuối khối, bạn có thể thực hiện điều này:
:;( #
:; echo 'Hello' #
:; echo 'bash!' #
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
Miễn là không có cmddòng chính xác here-document delimiter, giải pháp này sẽ hoạt động. Bạn có thể thay đổi here-document delimiterthành bất kỳ văn bản nào khác.
Trong tất cả các giải pháp đã trình bày, các lệnh sẽ chỉ được thực thi sau dòng cuối cùng , làm cho hành vi của chúng nhất quán nếu chúng thực hiện cùng một điều trên cả hai nền tảng.
Các giải pháp đó phải được lưu vào tệp có dấu \r\nngắt dòng, nếu không chúng sẽ không hoạt động cmd.