中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-03 10:48
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 纯DOS下FOR语句执行,字符筛选得变量问题 查看 3,299 回复 28
16 发表于 2007-02-07 10:49 ·  中国 江苏 镇江 联通
中级用户
★★
积分 219
发帖 82
注册 2005-10-29 10:56
20年会员
UID 44240
状态 离线
把内容复制到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
17 发表于 2007-02-07 12:57 ·  中国 北京 朝阳区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
这问题好象以前遇到过,和 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,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
18 发表于 2007-02-07 13:04 ·  中国 江苏 镇江 联通
中级用户
★★
积分 219
发帖 82
注册 2005-10-29 10:56
20年会员
UID 44240
状态 离线
现在问题解决了
输入的时候不加扩展名,另外把你的只当作对变量的定义,不在里面做任何别的程序完全没问题,如果加了运行GHOST,就不能循环了。
www.jastyg.com
www.efengchi.com
19 发表于 2007-02-07 23:21 ·  中国 北京 东城区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
多谢jastyg兄提示,call %0.bat ... 已改正了: call %0 ... :)
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
20 发表于 2007-02-07 23:34 ·  中国 北京 东城区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
Originally posted by jastyg at 2007-2-7 00:04:
现在问题解决了
输入的时候不加扩展名,另外把你的只当作对变量的定义,不在里面做任何别的程序完全没问题,如果加了运行GHOST,就不能循环了。


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

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

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


(假如下面是总调用代码:)



CALL 第9楼代码

GHOST 后面参数中含有%P%

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

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
21 发表于 2007-02-08 02:07 ·  中国 江苏 镇江 电信
中级用户
★★
积分 219
发帖 82
注册 2005-10-29 10:56
20年会员
UID 44240
状态 离线
对,现在就跟你上面说的想法一致,就是这样做的.
从你的BAT里获得%P%
然后退出你的BAT
运行ghost -clone,mode=pload,src=ibm.gho:1,dst=1:%p% -sure -fx
运行没任何问题.

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


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

[ Last edited by jastyg on 2007-2-8 at 02:31 AM ]
www.jastyg.com
www.efengchi.com
22 发表于 2007-02-08 02:22 ·  中国 北京 东城区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
多谢兄指点和提供了更好的实现方法~:)
我一会儿去看一下XSET和相关Ghost的东东~:)
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
23 发表于 2007-02-08 02:34 ·  中国 江苏 镇江 电信
中级用户
★★
积分 219
发帖 82
注册 2005-10-29 10:56
20年会员
UID 44240
状态 离线
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
redtek +6 2007-02-09 02:30
www.jastyg.com
www.efengchi.com
24 发表于 2007-02-08 05:19 ·  中国 北京 东城区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
改进了一下,不再使用FOR循环CALL自己,因每CALL自己一次直至代码找到目标及全部代码运行完共约执行15次(或以上)CALL和FIND操作…

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

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



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





@echo %dbg% off


if NOT == goto :SEARCH

ghost -dd >nul
find "" 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 == goto :end
find "1.%1: " ghststat.txt > tmp.tmp
if errorlevel 1 goto :SEARCH
SET p=%1

:: ============================ info list =======
Echo 1.%p%:
Echo P=%p%
:: ==============================================

del tmp.tmp >nul

:END





多谢qzwqzw兄指点,代码已更正~:)

[ Last edited by redtek on 2007-2-7 at 04:38 PM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
qzwqzw +7 2007-02-08 06:26
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
25 发表于 2007-02-08 05:33 ·  中国 山西 运城 联通
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
:Search段有问题

shift不应插在if与find的中间

if errorlevel 2 是没有必要的
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
redtek +7 2007-02-09 02:29
26 发表于 2007-02-08 05:36 ·  中国 北京 东城区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
多谢qzwqzw兄指点~:)))
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
27 发表于 2007-02-08 23:00 ·  中国 江苏 镇江 电信
中级用户
★★
积分 219
发帖 82
注册 2005-10-29 10:56
20年会员
UID 44240
状态 离线
多谢兄弟们的帮忙
对了,关于 shift的用法能说明一下么?我搜索了本站相关内容说的有些含糊(或者我理解能力差),还是搞不清!

谢谢
www.jastyg.com
www.efengchi.com
28 发表于 2007-02-09 02:43 ·  中国 北京 朝阳区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
Shift 命令在很多教程里写得太复杂(主要是作者在写Shift命令的时候把一些不相关的内容全都加了进去故意造就一种强大而复杂玄虚的释解,让人看到最后都不知道作者在说什么:)



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


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

http://www.cn-dos.net/forum/viewthread.php?tid=14338&fpage=1&highlight=SHIFT

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

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

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
29 发表于 2007-02-09 10:20 ·  中国 江苏 镇江 联通
中级用户
★★
积分 219
发帖 82
注册 2005-10-29 10:56
20年会员
UID 44240
状态 离线
多实在啊,这下明白了。
www.jastyg.com
www.efengchi.com
论坛跳转: