如何在 Windows 命令行中转义空格而不使用引号?

如何在 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

答案1

它几乎对我来说都有效,但你是否尝试过 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:\>

答案2

我发现只在位置的一部分上加引号就可以了。对于你的情况:

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

虽然这使用了引号,但需要注意的是,星号是外部引号,因此它们仍然可以正常运行。

答案3

尽管答案让人误以为它可以工作,但事实是您无法在通常的 cmd 参数中偷偷插入空格。这很容易证明:

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

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

  3. 经过几年的反复尝试,我意识到没有办法。人们会建议使用逃避^,但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通常参数合为一个逻辑参数。根据 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

请注意,此行为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""""""""""

所有上述示例都有一个相似之处,即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

答案4

对于那些谈论 8.3 替代的人,请注意以下两点:

  • 8.3 可以在 NTFS 上设置为禁用(或启用),因此它可能并不总是存在。
  • 8.3 仅通过创建、重命名或删除同一文件夹中的其他内容,文件/文件夹的名称就会发生更改,且无需事先通知。

因此c:\docume~1可以指出:

  • 无处(无效)
  • 您想要的文件夹
  • 另一个文件夹
  • 随时间变化的文件夹

这是不安全的,除非你获得短名称并在原子操作中使用它。

尽管它们发生变化的情况并不常见,但它们不存在的情况却很常见。

如果您想知道某个文件夹/文件是否存在 8.3,请使用命令/X中的参数进行测试dir,或者将其封装起来以for仅获取该部分等。

有关如何在 NTFS 上启用/禁用 8.3 的更多信息,请参阅此 Microsoft 支持文章:
https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name-creation-on-ntfs-partitions

相关内容