2010-11-11 21 views
7

Tôi có một số câu hỏi về chủ đề, dấu phẩy so với không gian, trong các tham số phân định.cmd- dấu phẩy để phân tách các tham số So với không gian?

Họ là những câu hỏi mà các lập trình viên C quen thuộc với dấu nhắc cmd, có thể ném một số ánh sáng trên ..

Tôi biết rằng khi làm

c:\>program a b c 

có 4 thông số [0]=program[1]=a[2]=b[3]=c

Theo hh ntcmds.chm khái niệm ..

Shell tổng quan

; and , are used to separate parameters 

; or , command1 parameter1;parameter2 Use to separate command parameters. 

tôi thấy dir a,b cho kết quả tương tự như dir a b

nhưng

c:\>program a,b,c cho thông số [0] = chương trình [1] = a, b, c

Vì vậy, làm một số? hoặc tất cả? cửa sổ lệnh sử dụng; và,? và đó là giải thích trong mã của mỗi lệnh, hoặc được thực hiện bởi vỏ như với không gian?

Và nếu nó nằm trong mã của mỗi lệnh .. làm cách nào tôi biết sẽ làm điều đó? Tôi nhận thấy rằng tài liệu về explorer.exe đề cập đến dấu phẩy, ví dụ: bạn có thể làm explorer /e,.

nhưng DIR /? không đề cập đến nó, nhưng có thể sử dụng nó. Và một chương trình c điển hình không mất, như một dấu phân cách ở tất cả .. Vì vậy, nó là trường hợp vỏ không sử dụng dấu phẩy để phân định, nó sử dụng không gian. Và các cửa sổ lệnh làm, làm như vậy 'cos họ là (tất cả?) Bằng văn bản để delimit các tham số vỏ đã cho họ thêm khi dấu phẩy được sử dụng?

Trả lời

4

Có hai sự khác biệt ở đây giữa Unix và Windows:

  • lệnh nội bộ như DIR được xây dựng vào vỏ; cú pháp dòng lệnh của họ không phải tuân thủ các quy tắc tương tự như đối với các chương trình thông thường
  • Trên Windows, các chương trình chịu trách nhiệm phân tích cú pháp dòng lệnh của riêng chúng. Trình phân tích cú pháp chuyển hướng và đường ống, sau đó chuyển phần còn lại của dòng lệnh cho chương trình trong một chuỗi

Các chương trình Windows C được xây dựng bằng Visual Studio sử dụng trình phân tích cú pháp dòng lệnh trong thời gian chạy Microsoft C, tương tự như trình phân tích cú pháp shell Unix điển hình và tuân thủ các dấu cách và dấu ngoặc kép.

Tôi chưa bao giờ thấy chương trình C sử dụng , hoặc ; làm dấu tách dòng lệnh. Tôi đã biết trường hợp đặc biệt cho explorer /e,., nhưng tôi chưa bao giờ thấy ví dụ dir a,b cho đến lúc này.

+0

Làm thế nào bạn có thể nói những gì được thực hiện bởi trình bao, và những gì được thực hiện bởi thời gian chạy MS C hoặc lib chuẩn? Tôi có một cửa sổ c prog chỉ với #include Ở trên cùng, và mã để hiển thị argv. biên dịch với gcc.I không thể nhìn thấy một cách tôi có thể nhìn thấy "tham số hóa" được thực hiện từ vỏ và đó là tự động từ thư viện tiêu chuẩn. Ngoài ra, tôi nhận thấy dấu phẩy không làm việc cho các chương trình bên ngoài xcopy hoặc telnet. Tôi nghĩ rằng tôi đã nhìn thấy nó cho rundll32. Tôi đoán nó chỉ là một số. Không phải là một chức năng trong một thư viện công khai! Có lẽ chỉ có các chương trình ext đặc biệt làm nó aping cmds nội bộ của cmd.exe – barlop

+0

Mọi thứ được thực hiện bởi thời gian chạy MS C ngoại trừ chức năng shell. Chức năng Shell bao gồm những thứ như chuyển hướng ('<', '>', vv '>>'), đường ống ('|'), điều khiển luồng ('&&' và '||') và thoát ('^'). Như tôi đã nói, tôi chưa bao giờ thấy một chương trình sử dụng ',' trên dòng lệnh, vì vậy tôi không ngạc nhiên rằng bản sao và telnet không hỗ trợ nó. –

+0

bạn có gợi ý thời gian chạy ms c không phân định dấu cách và dấu ngoặc kép không? hoặc là vẫn còn vỏ? và nếu đó là thời gian chạy ms c, bạn có thể chứng minh điều đó không? Tôi không thấy làm thế nào điểm đạn thứ hai của bạn là phân biệt unix và cửa sổ 'cos sẽ không unix vỏ cũng phân tích cú pháp chuyển hướng và đường ống. – barlop

0

Tệp hàng loạt sử dụng dấu phẩy hoặc dấu chấm phẩy làm dấu tách đối số thay thế.

Kiểm tra tập tin thực thi:

@echo %1/%2/%3 

Chạy thử:

> test.cmd 1,2,3 
1/2/3 
> test.cmd 1;2 3 
1/2/3 

Và, như bạn lưu ý, dir sử dụng nó, copy cũng - những đều vỏ built-in và có lẽ chạy qua một trình phân tích cú pháp tương tự như các tệp bó (cũng không chính xác như nhau, vì bạn có thể làm những việc như cd.. hoặc dir/s mà không thể thực hiện được cho bất kỳ thứ gì khác). Tôi đoán (lưu ý: suy đoán) đây là một số loại tương thích ngược trở lại vào DOS hoặc thậm chí CP/M ngày. Ngày nay bạn có lẽ chỉ nên sử dụng không gian. Và như ghi chú Tim, thời gian chạy C chỉ ra một số điều nhất định về các đối số và cách chúng được cho là được phân tích cú pháp. Nhiều ngôn ngữ/khuôn khổ khác tuân theo quy ước đó nhưng không nhất thiết phải tất cả. Ví dụ PowerShell có xử lý đối số hoàn toàn khác và đôi khi có thể là một sự ngạc nhiên khi tương tác với các chương trình gốc từ bên trong nó (được nói, các lệnh và các hàm PowerShell không có chương trình nào có thể thực thi được ở nơi khác, nhưng các tệp theo lô tương tự).

+1

bạn đã viết "Lệnh ghép ngắn PowerShell và chức năng không có chương trình nào có thể chạy được ở nơi khác, nhưng các tệp theo lô tương tự" sẽ không phải là không, và bị xóa? tập tin batch như bạn nói, tương tự như vậy, không thể chạy từ PowerShell, vì vậy tôi không thấy lý do tại sao có một 'nhưng' ở đó. – barlop

Các vấn đề liên quan