尽管答案给出了幻象,但事实是您不能在空格中潜入通常的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 c:\documents and settings \some folder with spaces
为什么行得通?这是由于其cd
自身所做的相当于将7个常用参数合并为一个逻辑参数。根据cmd参数传递规范,我们看到7个参数:
c:\documents
and
settings
\some
folder
with
spaces
好像cd
已经将所有7个参数合并为一个逻辑参数,类似于array.join(" ")
,将生成路径:
c:\documents and settings \some folder with spaces
请注意,此行为仅(和某些其他功能)特有cd
。它与通常的参数传递无关。
确实,cd
还有另一个特点。还记得我们上面说过我们无法得到输出foo bar
吗?我们可以得到的最接近的输出是通过运行:
test.bat foo" "bar
产生foo" "bar
,或:
test.bat "foo bar"
产生"foo bar"
,或:
test.bat "foo "bar
产生"foo "bar
,或:
test.bat foo" bar"
产生foo" bar"
,或:
test.bat "foo b"ar
产生"foo b"ar
,或:
test.bat fo"o bar"
产生fo"o bar"
,或:
test.bat fo"o ba"r
产生fo"o ba"r
,或:
test.bat "fo"o" bar"
产生"fo"o" bar"
,或:
test.bat "f""o""o"" ""b""a""r":
产生"f""o""o"" ""b""a""r"
,甚至:
test.bat """"f"""o""""o"" ""ba"""r"""""""""":
产生""""f"""o""""o"" ""ba"""r""""""""""
。
以上所有示例都有一个相似之处,即它们是foo bar
在我们修剪"
字符后生成的。cd
的作者必须意识到了这一点太...如果我们从推断cd
的其特有的行为剪掉所有的"
接收,允许所有这些命令的工作:
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