中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 纯DOS下FOR语句执行,字符筛选得变量问题
« [1] [2] »
作者:
标题: 纯DOS下FOR语句执行,字符筛选得变量问题 上一主题 | 下一主题
jastyg
中级用户





积分 219
发帖 82
注册 2005-10-29
状态 离线
『第 16 楼』:  

把内容复制到re.bat里
输入re.bat,得到15个错误命令的提示,查看发现call re.bat.bat 1---15有循环
输入re就直接call re.bat.bat 15,然后结束,没循环

我把%0.bat改为 %0,结果与上一样,很奇怪!!

[ Last edited by jastyg on 2007-2-7 at 11:30 AM ]



www.jastyg.com
www.efengchi.com
2007-2-7 10:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 17 楼』:  

这问题好象以前遇到过,和 MS-DOS 对 %0 变量的赋值有关,而且特别有意思:)

在执行一个批处理文件时(MS-DOS),在命令提示符的右边和在回车键之前所输入的内容,就是运行一个批处理文件时的 %0 的参数内容:)


如下实验:
@echo off

REM  下面是显示字符串 CALL  %0.BAT  来验证批处理%0参数的范围
echo  CALL %0.bat
我把 re.bat (上面批处理文件)放入 C:\DEMO\ 目录内。
在目录内执行:
re
会显示结果:

CALL RE.BAT  

这 %0 就是刚才键入的 re 。

再试验键入批处理全称:
re.bat
显示结果:CALL re.bat.bat   
实际上  re.bat 是我们键入的内容。在re.bat后面的.bat 是在批处理中写的内容:)


然后,我们在 c:\DOS 目录中直接调用 C:\DEMO\RE.BAT 这个批处理文件;
C:\DOS>   ..\demo\re.bat
显示结果: CALL  ..\demo\re.bat.bat

如果我写不同的大小写来调用:
C:\DOS>   ..\demo\Re.bAt
显示结果:  CALL  ..\demo\Re.bAt.bat


根据上面实验,%0参数是来自DOS命令提示符右边到按回车键之间的所输入的全部内容:)





所以,我原编的代码没想到这点,有问题:)
兄,调用这个批处理的时候先不要加扩展名,或是根据上面实验改动一下:)



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2007-2-7 12:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jastyg
中级用户





积分 219
发帖 82
注册 2005-10-29
状态 离线
『第 18 楼』:  

现在问题解决了
输入的时候不加扩展名,另外把你的只当作对变量的定义,不在里面做任何别的程序完全没问题,如果加了运行GHOST,就不能循环了。



www.jastyg.com
www.efengchi.com
2007-2-7 13:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 19 楼』:  

多谢jastyg兄提示,call %0.bat ... 已改正了: call %0 ... :)



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2007-2-7 23:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 20 楼』:  



  Quote:
Originally posted by jastyg at 2007-2-7 00:04:
现在问题解决了
输入的时候不加扩展名,另外把你的只当作对变量的定义,不在里面做任何别的程序完全没问题,如果加了运行GHOST,就不能循环了。

我不懂Ghost命令行加参数操作(这部份我实验起来可能会遇到很多麻烦或错误百出:)

兄通晓Ghost命令行参数等操作,建议兄只当9楼代码功能为: 如果发现了 1.?: [IBM_SERVICE] 就自动将其?问号处数字值赋与变量 %P% ,然后退出批处理。

这样在环境变量中就有了变量%P%,然后兄再使用Ghost加变量%P%做其中的参数之一来进行恢复或是备份操作:)


(假如下面是总调用代码:)
CALL  第9楼代码

GHOST  后面参数中含有%P%




    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2007-2-7 23:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jastyg
中级用户





积分 219
发帖 82
注册 2005-10-29
状态 离线
『第 21 楼』:  

对,现在就跟你上面说的想法一致,就是这样做的.
从你的BAT里获得%P%
然后退出你的BAT
运行ghost -clone,mode=pload,src=ibm.gho:1,dst=1:%p% -sure -fx
运行没任何问题.

这样做的确实就是查找的时间稍微长了点,而且准确性只能达到无限接近.
如果可以通过比如:
[IBM_SERVICE]和前面的DESC这2个字符的位置,通过筛选得到%P%,这样就更准确,而且时间方面也应该会减少!


以前Wengier帮我写过一个的是通过XSET筛选并定义%p%.
兄有兴趣我可以发给你看看!

[ Last edited by jastyg on 2007-2-8 at 02:31 AM ]



