web-dev-qa-db-ja.com

引用符を使用せずにWindowsでコマンドラインのスペースをエスケープする方法を教えてください。

たとえば、引用符を付けずにこのコマンドの代わりをすることができます。

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
84
David

ほとんどすべてうまくいきますが、おそらく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:\>
52
barlop

場所の一部だけに引用符を入れるとうまくいくことがわかりました。あなたの場合:

SVN add C:\"Documents and Settings"\username\svn\*.*

これは引用符を使用しますが、注意すべき重要なことはアスタリスクが引用符の外側にあるので正しく機能することです。

34
Kit Johnson

それが機能するという幻想を与えている答えにもかかわらず、事実はあなたが通常のcmd引数にスペースをこっそり入れることができないということです。これは証明が簡単です。

  1. "echo %1"をtest.batとして保存します。このバッチファイルはcmdが渡した最初の引数を出力します。

  2. それでは、test.batの値を%1に設定して、foo barを実行してみてください。 (foobarの間にスペースがあることに注意してください。)

  3. 数年間試行錯誤して、それを実行する方法がないことを認識してください。人々は^を使ってエスケープすることを提案するでしょうが、test.bat foo^ barfoo 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つの引数があります。

  1. c:\documents
  2. and
  3. settings
  4. \some
  5. folder
  6. with
  7. 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

23
Pacerier

短いファイル名はそよ風のように働くようです。

"E:\ Progra〜1\Java\Eclipse\eclipse.exe" -vmargs -Xms1024m -Xmx2048m

メモリを増やすために..;)

7
Milorulez

8.3形式の短いファイル名を使用してください。例えば:

If exist c:\docume~1 goto :Ifoundthesucker
3

8.3置換について話している人にとって、この2つのことを知っていましたか。

  • NTFSでは8.3を無効(または有効)に設定することができるので、これらは常に存在するわけではありません。
  • 同じフォルダ上で他のものを作成、名前変更、または削除するだけで、ファイル/フォルダの名前を8.3に変更することはできません。

そのため、c:\docume~1は以下を指すことができます。

  • どこにもありません(無効)
  • 欲しいフォルダ
  • 他のフォルダ
  • 時間とともに可変フォルダ

短縮名を取得してアトミック操作で使用しない限り、安全ではありません。

それは彼らが変わることは非常に珍しいことであると言ったが、それは彼らが存在しないことは非常に一般的です。

8.3が特定のフォルダ/ファイルに存在するかどうかを知りたい場合は、dirコマンドでparamenter/Xを使用してテストするか、またはその部分のみを取得するためにforでカプセル化してください。

NTFSで8.3を有効/無効にする方法の詳細については、M $ webを参照してください。

https://support.Microsoft.com/japan/es-es/help/121007/how-to-disable-8.3-file-name-creation-on-ntfs-partitions

1
Claudio

@Pangの投稿をフォローし、ショートネームと落とし穴について議論している他の人たちが、ロングネームをショートネームに動的に解決する方法を次に示します。

for %A in ("C:\Some\long path\which must exist\to be resolved") do @echo %~sA

その後、明らかに引用符を囲むのではなく、短い名前を使用できます。

0
BuvinJ