引用符を使用せずにWindowsのコマンドラインでスペースをエスケープするにはどうすればよいですか?


88

たとえば、引用符なしでこのコマンドに代わるものは何ですか:

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

2
引用符を使用したくない「しない」ことの正当な理由があるということです。
トーマス

なぜ、引用符キーが壊れているのですか?:)
slhck

3
@slhckシフトキーと2番キーが完全に大丈夫だと心配しないでください!私は、引用符の中にワイルドカードが含まれていると表示されないコマンドを使用しています。
デビッド

1
@MarkBoothと@WeltenWandererは良い試みですが、残念ながらこれは機能しません。3つのケースすべてで「svn:.....のケースを解決するエラー」が表示されます
デビッド

1
古い8.3形式の名前(DOCUME〜1)を試しましたか?
ジャスティンピアース

回答:


55

それはほとんどすべて私のために動作しますが、おそらくline5 ..を試してみましたキャレット記号でスペースをエスケープします(^)

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:\>

または、たとえば、キャレットが実際にすべての違いを生む場所の下。

下からキャレット記号が答えのように見えます。下の3行目を参照してください。

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:\>

Subversionはプログラマーのツールであるため、SOに適している場合があります。ここに関連する質問がある stackoverflow.com/questions/757435/... 、おそらくあなたが各スペースの前にバックスラッシュを使用し、あなたがそれをsvnをしてもらうために引用符やキャレットを使用することができ
barlop

好奇心if盛ならcygwinのsvnを試すこともできます。その質問の例のいくつかを使って、それらのいずれかまたはバリエーションが機能するかどうかを確認します。
-barlop

5
キャレット記号は私の質問に直接答えるので、あなたの答えを受け入れます。残念ながら、SVNコマンドはそれを認識していないようです!試してみると、「svn 'C:'は作業コピーではありません」というエラーメッセージが表示されます。私はそれを回避する別の方法を持っていますが、それは単純に最初にディレクトリに「cd」し、そこで一度SVNコマンドを実行することです。&&演算子を使用して、2つのコマンドを1行に連結することもできます。cd "c:\ Documents and Settings \ username \ svn" && SVN add *。*
David

CDの例では、キャレットが不要であり、CDは、スペースがエスケープは必要ありません
barlop

1
@ Chinggis6興味深い.. DIRでも機能しません。copyもdirもコマンドに組み込まれています。CDもそうです。copyとdirはパラメーターとしてファイル名を取りますが。dostipsフォーラムに尋ねる価値があるかもしれない
barlop

35

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

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

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


7
また、ミニマルにしたい場合は、スペースだけを引用するか、スペースを含む文字だけを引用することができます。例:C:\> cd documents "とse" ttings(ただし、このcdの例では、エスケープする必要はありません)スペース)
-barlop

1
どうもありがとう。私は、可能な場合は4または5回upvotedている場合があります...
Sayka

@Sayka質問は「引用符を使用せずにWindowsのコマンドラインでスペースをエスケープするにはどうすればよいですか?
barlop

2
@barlopもちろん、引用符がない理由は、アスタリスクが引用符の内側にあるときにその仕事をしないということです。アスタリスクが引用符の外側にあるため、私が指定した解決策はこの問題を回避します。この回答は、質問の文字を順守するのではなく、質問の精神を順守します(つまり、意図した目的のために機能します)。
キットジョンソン

26

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

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

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

  3. 数年間の試行錯誤を繰り返して、それを行う方法がないことを認識してください。人々が使用して脱出することをお勧めします^、まだtest.bat foo^ bar出力しませんfoo bar

したがって、出力を取得する方法はなく、取得foo barできる最も近いものはrunningでtest.bat foo" "barあるfoo" "barか、またはrunningで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


15
なんて混乱したWindowsバッチプログラミング
...-クランゲン

ありがとう。CDが使用しているargv[]GetCommandLine()どうかを判断できますか? pastebin.com/raw/t55iv0JS
barlop

7

短いファイル名は簡単に機能するように見えます。

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

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


8
短いファイル名が無効になっている場合、それが動作しないことがあります
phuclv


2

8.3置換について話している場合は、次の2つのことに注意してください。

  • 8.3はNTFSで無効(または有効)に設定できるため、常に存在するとは限りません。
  • ファイル/フォルダの8.3形式の名前は、同じフォルダ内の他のものを作成、名前変更、または削除するだけで、予告なく変更される場合があります。

以下c:\docume~1を指すことができます:

  • どこにも(無効)
  • 必要なフォルダー
  • 別のフォルダー
  • 時間に沿った可変フォルダー

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

それらが変化することは非常にまれですが、それらが存在しないことは一般的です。

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

NTFSで8.3を有効/無効にする方法の詳細については、次のマイクロソフトサポート記事を参照してください:https :
//support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name- NTFSパーティションの作成


0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.