Board logo

标题: [已结]setlocal EnableDelayedExpansion 与 "!" [打印本页]

作者: kcdsw     时间: 2006-6-11 15:31    标题: [已结]setlocal EnableDelayedExpansion 与 "!"

今天值班,实在无聊 cs被人菜,qq没人聊.想写bat也没绕过来  昏到在阵地上了
还望兄弟们指点
setlocal EnableDelayedExpansion
set m=0
for /f "tokens=*" %%m in ('findstr /v /C:"730 730" cover.ps') do (

    if !m![ == 686[ (pause) else (echo %%m >>cover3.txt)
set /a m=!m! + 1
   
)

pause
exit
如果使用set 再echo 那么文本中的%会被替换掉.  
如果使用call,而不启用变量延迟,将for的%%m传递给call的时候同样会丢失东西
所以我还是启用了变量延迟,所造成的结果就是! 都不见了 希望高手赐教

[ Last edited by willsort on 2006-6-20 at 11:37 ]
作者: namejm     时间: 2006-6-12 23:48
  既然起用了变量延迟,为什么还要用%m%来引用呢?应该该成!m!才对啊。
作者: namejm     时间: 2006-6-13 13:31
  我测试了一下下面的代码,它已经加了1了啊,你到底想让它变成多少呢?

  具体的代码有没有问题,因为你想要实现的功能不明了,我没去细看,但是至少是能够加1的,要不然你试试吧。
@echo off
setlocal EnableDelayedExpansion
set m=0
for /f "tokens=*" %%m in ('findstr /v /C:"730 730" cover.ps') do (

    if %m%[ == 686[ (pause) else (echo %%m >>cover3.txt)
set /a m=%m% + 1
echo !m!   
)

pause
exit

作者: kcdsw     时间: 2006-6-17 10:29
希望高手能给个思路!  谢谢
作者: bagpipe     时间: 2006-6-17 12:17
setlocal EnableDelayedExpansion
set m=0
for /f "tokens=* delims=" %%m in ('findstr /v /C:"730 730" cover.ps') do (
if "!m!"=="686" (pause) else echo %%m >>cover3.txt
set /a m=!m!+1
)
pause
exit
不知道楼主想要什么样的效果,这个批处理没有什么错误的地方
作者: kcdsw     时间: 2006-6-17 13:28
是这个意思  如果一旦cover.ps中 含有感叹号的时候
会因为启用变量延迟 而造成这个感叹号不能被echo 到新文件中去
作者: bagpipe     时间: 2006-6-17 15:09
@echo off
set m=0
for /f "tokens=*" %%m in ('findstr /v /C:"730 730" 2.txt') do (
setlocal EnableDelayedExpansion
set /a m=!m!+1
if "!m!"=="686" (pause) else setlocal DISABLEDELAYEDEXPANSION&&echo %%m>>test.txt
)
echo %m%

方法有点糙,不过这个问题有待考虑考虑了,楼主试试这个先
作者: kcdsw     时间: 2006-6-17 15:17
.....
F:\Print\blogcn订单\用户单\163>
setlocal EnableDelayedExpansion
set /a m=!m!+1
if "!m!" == "686" (pause)  els
192.168.0.158\\BlogPrinting\\Sy
e\\CoverPage_BG.jpg) 1>>test.tx
)
已经达到最大的 setlocal 递归层。
已经达到最大的 setlocal 递归层。

这是运行记录
作者: kcdsw     时间: 2006-6-17 15:18
而且感叹号 还是不见了
作者: bagpipe     时间: 2006-6-17 15:20
看来重复调用会出现这个问题,不过行数如果少的话是可以的,我刚刚已经测试了,没有想到这个问题,在考虑考虑
作者: bagpipe     时间: 2006-6-17 15:21
你的什么系统啊?我测试的是2000
作者: willsort     时间: 2006-6-17 15:22

───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:移动主题:自 DOS疑難解答 & 問題討論(解答室)
说明:依照主题内容分类,更适合于发表在此版区
处罚:扣除因发表该主题而奖励的6点积分,版区违规惩罚性扣除2点积分
───────────────── 版务记录 ─────────────────


Re kcdsw:

      首先,set/a有一套独立的变量识别机制,不需要使用!m!的形式延迟变量扩展,直接使用set /a m+=1 即可。而使用3楼中的 set /a m=%m%+1 反而会因为始终饮用初始化的变量,而出现无法持续递增的问题。

      其次,关于文本中的!被转义的问题,解决办法仍然是关闭变量延迟并使用call,只是传递%%m时不再使用命令行参数,而是使用环境变量。如下:
@echo off
set m=0
for /f "tokens=*" %%m in ('findstr /v /C:"730 730" cover.ps') do (
    set line=%%m
    call :Output
    set /a m+=1
)
pause
exit

:Output
if "%m%" == "686" (pause) else (echo %line% >>cover3.txt)
goto :eof
[ Last edited by willsort on 2006-6-17 at 15:24 ]
作者: bagpipe     时间: 2006-6-17 15:33
原来如此啊.......
作者: kcdsw     时间: 2006-6-17 15:38
泪流而....继续发帖


我传上来了


目的是在含有 730 730 这一行 通过它下一行的象素数据 重新计算它的宽度
ps: 730 730 为长宽值  但是原照片不是正方形  所以长宽比例错了  我想借用这个改成正确的  不想却出了篓子 把感叹号丢了

我的环境是 xp sp2 (oem正版)

[ Last edited by kcdsw on 2006-6-17 at 15:44 ]
附件 1: 163.rar (2006-6-17 15:39, 14.39 K, 下载附件所需积分 1点 ,下载次数: 52)

作者: kcdsw     时间: 2006-6-17 15:51
F:\Print\blogcn订单\用户单\163>if "17" == "day" call setp
此时不应有 <<。

F:\Print\blogcn订单\用户单\163>echo lineto/num num 1 sub def num 0 le{exit}if}lo
op}bd/EmptyDict <<>> def  >>cover3.txt
作者: kcdsw     时间: 2006-6-19 13:26
拜托 再帮我看看吧
作者: willsort     时间: 2006-6-19 18:58
Re kcdsw:

      抱歉!你的问题我很快就注意到了,但是遗憾的是,当时和后来我做了许多的测试,结果证明使用for+echo的方法复制和编辑文本存在很多问题,尤其是对类似cover.ps这类含有相当多特殊字符的文件。

      于是我准备改弦更张,使用其它的方法编辑文本。

      第一个想到的方法是edlin,因为它是NT系列自带的命令行方式的文本编辑器,结果费了一番工夫之后,发现edlin不能处理超长的文件,文件只加载到530多行便结束了。

      于是,所余的路径便只有第三方脚本工具了。考虑到只是替换一些简单的文本,所以选择了sed,其脚本编写起来并不繁琐。使用GNU sed 3.02测试了以下代码,结果是正确且高效的。
