この答えを見ていると、まるで動作しているかのように錯覚してしまいますが、実際には、通常の 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