www.jastyg.com
www.efengchi.com
2007-2-8 02:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 22 楼』:  

多谢兄指点和提供了更好的实现方法~:)
我一会儿去看一下XSET和相关Ghost的东东~:)



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2007-2-8 02:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jastyg
中级用户





积分 219
发帖 82
注册 2005-10-29
状态 离线
『第 23 楼』:  

http://blog.cersp.com/userlog3/71202/archives/2007/243983.shtml

里有一些关于XSET的用法

   此帖被 +6 点积分      点击查看详情   
评分人:【 redtek 分数: +6  时间:2007-2-9 02:30




www.jastyg.com
www.efengchi.com
2007-2-8 02:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 24 楼』:  

改进了一下,不再使用FOR循环CALL自己,因每CALL自己一次直至代码找到目标及全部代码运行完共约执行15次(或以上)CALL和FIND操作…

一次将15个参数直接CALL出去,然后一次性通过SHIFT命令左移每一位被CALL的参数来处理,这样总共代码以及被CALL的程序调用,一共只用约3次完成,即从原来的15次以上的处理过程减少至只到目标出现为止。

先FIND生成只有一行的含有 [IBM_SERVICE] 目标串的行,然后在以后的FIND调用过程只要对只有这一行的目标文件操作,速度提高了一部分。



根据多次实验,只有ghost -dd >nul 这句是 Ghost 生成磁盘等信息文件的参数,这个最浪费时间,希望Ghost开发公司对生成此文件的速度有待改进。如果不是Ghost -dd 浪费时间,下面代码执行总时间约在1秒以内。
@echo %dbg% off


if NOT [%1]==[] goto :SEARCH

        ghost -dd >nul
        find "[IBM_SERVICE]" ghststat.txt > tmp.tmp
        call %0 -,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
       
        goto :END


:SEARCH
        shift
        if [%1]==[] goto :end
        find "1.%1: [IBM_SERVICE]" ghststat.txt > tmp.tmp
        if errorlevel 1 goto :SEARCH
        SET p=%1

        :: ============================ info list =======
        Echo 1.%p%: [IBM_SERVICE]
        Echo P=%p%
        :: ==============================================

        del tmp.tmp >nul
       
:END
多谢qzwqzw兄指点,代码已更正~:)

[ Last edited by redtek on 2007-2-7 at 04:38 PM ]

   此帖被 +7 点积分      点击查看详情   
评分人:【 qzwqzw 分数: +7  时间:2007-2-8 06:26




    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2007-2-8 05:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2343
发帖 636
注册 2004-3-6
状态 离线
『第 25 楼』:  

:Search段有问题

shift不应插在if与find的中间

if errorlevel 2 是没有必要的

   此帖被 +7 点积分      点击查看详情   
评分人:【 redtek 分数: +7  时间:2007-2-9 02:29


2007-2-8 05:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 26 楼』:  

多谢qzwqzw兄指点~:)))



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2007-2-8 05:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jastyg
中级用户





积分 219
发帖 82
注册 2005-10-29
状态 离线
『第 27 楼』:  

多谢兄弟们的帮忙
对了,关于 shift的用法能说明一下么?我搜索了本站相关内容说的有些含糊(或者我理解能力差),还是搞不清!

谢谢



www.jastyg.com
www.efengchi.com
2007-2-8 23:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 28 楼』:  

Shift 命令在很多教程里写得太复杂(主要是作者在写Shift命令的时候把一些不相关的内容全都加了进去故意造就一种强大而复杂玄虚的释解,让人看到最后都不知道作者在说什么:)



有一个帖子里关于 Shift 命令写得特别直接而精彩~:)


shift这个批处理命令的用法 (在下面帖子的第3楼)

http://www.cn-dos.net/forum/view ... amp;highlight=SHIFT

上面帖子大约原理就是每执行一遍 SHIFT ,被 Call 进来(传递进来的参数)就会被全部向左移一位。

这样每执行一次 SHIFT 就向左移一位,如果是在处理 %1 这个参数,就可以象永远在处理 %1 这个参数(但它每次都是动态的,因为SHIFT命令又会把右边的%N参数向左移过来),就是有再多 CALL 过来的参数(如:从%1--%N),全都可以依次的使用Shift将它们一一处理完,直至 %1 为空(未赋值状态)为止:)



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2007-2-9 02:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jastyg
中级用户





积分 219
发帖 82
注册 2005-10-29
状态 离线
『第 29 楼』:  

多实在啊,这下明白了。



www.jastyg.com
www.efengchi.com
2007-2-9 10:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: