[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 批处理中没有空格的路径加引号会不会造成错误?

在各种操作中,有时搞不清倒底会不会有空格,所以想统一加引号,不知 没有空格的路径加引号有没有可能造成错误

还有有时见有人在变量外加双引号
'%QQ%'
有的人用单引号
'%QQ%'
有什么不同?


已解决!感谢各位

[ 本帖最后由 wxfly 于 2009-12-10 23:09 编辑 ]

也讨论一下

没空格的路径, 一般加引号不会有错,

ms-its:C:\WINDOWS\Help\ntcmds.chm::/for.htm
for /F ["usebackqParsingKeywords"] {%% | %}variable in ("filenameset") do command [CommandLineOptions]

for /F ["usebackqParsingKeywords"] {%% | %}variable in ('LiteralString') do command [CommandLineOptions]
usebackq 指定可以使用引号引用 filenameset 中的文件名称,将后面带有引号的字符串作为一个命令执行,而带有单引号的字符串是文字字符串命令。
...
通过将 Filenameset 包括在圆括号内,并且外面再带上单引号(即,'filenameset'),可以使用 for /F 对直接字符串解析逻辑。将 Filenameset 视为从某个文件输入的单行,然后接受解析。
...
如果您提供的文件名包含空格,请使用引号将文本引起来(例如,"File Name")。要使用引号,必须使用 usebackq。否则,就将引号解释为定义要解析的文字字符串。

[ 本帖最后由 neorobin 于 2009-12-10 22:17 编辑 ]

TOP

干吗不用 那个搜索项呢??

http://bbs.bathome.net/viewthread.php?tid=408&extra=page%3D1

TOP

那么,像del /f /s /q %userprofile%\AppData\Local\Temp\
这条语句是不含空格的,假设%userprofile%中的用户名是含空格的,那么是不是应该改成
del /f /s /q "%userprofile%\AppData\Local\Temp\"

TOP

原帖由 bluewing009 于 2009-12-10 22:15 发表
干吗不用 那个搜索项呢??

http://bbs.bathome.net/viewthread.php?tid=408&extra=page%3D1


可是我问的是没有空格加引号会不会有问题

另外,像del /f /s /q %userprofile%\AppData\Local\Temp\
这条语句是不含空格的,假设%userprofile%中的用户名是含空格的,那么是不是应该改成
del /f /s /q "%userprofile%\AppData\Local\Temp\"

TOP

回复 5楼 的帖子

我看应该是的, 我以前在 winRAR 的的自动安装注解中用过, 也是其中的空格总造成错误, 加了双引号括起来就好了
我用的变量是 programfiles,  通常它的值就是 C:\Program Files  有空格的

TOP

原帖由 neorobin 于 2009-12-10 22:29 发表
我看应该是的, 我以前在 winRAR 的的自动安装注解中用过, 也是其中的空格总造成错误, 加了双引号括起来就好了
我用的变量是 programfiles,  通常它的值就是 C:\Program Files  有空格的


也就是说像我那个用户目录的环境变量就应该统一加引号咯,以免有 中间有空格的账号 ,
如果不管有没有空格都可以统一加空格的话,那么不知为什么见过不少批处理都是区别对待的!

TOP

除了命令允许不加引号,比如cd、notepad等;或者引号在命令中有特殊含义,比如start的第一对引号视为标题,for /f将引号中的内容视为字符串而不是文件名。一般情况下都应该加引号才不会造成错误,不管有没有空格。

Windows上一般都使用双引号,因为单引号在Windows上只是普通字符,没有特殊含义,只在少数命令支持时才有特殊性。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

试验了一下

下面会出错: 找不到文件, 因为有引号, 所以创建, 删除 都成功了, 最后当然找不到
  1. echo 引号与空格>"%programfiles%\~"&del "%programfiles%\~"&write "%programfiles%\~"
复制代码
而这个可成功打开文件, 只是删除没用引号造成失败, 所以成功打开文件
  1. echo 引号与空格>"%programfiles%\~"&(del %programfiles%\~||write "%programfiles%\~")
复制代码

TOP

回复 7楼 的帖子

楼主“见过的不少批处理都是区别对待的”,能否举出几例?
我想很大可能是那些批处理作者水平不到位(没任何轻视的意思,只是猜测)
比如对%1的推荐用法是"%~1",这样就不用区分参数%1是否含有引号。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

原帖由 zqz0012005 于 2009-12-10 22:36 发表
除了命令允许不加引号,比如cd、notepad等;或者引号在命令中有特殊含义,比如start的第一对引号视为标题,for /f将引号中的内容视为字符串而不是文件名。一般情况下都应该加引号才不会造成错误,不管有没有空格。
...


版主给我吃了颗定心丸!而且我要加引号的地方都不是特殊的场合,我可以放心加了!
十分感谢!

TOP

而且很难置信的, 微软命令行对引号的位置都不是定得很死的
在命令行下, 这样是打不开的
  1. C:\Program Files\Windows NT\Accessories\wordpad.exe
复制代码
但这两种都可以打开
  1. C:\Pr"ogram Files\Windows NT\Accessories\wordpad.exe
复制代码
  1. C:\Program" Files\Windows NT\Accessories\wordpad.exe
复制代码
而这样就不行了
  1. C:\Program "Files\Windows NT\Accessories\wordpad.exe
复制代码
关键是引号要在第一个空格的前面, 而且一些情况下, 是不必要成对的

TOP

原帖由 zqz0012005 于 2009-12-10 22:49 发表
楼主“见过的不少批处理都是区别对待的”,能否举出几例?
我想很大可能是那些批处理作者水平不到位(没任何轻视的意思,只是猜测)
比如对%1的推荐用法是"%~1",这样就不用区分参数%1是否含有引号。


最常见的就是古老的一键清理
@echo off
echo 正在清理系统垃圾文件,请稍等......
del /f /s /q %systemdrive%\*.tmp
del /f /s /q %systemdrive%\*._mp
del /f /s /q %systemdrive%\*.log
del /f /s /q %systemdrive%\*.gid
del /f /s /q %systemdrive%\*.chk
del /f /s /q %systemdrive%\*.old
del /f /s /q %systemdrive%\recycled\*.*
del /f /s /q %windir%\*.bak
del /f /s /q %windir%\prefetch\*.*
rd /s /q %windir%\temp & md %windir%\temp
del /f /q %userprofile%\cookies\*.*
del /f /q %userprofile%\recent\*.*

del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*"
del /f /s /q "%userprofile%\Local Settings\Temp\*.*"
del /f /s /q "%userprofile%\recent\*.*"
echo 清理系统垃圾完成!
echo. & pause

还有网上流传的番茄花园一键清理同样是这样的!

你看蓝色部分,用户目录,要是用户名是有空格的不就出错了吗?(难道系统是不是允许建立有空格的用户名的吗?)
所以我才产生了这样的疑问

TOP

原帖由 neorobin 于 2009-12-10 22:42 发表
下面会出错: 找不到文件, 因为有引号, 所以创建, 删除 都成功了, 最后当然找不到echo 引号与空格>"%programfiles%\~"&del "%programfiles%\~"&write "%programfiles%\~"而这个可成功打开文件, 只是删除没用引号造成失 ...

咋一看我还以为你的看法与版主不同,仔细一读原来进一步证明应该加引号

TOP

原帖由 neorobin 于 2009-12-10 22:57 发表
而且很难置信的, 微软命令行对引号的位置都不是定得很死的
在命令行下, 这样是打不开的C:\Program Files\Windows NT\Accessories\wordpad.exe但这两种都可以打开C:\Pr"ogram Files\Windows NT\Accessories\wordpad. ...


刚刚才看过用一半边双引号的教程

又看到你的经验,感谢!

不过我有能配对就配对的习惯

TOP

返回列表