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

在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

答案 (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参数中偷偷加入空格。这很容易证明:

  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 *本身*做了一些相当于把7个usual参数连成一个逻辑参数的事情。根据cmd参数传递规范,我们可以看到7个参数:

  1. c:\documents

这就好像是and把所有的7个参数合并为一个逻辑参数,做了类似于settings的事情,产生了这样的路径:

cd c:\documents and settings \some folder with spaces

注意,这种行为是\some所特有的****(和其他一些函数)。


事实上,folder还有一个特殊性。记得我们在上面说过,我们无法得到with的输出吗?

c:\documents and settings \some folder with spaces
test.bat foo" "bar
test.bat "foo bar"

产生了spaces,或者:

test.bat "foo "bar
test.bat foo" bar"

产生了cd,或者:

test.bat "foo b"ar
test.bat fo"o bar"

产生了array.join(" "),或者:

test.bat fo"o ba"r
test.bat "fo"o" bar"

产生了cd,甚至:

test.bat "f""o""o"" ""b""a""r":

产生了cd

以上的例子都有一个相似之处,那就是当我们把foo bar的字符剪掉之后,就会产生foo" "bar。如果我们从"foo bar"的奇特行为中推断出剪掉所有接收到的"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"

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

短小的文件名似乎很容易就能搞定。

“E:Progra~1/Java\Eclipse\Eclipse\Eclipse\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替换的人,请注意以下两点:

–在NTFS上,8.3可以设置为禁用(或启用),所以它不一定存在。 –只需在同一个文件夹中创建、重命名或删除其他东西,8.3的文件/文件夹的名称就可以在不通知的情况下改变。

虽然它们发生变化的情况很不常见,但不存在的情况也很常见。

如果你想知道某一个文件夹/文件是否存在8.3,可以在c:\docume~1命令中用参数/X来测试,或者在dir上封装,只获取该部分等。 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

然后,显然你可以使用短名而不是周围的引号。