例如,这个不带引号的命令的替代方法是什么:
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 参数中偷偷插入空格。这很容易证明:
将“
echo %1
”另存为test.bat
。此批处理文件将输出cmd传递给我们的第一个参数。现在,尝试运行
test.bat
,将 的值设置%1
为。 (请注意和foo bar
之间有一个空格字符。)foo
bar
经过几年的反复尝试,我意识到没有办法。人们会建议使用逃避
^
,但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 个参数:
c:\documents
and
settings
\some
folder
with
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