2011-05-04 12:54:50 +0000 2011-05-04 12:54:50 +0000
92
92

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

例えば、引用符を使わずにこのコマンドを実行するにはどうすればいいでしょうか:

CD "c:\Documents and Settings"

引用符を使わない完全な理由は、このコマンドが動作するからです: 002 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

回答 (7)

59
59
59
2011-05-04 16:59:54 +0000

それはほとんどすべてが私のために動作しますが、あなたはおそらく行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:\>

またはキャレットが実際にすべての違いを作る下の例のようにスペースをエスケープします。

36
36
36
2013-04-24 07:45:18 +0000

場所の一部分だけを引用符で囲むと効果があることがわかりました。この場合:

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

引用符を使用していますが、注目すべき重要なことは、アスタリスクが引用符の外側にあるということです。

26
26
26
2015-08-26 02:01:44 +0000

この答えを見ていると、まるで動作しているかのように錯覚してしまいますが、実際には、通常の cmd の引数にスペースをこっそり入れることはできません。これを証明するのは簡単だ。echo %1 “を”test.bat “として保存する。このバッチファイルは、cmdが渡した最初の引数を出力します。では、test.batの値を%1に設定して、foo barを実行してみてください。(foobarの間にスペースcharがあるので注意)

  1. 数年間試行錯誤して、**方法がないことに気づく。庶民は^を使って逃げることを提案してくるが、それでもtest.bat foo^ barfoo 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 つの引数があります:

  1. 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

8
8
8
2014-04-19 07:51:15 +0000

短いファイル名でも問題ないようです。

“E:\Progra~1\JavaEclipseEclipse\eclipse.exe” -vmargs -Xms1024m -Xmx2048m

メモリの増強のために・・・ ;)

3
3
3
2012-10-03 14:47:56 +0000

8.3のショートファイル名を使用します。例:

If exist c:\docume~1 goto :Ifoundthesucker
2
2
2
2017-05-12 08:43:24 +0000

8.3の置き換えの話をしている人は、次の2つのことに注意してください:

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

だからc:\docume~1は次の場所を指すことができます:

  • どこにもない(無効になる)
  • 欲しいフォルダ
  • 別のフォルダ
  • 時間に沿った可変フォルダ

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

変更されることは非常に稀ですが、存在しないことはよくあることです。

特定のフォルダ/ファイルに8.3が存在するかどうかを知りたい場合は、/Xコマンドでパラメータdirでテストしたり、forでカプセル化してその部分だけを取得したりしてください。 https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name-creation-on-ntfs-partitions

0
0
0
2019-08-08 20:42:46 +0000

Pangさんの投稿に続いて、短い名前と落とし穴について議論している他の人たちは、ここで長い名前を短い名前に動的に解決する方法を説明します:

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

それから、明らかに、あなたは周囲の引用符ではなく、短い名前を使用することができます。