たとえば、引用符を付けずにこのコマンドの代わりをすることができます。
CD "c:\Documents and Settings"
引用符を使用したくない完全な理由は、このコマンドが機能することです。
SVN add mypathname\*.*
しかし、このコマンドは機能しません。
SVN add "mypathname\*.*"
問題は、mypathnameをスペースで囲まれたパスに変更するときに、全体を引用する必要があることです。例えば:
SVN add "c:\Documents and Settings\username\svn\*.*"
しかし、これを試すと、次のようなエラーメッセージが表示されます。
svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found
ほとんどすべてうまくいきますが、おそらく5行目を試してみましたか。キャレット記号でスペースをエスケープします(^)。
1 C:\Documents and Settings\user>cd ..
2 C:\Documents and Settings>cd ..
3 C:\>cd Documents and Settings
4 C:\Documents and Settings>cd..
5 C:\>cd Documents^ and^ Settings
6 C:\Documents and Settings>cd..
7 C:\>cd C:\documents and settings
8 C:\Documents and Settings>cd..
9 C:\>
またはキャレットが本当にすべての違いを生むところの下で。
キャレット記号があなたの答えかもしれないように下から見てください。
1 C:\>"c:\Documents and Settings\a.bat"
gaga
2 C:\>c:\Documents and Settings\a.bat
'c:\Documents' is not recognized as an internal or external command,
operable program or batch file.
3 C:\>c:\Documents^ and^ Settings\a.bat
gaga
C:\>
場所の一部だけに引用符を入れるとうまくいくことがわかりました。あなたの場合:
SVN add C:\"Documents and Settings"\username\svn\*.*
これは引用符を使用しますが、注意すべき重要なことはアスタリスクが引用符の外側にあるので正しく機能することです。
それが機能するという幻想を与えている答えにもかかわらず、事実はあなたが通常の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の通常の引数を1つの論理引数に結合するのと同じことをしているためです。標準を渡すcmd引数によると、7つの引数があります。
c:\documents
and
settings
\some
folder
with
spaces
cd
が7つの引数すべてを1つの論理的な引数に結合したかのように、パスを生成する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""""""""""
を生成します。
上記のすべての例には1つの類似点があります。それは、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
短いファイル名はそよ風のように働くようです。
"E:\ Progra〜1\Java\Eclipse\eclipse.exe" -vmargs -Xms1024m -Xmx2048m
メモリを増やすために..;)
8.3形式の短いファイル名を使用してください。例えば:
If exist c:\docume~1 goto :Ifoundthesucker
8.3置換について話している人にとって、この2つのことを知っていましたか。
そのため、c:\docume~1
は以下を指すことができます。
短縮名を取得してアトミック操作で使用しない限り、安全ではありません。
それは彼らが変わることは非常に珍しいことであると言ったが、それは彼らが存在しないことは非常に一般的です。
8.3が特定のフォルダ/ファイルに存在するかどうかを知りたい場合は、dirコマンドでparamenter/Xを使用してテストするか、またはその部分のみを取得するためにforでカプセル化してください。
NTFSで8.3を有効/無効にする方法の詳細については、M $ webを参照してください。
@Pangの投稿をフォローし、ショートネームと落とし穴について議論している他の人たちが、ロングネームをショートネームに動的に解決する方法を次に示します。
for %A in ("C:\Some\long path\which must exist\to be resolved") do @echo %~sA
その後、明らかに引用符を囲むのではなく、短い名前を使用できます。