@echo off

::取原始的位置参数
::for /f "tokens=1,2,3,4,5,6,7" %%a in ('findstr /C:"DeviceRGB" cover.ps') do set jpg=%%a %%b %%c %%d %%e %%f %%g

::取图片的象素值进行判断
for /f "tokens=2,3" %%h in ('findstr /C:"setcolorspace" cover.ps') do (
    if %%h EQU %%i echo 封面中的作者照片无须更改!
    if %%h LSS %%i echo 照片不规则!
    if %%h GTR %%i set /a newsize=730*%%h/%%i
)

::::获取所在行行号和内容
::for /f "tokens=1,* delims=:" %%m in ('findstr /N /C:"730 730" temp.ps') do (
::    set iLN=%%m
::    set sLine=%%n
::)
::
::set sLine=%sLine:730 730=!newsize! 730%
::
::echo %iLn%d> _temp.edl
::echo i%iLn%>> _temp.edl
::echo %sLine%>> _temp.edl
::echo >> _temp.edl
::echo %iLn%,%iLn%l>> _temp.edl
::echo e>> _temp.edl
::
::edlin cover.ps < _temp.edl

:: 将新的大小写入指定行
if %newsize% NEQ 0 sed -e "s/\(.*\)730\( 730.*\)/\1%newsize%\2/" cover.ps >cover3.txt
[ Last edited by willsort on 2006-6-20 at 10:31 ]
作者: kcdsw     时间: 2006-6-20 10:15

@echo off
setlocal EnableDelayedExpansion

::取原始的位置参数
for /f "tokens=1,2,3,4,5,6,7" %%a in ('findstr /C:"DeviceRGB" cover.ps') do set jpg=%%a %%b %%c %%d %%e %%f %%g

::取图片的象素值进行判断
for /f "tokens=2,3" %%h in ('findstr /C:"setcolorspace" cover.ps') do (
    if %%h EQU %%i echo 封面中的作者照片无须更改!
    if %%h LSS %%i echo 照片不规则!
    if %%h GTR %%i set /a newsize=730*%%h/%%i
)

:: 将新的大小写入指定行
if %newsize% NEQ 0 sed -e "s/\(.*\)730\( 730.*\)/\1%newsize%\2/" cover.ps >cover3.txt
那这样写的话是不是只是替换了原先的730 730 ?
如果是这样,那我第一行的for 是不是可以不要了?
只需要提取出象素大小,然后计算出所需的新数据 然后替换?


能否提供你所说的sed的版本下载?

[ Last edited by kcdsw on 2006-6-20 at 10:29 ]
作者: willsort     时间: 2006-6-20 10:30
Re kcdsw:

      没错,是这样的。

      原代码中第一个for语句,是在考虑for+echo和edlin方案时使用的,改用sed方案后因其不影响结果输出,而忽略了将其删除。类似的语句还有setlocal。

      现已将原代码进行了修改。

      sed下载链接请参考[1],请注意使用GNU sed 4.0.7会过滤掉文本行中的回车符(0x0D),生成Unix格式文本。GNU sed 3.02 则没有这个问题。

[1] GNU utilities for Win32
http://unxutils.sourceforge.net/

[ Last edited by willsort on 2006-6-20 at 10:39 ]
作者: kcdsw     时间: 2006-6-20 11:33
呵呵  谢谢版主  

先前我很固执的要用批处理,可能是我的心理在做怪
总是觉得外来的程序大多没中文注解,也不是自己写的,也不放心,难学难懂
今天一用 感觉不错
作者: kcdsw     时间: 2006-6-20 11:37
用 QuickBFC 编译了一下

编译的时候把sed捆绑进去了

因为编译后的exe在运行的时候首先需要把原先的bat文件释放出来,位置是%temp%
我想 它释放捆绑文件的路径大概也是这里,或者是exe所在的文件夹
这样 exe会自动把cover.ps的路径传递给bat 和 sed ,那我就是更省心了,省的sed和bat不在一起.省的我告诉它cover.ps的路径,省了N多事情哇!!!

在此 再次感谢版主和各位关注我帖子的兄弟!!

受小弟一拜!!
作者: jianyaogao     时间: 2007-3-17 23:34
好难不懂
作者: hegu     时间: 2007-5-13 12:31
好多高手!!!!!!倾慕中....
作者: kgdetg1127     时间: 2007-10-12 22:23
牛BI。顶上去。
作者: zhouyongjun     时间: 2008-10-31 13:54
稀里糊涂的,下下来看下。
作者: wujianlin555     时间: 2008-11-20 23:00
下来看看