尽管答案给人以错觉,但事实上,你不能在通常的cmd参数中偷偷加入空格。这很容易证明:
将"echo %1
“保存为test.bat
。这个批处理文件将输出 cmd 传给我们的第一个参数。
现在,尝试运行test.bat
,将%1
的值设置为foo bar
。注意,在foo
和bar
之间有一个空格字符)
试用了几年,发现没有办法。朋友们会建议用^
来逃避,然而test.bat foo^ bar
却不会输出foo bar
,
所以,没有办法输出foo bar
,最接近的就是运行test.bat foo" "bar
产生foo" "bar
,或者运行test.bat "foo bar"
产生"foo bar"
。
现在,其他的答案之所以能起作用,是因为cd
做了它自己的的额外解析,与通常的参数传递行为(典型的批处理文件中通常的%1
、%2
、%3
等)不同。这是由于cd
*本身*做了一些相当于把7个usual参数连成一个逻辑参数的事情。根据cmd参数传递规范,我们可以看到7个参数:
c:\documents
这就好像是and
把所有的7个参数合并为一个逻辑参数,做了类似于settings
的事情,产生了这样的路径:
cd c:\documents and settings \some folder with spaces
注意,这种行为是\some
所特有的****(和其他一些函数)。
事实上,folder
还有一个特殊性。记得我们在上面说过,我们无法得到with
的输出吗?
c:\documents and settings \some folder with spaces
test.bat foo" "bar
test.bat "foo bar"
产生了spaces
,或者:
test.bat "foo "bar
test.bat foo" bar"
产生了cd
,或者:
test.bat "foo b"ar
test.bat fo"o bar"
产生了array.join(" ")
,或者:
test.bat fo"o ba"r
test.bat "fo"o" bar"
产生了cd
,甚至:
test.bat "f""o""o"" ""b""a""r":
产生了cd
。
以上的例子都有一个相似之处,那就是当我们把foo bar
的字符剪掉之后,就会产生foo" "bar
。如果我们从"foo bar"
的奇特行为中推断出剪掉所有接收到的"foo "bar
,那么所有这些命令都可以工作:
foo" bar"
"foo b"ar
fo"o bar"
fo"o ba"r
"fo"o" bar"
"f""o""o"" ""b""a""r"
""""f"""o""""o"" ""ba"""r""""""""""
foo bar
"
cd
cd
"
cd c:\documents and settings
cd "c:\documents and settings"