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


87

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

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
您的意思是您有充分的理由“不想”使用引号。
托马斯(Thomas)

为什么,引号键损坏了?:)
slhck

3
@slhck不用担心我的Shift键和2号键完全正确!我正在使用一个命令,当引号内出现通配符时,通配符似乎就不行了!
大卫,

1
@MarkBooth和@WeltenWanderer不错的尝试,但不幸的是这不起作用。在所有3种情况下,我都会收到“ svn:...的错误解决案例”
David

1
您是否尝试过使用旧的8.3格式的名称(DOCUME〜1)?
贾斯汀·皮尔斯

Answers:


54

这几乎对我都有效,但是您也许尝试过第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:\>

或者例如,在插入符号真正起作用的所有下方。

从下面看起来像插入符号可能是您的答案,请参阅下面的第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 2011年

您也可以尝试cygwin的svn,如果好奇的话..在该问题中提供一些示例答案,并查看它们是否对您有用。
barlop 2011年

5
插入符号不会直接回答我的问题,因此我会接受您的回答。不幸的是,SVN命令似乎无法识别它!如果尝试使用,则会收到此错误消息“ svn'C:'不是工作副本”。我有另一种解决方法,那就是先简单地“ cd”到目录,然后在那里执行SVN命令。我什至可以使用&&运算符将两个命令链接在一起:cd“ c:\ Documents and Settings \ username \ svn” && SVN add *。*
David

在CD的示例中,插入符不是必需的,CD不需要逃脱空间
barlop 2014年

1
@ Chinggis6有趣..也不适合DIR。复制和目录都内置在命令中。CD也是如此。虽然copy和dir以文件名作为参数。可能值得在dostips论坛上提问
barlop

35

我发现仅在位置的一部分周围加上引号即可。在您的情况下:

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

尽管这使用引号,但要注意的重要一点是星号不在引号之内,因此它们仍然可以正常运行。


7
同样,如果希望简约,可以只在空格或包含空格的字符周围加引号,例如C:\> cd document“和se” ttings(尽管以cd示例为例,但不需要转义)空格)
barlop

1
非常感谢。如果可能的话,我可能已投票4或5次
。–

@Sayka这个问题确实问到“如何在Windows中的命令行中不使用引号来转义空格
barlop

2
@barlop可以,但是不带引号的原因是,星号在引号内时不起作用。我提供的解决方案避免了这个问题,因为星号在引号之外。该答案不遵循问题的字母,而是遵循问题的精神(即,它可以达到预期的目的)。
Kit Johnson

26

尽管答案给出了幻象,但事实是您不能在空格中潜入通常的cmd参数。这很容易证明:

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

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

  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


15
Windows批处理程序真是一团糟……
Klangen

谢谢。我们可以确定CD是否正在使用argv[]GetCommandLine()吗? pastebin.com/raw/t55iv0JS
barlop

7

短文件名看起来像微风。

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

用于增加内存。.;)


8
如果短文件名已被禁用,则可能无法正常工作
phuclv 2014年


2

对于那些谈论8.3替换的人,请注意以下两件事:

  • 可以在NTFS上将8.3设置为禁用(或启用),因此它可能并不总是存在。
  • 可以通过在同一文件夹中创建,重命名或删除其他内容来更改文件/文件夹的8.3名称,而无需另行通知。

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

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

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

虽然很少会更改,但通常不存在。

如果您想知道特定文件夹/文件是否存在8.3,请/Xdir命令中使用参数对其进行测试,或将其封装在上for以仅获取该部分,依此类推。

有关如何在NTFS上启用/禁用8.3的更多信息,请参见以下Microsoft支持文章:https :
//support.microsoft.com/zh-cn/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

然后,显然您可以使用短名称,而不要使用引号。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.