如何在不使用引号的情况下在 Windows 的命令行中转义空格?

Dav*_*vid 101 windows command-line escape-characters

例如,不带引号的此命令的替代方法是什么:

CD "c:\Documents and Settings"
Run Code Online (Sandbox Code Playgroud)

我不想使用引号的全部原因是这个命令确实有效:

   SVN add mypathname\*.*
Run Code Online (Sandbox Code Playgroud)

但此命令不起作用:

   SVN add "mypathname\*.*"
Run Code Online (Sandbox Code Playgroud)

问题是,当我更改带有空格的路径的 mypathname 时,我需要引用整个内容。例如:

SVN add "c:\Documents and Settings\username\svn\*.*"
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这个时,我收到以下错误消息:

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found
Run Code Online (Sandbox Code Playgroud)

bar*_*lop 63

它几乎对我都有效,但是您是否尝试过 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:\>
Run Code Online (Sandbox Code Playgroud)

或者例如在下面插入符号真正发挥作用的地方。

从下面看,插入符号可能是您的答案,请参见下面的第 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:\>
Run Code Online (Sandbox Code Playgroud)

  • 插入符号确实直接回答了我的问题,所以我会接受你的回答。不幸的是,SVN 命令似乎无法识别它!如果我尝试它,我会收到此错误消息“svn 'C:' 不是工作副本”。我有另一种解决方法,那就是先简单地“cd”到目录,然后在那里执行 SVN 命令。我什至可以使用 && 运算符将这两个命令链接在一行中: cd "c:\Documents and Settings\username\svn" && SVN add \*.* (5认同)
  • @Chinggis6 有趣.. 它也不适用于 DIR。copy 和 dir 都内置在命令中..虽然 CD 也是如此。尽管 copy 和 dir 将文件名作为参数。可能值得在 dostips 论坛上提问 (2认同)

Kit*_*son 42

我发现在位置的一部分周围加上引号是有效的。在你的情况下:

SVN add C:\"Documents and Settings"\username\svn\*.*
Run Code Online (Sandbox Code Playgroud)

虽然这使用了引号,但要注意的重要一点是星号在引号之外,因此它们仍然可以正常工作。

  • 此外,如果想要简约,可以只在空格或包含空格的字符周围加上引号,例如 C:\>cd 文件和设置(尽管是那个 cd 示例,但不需要转义空格) (9认同)
  • @barlop 当然,但没有引号的原因是星号在引号内时不起作用。我给出的解决方案避免了这个问题,因为星号在引号之外。这个答案不遵守问题的**字母**,但遵守问题的**精神**(即,它适用于预期目的)。 (2认同)

Pac*_*ier 30

尽管答案给人一种它有效的错觉,但事实是您不能将空格潜入通常的 cmd 参数中。这很容易证明:

  1. 将“ echo %1”另存为test.bat. 这个批处理文件将输出 cmd 传递给我们的第一个参数。

  2. 现在,尝试运行test.bat,将 的值设置%1foo bar。(请注意,foo和之间有一个空格字符bar。)

  3. 试错了几年,意识到没有办法做到。人们会建议使用 逃避^,但test.bat foo^ bar不会输出foo bar

所以,没有办法得到 output foo bar,我们能得到的最接近的是 running test.bat foo" "barwhich productsfoo" "bar或 running test.bat "foo bar"which products "foo bar"


现在,其他答案的理由似乎工作是因为cd确实它自己额外的解析,从常用的参数传递的行为(通常发散%1%2%3在典型的批处理文件和等)。

例如,考虑特殊的命令:

cd c:\documents and settings \some folder with spaces
Run Code Online (Sandbox Code Playgroud)

为什么有效?这是因为cd 它自己做了一些相当于将 7 个常用参数合并为一个逻辑参数的操作。根据 cmd 参数传递规范,我们看到 7 个参数:

  1. c:\documents
  2. and
  3. settings
  4. \some
  5. folder
  6. with
  7. spaces

好像cd已将所有 7 个参数合并为一个逻辑参数,执行类似于 的操作array.join(" "),从而生成路径:

c:\documents and settings \some folder with spaces
Run Code Online (Sandbox Code Playgroud)

请注意,此行为是特有的cd只有(和其他一些功能)。它与通常的参数传递无关。


的确,cd还有一个特点。还记得我们上面说过我们无法获得输出foo bar吗?我们可以获得的最接近的输出是通过运行:

test.bat foo" "bar
Run Code Online (Sandbox Code Playgroud)

产生foo" "bar, 或:

test.bat "foo bar"
Run Code Online (Sandbox Code Playgroud)

产生"foo bar", 或:

test.bat "foo "bar
Run Code Online (Sandbox Code Playgroud)

产生"foo "bar, 或:

test.bat foo" bar"
Run Code Online (Sandbox Code Playgroud)

产生foo" bar", 或:

test.bat "foo b"ar
Run Code Online (Sandbox Code Playgroud)

产生"foo b"ar, 或:

test.bat fo"o bar"
Run Code Online (Sandbox Code Playgroud)

产生fo"o bar", 或:

test.bat fo"o ba"r
Run Code Online (Sandbox Code Playgroud)

产生fo"o ba"r, 或:

test.bat "fo"o" bar"
Run Code Online (Sandbox Code Playgroud)

产生"fo"o" bar", 或:

test.bat "f""o""o"" ""b""a""r":
Run Code Online (Sandbox Code Playgroud)

它产生"f""o""o"" ""b""a""r",甚至:

test.bat """"f"""o""""o"" ""ba"""r"""""""""":
Run Code Online (Sandbox Code Playgroud)

产生""""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

  • 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

  • Windows批处理编程真是一团糟…… (19认同)

小智 9

短文件名似乎轻而易举。

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

为了提高内存.. ;)

  • 如果禁用了短文件名,它可能无法工作 (8认同)