标题: [文件操作] 批处理中没有空格的路径加引号会不会造成错误? [打印本页]
作者: wxfly 时间: 2009-12-10 21:56 标题: 批处理中没有空格的路径加引号会不会造成错误?
在各种操作中,有时搞不清倒底会不会有空格,所以想统一加引号,不知 没有空格的路径加引号有没有可能造成错误
还有有时见有人在变量外加双引号
'%QQ%'
有的人用单引号
'%QQ%'
有什么不同?
已解决!感谢各位
[ 本帖最后由 wxfly 于 2009-12-10 23:09 编辑 ]
作者: neorobin 时间: 2009-12-10 22:05 标题: 也讨论一下
没空格的路径, 一般加引号不会有错,
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 编辑 ]
作者: bluewing009 时间: 2009-12-10 22:15
干吗不用 那个搜索项呢??
http://bbs.bathome.net/viewthread.php?tid=408&extra=page%3D1
作者: wxfly 时间: 2009-12-10 22:20
那么,像del /f /s /q %userprofile%\AppData\Local\Temp\
这条语句是不含空格的,假设%userprofile%中的用户名是含空格的,那么是不是应该改成
del /f /s /q "%userprofile%\AppData\Local\Temp\"
作者: wxfly 时间: 2009-12-10 22:23
可是我问的是没有空格加引号会不会有问题
另外,像del /f /s /q %userprofile%\AppData\Local\Temp\
这条语句是不含空格的,假设%userprofile%中的用户名是含空格的,那么是不是应该改成
del /f /s /q "%userprofile%\AppData\Local\Temp\"
作者: neorobin 时间: 2009-12-10 22:29 标题: 回复 5楼 的帖子
我看应该是的, 我以前在 winRAR 的的自动安装注解中用过, 也是其中的空格总造成错误, 加了双引号括起来就好了
我用的变量是 programfiles, 通常它的值就是 C:\Program Files 有空格的
作者: wxfly 时间: 2009-12-10 22:36
原帖由 neorobin 于 2009-12-10 22:29 发表
我看应该是的, 我以前在 winRAR 的的自动安装注解中用过, 也是其中的空格总造成错误, 加了双引号括起来就好了
我用的变量是 programfiles, 通常它的值就是 C:\Program Files 有空格的
也就是说像我那个用户目录的环境变量就应该统一加引号咯,以免有 中间有空格的账号 ,
如果不管有没有空格都可以统一加空格的话,那么不知为什么见过不少批处理都是区别对待的!
作者: zqz0012005 时间: 2009-12-10 22:36
除了命令允许不加引号,比如cd、notepad等;或者引号在命令中有特殊含义,比如start的第一对引号视为标题,for /f将引号中的内容视为字符串而不是文件名。一般情况下都应该加引号才不会造成错误,不管有没有空格。
Windows上一般都使用双引号,因为单引号在Windows上只是普通字符,没有特殊含义,只在少数命令支持时才有特殊性。
作者: neorobin 时间: 2009-12-10 22:42 标题: 试验了一下
下面会出错: 找不到文件, 因为有引号, 所以创建, 删除 都成功了, 最后当然找不到- echo 引号与空格>"%programfiles%\~"&del "%programfiles%\~"&write "%programfiles%\~"
复制代码
而这个可成功打开文件, 只是删除没用引号造成失败, 所以成功打开文件- echo 引号与空格>"%programfiles%\~"&(del %programfiles%\~||write "%programfiles%\~")
复制代码
作者: zqz0012005 时间: 2009-12-10 22:49 标题: 回复 7楼 的帖子
楼主“见过的不少批处理都是区别对待的”,能否举出几例?
我想很大可能是那些批处理作者水平不到位(没任何轻视的意思,只是猜测)
比如对%1的推荐用法是"%~1",这样就不用区分参数%1是否含有引号。
作者: wxfly 时间: 2009-12-10 22:53
原帖由 zqz0012005 于 2009-12-10 22:36 发表
除了命令允许不加引号,比如cd、notepad等;或者引号在命令中有特殊含义,比如start的第一对引号视为标题,for /f将引号中的内容视为字符串而不是文件名。一般情况下都应该加引号才不会造成错误,不管有没有空格。
...
版主给我吃了颗定心丸!而且我要加引号的地方都不是特殊的场合,我可以放心加了!
十分感谢!
作者: neorobin 时间: 2009-12-10 22:57
而且很难置信的, 微软命令行对引号的位置都不是定得很死的
在命令行下, 这样是打不开的- C:\Program Files\Windows NT\Accessories\wordpad.exe
复制代码
但这两种都可以打开- C:\Pr"ogram Files\Windows NT\Accessories\wordpad.exe
复制代码
- C:\Program" Files\Windows NT\Accessories\wordpad.exe
复制代码
而这样就不行了- C:\Program "Files\Windows NT\Accessories\wordpad.exe
复制代码
关键是引号要在第一个空格的前面, 而且一些情况下, 是不必要成对的
作者: wxfly 时间: 2009-12-10 23:03
原帖由 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
还有网上流传的番茄花园一键清理同样是这样的!
你看蓝色部分,用户目录,要是用户名是有空格的不就出错了吗?(难道系统是不是允许建立有空格的用户名的吗?)
所以我才产生了这样的疑问
作者: wxfly 时间: 2009-12-10 23:05
原帖由 neorobin 于 2009-12-10 22:42 发表
下面会出错: 找不到文件, 因为有引号, 所以创建, 删除 都成功了, 最后当然找不到echo 引号与空格>"%programfiles%\~"&del "%programfiles%\~"&write "%programfiles%\~"而这个可成功打开文件, 只是删除没用引号造成失 ...
咋一看我还以为你的看法与版主不同,仔细一读原来进一步证明应该加引号
作者: wxfly 时间: 2009-12-10 23:06
原帖由 neorobin 于 2009-12-10 22:57 发表
而且很难置信的, 微软命令行对引号的位置都不是定得很死的
在命令行下, 这样是打不开的C:\Program Files\Windows NT\Accessories\wordpad.exe但这两种都可以打开C:\Pr"ogram Files\Windows NT\Accessories\wordpad. ...
刚刚才看过用一半边双引号的教程
又看到你的经验,感谢!
不过我有能配对就配对的习惯
作者: zqz0012005 时间: 2009-12-10 23:10
说了无数遍了,这个“古老的一键清理垃圾”本身就是个垃圾。
蓝色部分本来就是错的!
作者: neorobin 时间: 2009-12-10 23:13 标题: 回复 15楼 的帖子
确实如此, 微软命令行肯定有好多奇怪的地方, (像我这样的菜鸟不了解, 不精通只能说是怪了, 哈哈)
但又难找到非常详细, 精确, 全面, 系统的说明资料,
只能尽量不要用那些 "旁门左道", 写最 "规矩" 的代码了, 尽管有时会显得 不"精", 不"简"
作者: zqz0012005 时间: 2009-12-10 23:19 标题: 回复 12楼 的帖子
引号有转义作用,显然应该加在空格前面,否则空格还是作为命令与参数的分隔符。
windows下的引号不能转义回车,到行末时不管有没有配对的引号,都认为语句结束。如果在Linux下就不行。
作者: neorobin 时间: 2009-12-10 23:19 标题: 回复 16楼 的帖子
这个所谓的 "一键清理垃圾" 要真是垃圾, 第一行就应该是 del %0, 哈哈, 我从不用它, 至少感觉那个效率真是太低了, 系统自身就会自动处理那些个临时文件啊什么的, 象 360 之类的软件清理比它高效多了
作者: zqz0012005 时间: 2009-12-10 23:23 标题: 回复 19楼 的帖子
除了蓝色部分是错的,还有其他根本不合理的地方:
http://www.bathome.net/viewthread.php?tid=684#pid7625
作者: neorobin 时间: 2009-12-10 23:33 标题: 回复 20楼 的帖子
看了下, 认识多了些, 看来许多临时目录和文件远比许多人想象的要重要得多, 不要随便拿它们开刀, 不然让你不爽!
作者: zqz0012005 时间: 2009-12-10 23:43
早就说过,蓝色部分是错的,不只是没加引号这么简单,而是这个“没加引号”错误可能造成灾难性后果。
del命令支持多个参数,即可以同时删除多个文件。文件名之间用分隔符(如空格、分号等)分开,这里文件名也可以是文件夹名,相当于删除文件夹下的所有文件(folder\*.*)
一般%userprofile%是C:\Documents and Settings\用户名
del /f /q %userprofile%\recent\*.* 就是
del /f /q C:\Documents and Settings\用户名\recent\*.*
即不提示用户就删除这3处:
C:\Documents文件夹下的所有文件,当前目录下and文件夹中的所有文件,及当前目录下Settings\用户名\recent\*.*
如果真的存在C:\Documents文件夹(documents这个名字很常用哦,所以可能性不少),其下又保存了很重要的文档,一旦运行那个del命令可就追悔莫及。
作者: wxfly 时间: 2009-12-11 03:40 标题: 回复 22楼 的帖子
版主息怒,淡定,我早看网上那些漏洞百出的批处理不惯了,用的win2008r2.没有什么好的清理软件,一气之下决定自己写个安全点的批处理
已经快写好,和已往的批处理完全不一样,去除了不少不安全的项目,删除缓存时不碰目录,保证目录属性不变,完全针对我的系统写,讨厌死网上那些把xp下的一键清理改个名当win7一键清理的行为,很多对不上号的地方。
还是自己写的好,出了错也不怨别人!反正我已经在安全方面比以前的强了百倍,改进的地方有大几十个
作者: Batcher 时间: 2009-12-11 09:49 标题: 回复 23楼 的帖子
完成之后能否把代码贴出来分享一下?
作者: wxfly 时间: 2009-12-11 12:12 标题: 回复 24楼 的帖子
可是可以,但这里高手太多,怕写得太菜,怡笑大方啊!万一被大家批斗,那就太不堪了!
不过也很想让大家批评指证,以完善之!本来想多考量、测试后再发布,但快考试了,得加紧写完,容不得过多测试、斟酌了,应该快了,说不定晚上就能贴出来。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |