Board logo

标题: [文本处理] [已解决]批处理for语句in里面的命令中特殊符号如何处理 [打印本页]

作者: linjuming    时间: 2009-11-17 21:29     标题: [已解决]批处理for语句in里面的命令中特殊符号如何处理

下面代码用到一个find小插件,地址:http://baiy.cn/utils/f/index.htm

for /f "delims=" %%i in ('f %need_css_link% -ric:"***:[^\(\'\"]*\.(png^|jpg^|gif)" -o:"k"') do (

    xcopy /y %%i %new_folder_path%
)

错误信息:
此时不应有 " -o:"k"') do (。

D:\PHPnow-1.5.3\htdocs\bat>for /f "delims=" %i in ('f D:\PHPnow-1.5.3\htdocs\mycenter\cssparts\menu\menu_17\menu_17.css
-ric:"***:[^\(\'\"]*\.(png^|jpg^|gif)" -o:"k"') do (

[ 本帖最后由 linjuming 于 2009-11-19 10:00 编辑 ]
作者: linjuming    时间: 2009-11-17 22:02

问题出在这里
for /f "delims=" %%i in ('f %need_css_link% -ric:"***:[^\(\'\"]*\.(png^|jpg^|gif)" -o:"k"') do (
    xcopy /y %%i %new_folder_path%
)

如果有\"就出错,去掉就正常
单单运行f %need_css_link% -ric:"***:[^\(\'\"]*\.(png^|jpg^|gif)" -o:"k"也正常
怎么办?
作者: zqz0012005    时间: 2009-11-17 22:22

for /f "delims=" %%i in ('f %need_css_link% -ric:"***:[^\(\'\"]*\.^(png^|jpg^|gif^)^" -o:"k"') do
作者: linjuming    时间: 2009-11-17 22:27

还是出错
D:\PHPnow-1.5.3\htdocs\bat>for /F "delims=" %i in ('f D:\PHPnow-1.5.3\htdocs\mycenter\cssparts\menu\menu_32\menu_32.css
-ric:"***:[^\(\'\"]*\.(png|jpg|gif)" -o:"k"') do (xcopy /y F:\ScrapBook\data\20091116161106\%i D:\PHPnow-1.5.3\htdocs\my
center\cssparts\menu\menu_32\ )
'jpg' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
作者: zqz0012005    时间: 2009-11-17 22:35

习惯性把它当作命令了。

for /f "delims=" %%i in ('f %need_css_link% -ric:"***:[^\(\'\"]*\.^(png^^^|jpg^^^|gif^)^" -o:"k"') do
作者: linjuming    时间: 2009-11-18 11:59

原帖由 zqz0012005 于 2009-11-17 22:35 发表
习惯性把它当作命令了。

for /f "delims=" %%i in ('f %need_css_link% -ric:"***:[^\(\'\"]*\.^(png^^^|jpg^^^|gif^)^" -o:"k"') do


成功了,但为什么要加^^^三个这么多?
-ric:"这里双引号前为什么不加^ ?

[ 本帖最后由 linjuming 于 2009-11-18 12:00 编辑 ]
作者: zqz0012005    时间: 2009-11-18 12:16

你没看到我用灰色标记的地方吗?这些都是成对的引号。

其实也可以加,但引号里面的特殊字符需要处理。
作者: linjuming    时间: 2009-11-18 13:07

[^\(\'\"]  这是正则里面  非【】中字符的写法,里面的   \"   是匹配字符串不能含有双引号的意思,所以它不是跟前面的双引号配对。
还有能否解释一下根据什么情况加多少个^?  看你的代码中连续加了三个^ ,不太懂。
作者: zqz0012005    时间: 2009-11-18 21:39     标题: 回复 8楼 的帖子

我知道这个意思,但电脑不知道,CMD程序从左到右将依次处理,引号当然也是就近匹配(除非被转义)。


for /f "delims=" %%i in ('f %need_css_link% -ric:^"***:[^^\^(\'\"]*\.(png^|jpg^|gif)" -o:"k"') do

for /f "delims=" %%i in ('f %need_css_link% -ric:^^^"***:[^^^^\^(\'\"]*\.(png|jpg|gif)" -o:"k"') do


涉及到for /f 运行机制预处理相关知识。
作者: zqz0012005    时间: 2009-11-18 21:45

另外,标题宜改为
for语句in里面的命令中特殊符号如何处理
作者: zqz0012005    时间: 2009-11-18 21:59

此题具体是for /f 语句in里面的命令的运行机制
in里面的命令是在一个新的CMD中运行的。

CMD解释bat时要预处理一次,for /f 运行的CMD对其中的命令也要预处理一次,共两次预处理,所以要加那么多转义。
知道原理后,还可以改成其他写法。

for /f 运行机制及预处理更多细节请搜索以前的老帖。
作者: linjuming    时间: 2009-11-19 09:59

相当复杂,需要深入再深入,不过现在已懂了一大半了,先用着这个,到迫不得已的时候再还头认真学习一下预处理的知识。
谢谢版主的热情帮助!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2