Mặc dù các câu trả lời cho ảo tưởng rằng nó hoạt động, thực tế là bạn không thể lẻn vào không gian vào các đối số cmd thông thường. Điều này rất dễ chứng minh:
Lưu " echo %1" như test.bat. Tệp bó này sẽ xuất đối số đầu tiên mà cmd vượt qua chúng ta.
Bây giờ, hãy thử và chạy test.bat, thiết lập giá trị của %1để foo bar. (Lưu ý rằng có một khoảng trống giữa foovà bar.)
Thử và sai trong vài năm và nhận ra rằng không có cách nào để làm điều đó . Mọi người sẽ đề nghị thoát bằng cách sử dụng ^, nhưng test.bat foo^ barsẽ không xuất ra foo bar.
Vì vậy, không có cách nào để có được đầu ra foo bar, và gần nhất chúng ta có thể nhận được là chạy test.bat foo" "barsản xuất foo" "barhoặc chạy test.bat "foo bar"sản xuất "foo bar".
Bây giờ, lý do các câu trả lời khác xuất hiện để làm việc là vì cdkhông riêng của nó phân tích cú pháp bổ sung, phân kỳ từ hành vi của các đối số thường đi qua (như thường lệ %1, %2, %3và vv trong các tập tin batch điển hình).
Ví dụ, hãy xem xét lệnh đặc biệt:
cd c:\documents and settings \some folder with spaces
Tại sao nó hoạt động? Điều này là do cd bản thân nó đang làm một cái gì đó tương đương với việc nối 7 đối số thông thường thành một đối số hợp lý. Theo các đối số cmd vượt qua các chỉ tiêu, chúng ta thấy 7 đối số:
c:\documents
and
settings
\some
folder
with
spaces
Dường như cdđã kết hợp tất cả 7 đối số thành một đối số hợp lý, thực hiện một cái gì đó tương tự array.join(" "), tạo ra đường dẫn:
c:\documents and settings \some folder with spaces
Lưu ý rằng hành vi này là đặc biệt cdchỉ (và một số chức năng khác). Nó không có gì để làm với thông qua tranh luận thông thường.
Thật vậy, cdcó một đặc thù khác. Hãy nhớ rằng chúng tôi đã nêu ở trên rằng chúng tôi không thể có được đầu ra foo bar? Đầu ra gần nhất mà chúng ta có thể nhận được là bằng cách chạy:
test.bat foo" "bar
mà sản xuất foo" "bar, hoặc:
test.bat "foo bar"
mà sản xuất "foo bar", hoặc:
test.bat "foo "bar
mà sản xuất "foo "bar, hoặc:
test.bat foo" bar"
mà sản xuất foo" bar", hoặc:
test.bat "foo b"ar
mà sản xuất "foo b"ar, hoặc:
test.bat fo"o bar"
mà sản xuất fo"o bar", hoặc:
test.bat fo"o ba"r
mà sản xuất fo"o ba"r, hoặc:
test.bat "fo"o" bar"
mà sản xuất "fo"o" bar", hoặc:
test.bat "f""o""o"" ""b""a""r":
mà sản xuất "f""o""o"" ""b""a""r", hoặc thậm chí:
test.bat """"f"""o""""o"" ""ba"""r"""""""""":
mà sản xuất """"f"""o""""o"" ""ba"""r"""""""""".
Tất cả các ví dụ trên có một điểm tương đồng, đó là chúng sẽ tạo ra foo barsau khi chúng tôi cắt bớt "ký tự. cdTác giả chắc cũng đã nhận ra điều này ... nếu chúng ta suy ra cdhành vi kỳ dị của nó, loại bỏ tất cả những "gì nó nhận được , cho phép tất cả các lệnh này hoạt động:
cd c:\documents and settings
cd "c:\documents and settings"
cd "c:"\"documents and settings"
cd c:\"documents" "and" "settings"
cd c:\"docu"ments an"d set"tings"
cd c:"\"docu"ments an"d set"ti"""ngs
cd "c"":""\"docu"ments an"d set"ti"""ngs
cd "c"":""\"do""cu"me"nts a"n""d set"ti"""ngs
cd c"""":""""\"""d"""oc""""u"me"""""nt"s a"n""d set"""""""ti""""ngs