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 foo
và 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^ bar
sẽ 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" "bar
sản xuất foo" "bar
hoặ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ì cd
khô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
, %3
và 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 cd
chỉ (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, cd
có 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 bar
sau khi chúng tôi cắt bớt "
ký tự. cd
Tác giả chắc cũng đã nhận ra điều này ... nếu chúng ta suy ra cd
hà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