找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 51327|回复: 24

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

[复制链接]
发表于 2009-12-10 21:56:28 | 显示全部楼层 |阅读模式
在各种操作中,有时搞不清倒底会不会有空格,所以想统一加引号,不知 没有空格的路径加引号有没有可能造成错误

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


已解决!感谢各位

[ 本帖最后由 wxfly 于 2009-12-10 23:09 编辑 ]
发表于 2009-12-10 22:05:26 | 显示全部楼层

也讨论一下

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

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 编辑 ]
发表于 2009-12-10 22:15:13 | 显示全部楼层
干吗不用 那个搜索项呢??

http://bbs.bathome.net/viewthread.php?tid=408&extra=page%3D1
 楼主| 发表于 2009-12-10 22:20:42 | 显示全部楼层
那么,像del /f /s /q %userprofile%\AppData\Local\Temp\
这条语句是不含空格的,假设%userprofile%中的用户名是含空格的,那么是不是应该改成
del /f /s /q "%userprofile%\AppData\Local\Temp\"
 楼主| 发表于 2009-12-10 22:23:19 | 显示全部楼层
原帖由 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\"
发表于 2009-12-10 22:29:40 | 显示全部楼层

回复 5楼 的帖子

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


也就是说像我那个用户目录的环境变量就应该统一加引号咯,以免有 中间有空格的账号 ,
如果不管有没有空格都可以统一加空格的话,那么不知为什么见过不少批处理都是区别对待的!
发表于 2009-12-10 22:36:46 | 显示全部楼层
除了命令允许不加引号,比如cd、notepad等;或者引号在命令中有特殊含义,比如start的第一对引号视为标题,for /f将引号中的内容视为字符串而不是文件名。一般情况下都应该加引号才不会造成错误,不管有没有空格。

Windows上一般都使用双引号,因为单引号在Windows上只是普通字符,没有特殊含义,只在少数命令支持时才有特殊性。
发表于 2009-12-10 22:42:08 | 显示全部楼层

试验了一下

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

回复 7楼 的帖子

楼主“见过的不少批处理都是区别对待的”,能否举出几例?
我想很大可能是那些批处理作者水平不到位(没任何轻视的意思,只是猜测)
比如对%1的推荐用法是"%~1",这样就不用区分参数%1是否含有引号。
 楼主| 发表于 2009-12-10 22:53:15 | 显示全部楼层
原帖由 zqz0012005 于 2009-12-10 22:36 发表
除了命令允许不加引号,比如cd、notepad等;或者引号在命令中有特殊含义,比如start的第一对引号视为标题,for /f将引号中的内容视为字符串而不是文件名。一般情况下都应该加引号才不会造成错误,不管有没有空格。
...


版主给我吃了颗定心丸!而且我要加引号的地方都不是特殊的场合,我可以放心加了!
十分感谢!
发表于 2009-12-10 22:57:46 | 显示全部楼层
而且很难置信的, 微软命令行对引号的位置都不是定得很死的
在命令行下, 这样是打不开的
  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
复制代码
关键是引号要在第一个空格的前面, 而且一些情况下, 是不必要成对的
 楼主| 发表于 2009-12-10 23:03:14 | 显示全部楼层
原帖由 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

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

你看蓝色部分,用户目录,要是用户名是有空格的不就出错了吗?(难道系统是不是允许建立有空格的用户名的吗?)
所以我才产生了这样的疑问
 楼主| 发表于 2009-12-10 23:05:01 | 显示全部楼层
原帖由 neorobin 于 2009-12-10 22:42 发表
下面会出错: 找不到文件, 因为有引号, 所以创建, 删除 都成功了, 最后当然找不到echo 引号与空格>"%programfiles%\~"&del "%programfiles%\~"&write "%programfiles%\~"而这个可成功打开文件, 只是删除没用引号造成失 ...

咋一看我还以为你的看法与版主不同,仔细一读原来进一步证明应该加引号
 楼主| 发表于 2009-12-10 23:06:30 | 显示全部楼层
原帖由 neorobin 于 2009-12-10 22:57 发表
而且很难置信的, 微软命令行对引号的位置都不是定得很死的
在命令行下, 这样是打不开的C:\Program Files\Windows NT\Accessories\wordpad.exe但这两种都可以打开C:\Pr"ogram Files\Windows NT\Accessories\wordpad. ...


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

又看到你的经验,感谢!

不过我有能配对就配对的习惯
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:29 , Processed in 0.022716 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表