この答えを見ていると、まるで動作しているかのように錯覚してしまいますが、実際には、通常の cmd の引数にスペースをこっそり入れることはできません。これを証明するのは簡単だ。echo %1 “を”test.bat “として保存する。このバッチファイルは、cmdが渡した最初の引数を出力します。では、test.batの値を%1に設定して、foo barを実行してみてください。(fooとbarの間にスペースcharがあるので注意)
- 数年間試行錯誤して、**方法がないことに気づく。庶民は
^を使って逃げることを提案してくるが、それでもtest.bat foo^ barはfoo barを出力しない。
だから、出力されたfoo barを得る方法がなく、一番近いのは、test.bat foo" "barを生成するfoo" "barを実行するか、test.bat "foo bar"を生成する"foo bar"を実行することだ。
さて、他の答えが pearpear で動作する理由は、通常の引数渡し(典型的なバッチファイルの通常の cd, %1, %2, %3 など)の動作から発散して、 cd が独自の追加の解析を行うからです。これは、c:\documents 自身が7つの通常の引数を1つの論理的な引数に結合することと同等のことをしているからです。cmd 引数の通過基準によると、7 つの引数があります:
and
まるで、settingsが7つの引数を1つの論理的なものに結合したかのように、\someと似たようなことをして、次のようなパスを生成しています:
cd c:\documents and settings \some folder with spaces
この動作は、**007だけに特有のものであることに注意してください* (他の関数も)。これは通常の引数渡しとは何の関係もありません。
確かに、folderにはもう一つの特殊性があります。上で「withの出力が得られない」と述べたのを覚えていますか?私達が得てもいい最も近い出力は動くことによってある:
c:\documents and settings \some folder with spaces
はspacesを作り出すか、または:
test.bat foo" "bar
はcdを作り出すか、または:
test.bat "foo bar"
はarray.join(" ")を作り出すか、または:
test.bat "foo "bar
はcdを作り出すか、または。または: cdを作り出す
test.bat foo" bar"
、または: foo barを作り出す
test.bat "foo b"ar
、または: foo" "barを作り出す
test.bat fo"o bar"
、または: "foo bar"を作り出す
test.bat fo"o ba"r
test.bat "fo"o" bar"
。
上記のすべての例には 1 つの類似性があり、それは "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"
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