中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [疑难]自己写的脚本,隐含有错误,但检查不出,请大家帮忙
作者:
标题: [疑难]自己写的脚本,隐含有错误,但检查不出,请大家帮忙 上一主题 | 下一主题
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『楼 主』:  [疑难]自己写的脚本,隐含有错误,但检查不出,请大家帮忙

经过两天的时间,在论坛里发贴求教,终于写出了一个基本满足自己需求的脚本.可是但偶尔还是会中途自动退出.特上来请大家帮忙检查一下:
@echo off
setlocal
color 0A
:begin
set idlepc=
set cisco=
set iosname=
set ciscoios=
cls

echo                                    1:3620
echo                                    2:3640
echo                                    3:3660
echo                                    4:7200
echo                                    5:3840
echo                                    q:退出
                                             
set /p cisco=                     请输入想要模拟的路由器类型(1,2,3,4,5或q):
echo ================================================================================
if {%cisco%}=={} goto begin
if /i %cisco%==1 goto getfilename
if /i %cisco%==2 goto getfilename
if /i %cisco%==3 goto getfilename
if /i %cisco%==4 goto getfilename
if /i %cisco%==5 goto getfilename
if /i %cisco%==q goto quit
goto begin

:getfilename
if /i %cisco%==1 set name=3620
if /i %cisco%==2 set name=3640
if /i %cisco%==3 set name=3660
if /i %cisco%==4 set name=7200
if /i %cisco%==5 set name=3640

:: 查找IOS
findstr /ic:"bin" idlepc.txt >temp.txt
findstr /ic:"bin" temp.txt >idlepc.txt
dir "*.bin" | find /I "%name%" > temp.txt
FOR /F "tokens=4" %%a IN (temp.txt) do (set ios=%%a)
set  iosname=%CD%\%ios%
del temp.txt

:: 查找Idlepc
for /F "tokens=1,2 delims==,>, " %%i in (idlepc.txt) do (if  %%i==%ios%  set idlepc=%%j)
goto router

:router
cls
echo ================================================================================
echo                       检测出当前目录下的IOS文件为:%ios%
echo                       检测出当前IOS的Idlepc值为:%idlepc%
echo ================================================================================                                                  
echo 如果IOS检测正确请直接回车确认,否则
:reinput
set /p ciscoios=请直接将%name% IOS拖到本窗口:
echo ==============================================================================
if   {%ciscoios%}=={} (
      if   {%ios%}=={} goto reinput
)
if not exist %ciscoios% goto reinput
rem 需要加入对%ciscoios%的验证:以bin结尾.但不知道如何写
set iosname=%ciscoios%
echo 如果idlepc值检测正确请直接回车确认
echo 如果想计算Idlepc值,请输入空格,否则
:ldlepc
set /p idlepc=请输入idlepc值(形式为0xaaaaaaaa):
rem 加入对idlepc的验证,也不知道如何实现
if "%idlepc%"=="" set idlepc=
echo ================================================================================
echo                       您使用的IOS为:%iosname%
echo                       您使用的IOS Idlepc值为:%idlepc%                                                         
echo ================================================================================
if "%idlepc%" == "" echo 警告:由于Idlepc值为空,将严重影响你的系统速度
if "%idlepc%" == "" goto setup
if "%idlepc%" == " " goto setup
:: 加入新的idlepc值
call:Print %iosname%
:Print
    for /F "tokens=1,2 delims==,>, " %%i in (idlepc.txt) do if  %%i+%%j==%ios%+%idlepc%  goto setup
    set filename=%~nx1   
    echo. >>idlepc.txt
    <nul set/p=%filename% ======^>^>^> %idlepc%>> Idlepc.txt
goto setup

:setup
set /p choice=请输入要运行的设备(r1,r2,r3,r4,r5,r6,sw1,sw2,bb):
if /i  %choice%==r1  goto aaa
if /i  %choice%==r2  goto aaa
if /i  %choice%==r3  goto aaa
if /i  %choice%==r4  goto aaa
if /i  %choice%==r5  goto aaa
if /i  %choice%==r6  goto aaa
if /i  %choice%==sw1 goto aaa
if /i  %choice%==sw2 goto aaa
if /i  %choice%==bb  goto aaa
echo 输入不误,请重新输入!
set /p select=请选择按(y)重新输入;按(q)返回主菜单
rem 最好能实现按任意键返回到setup
if /i %select%==y goto setup
if /i %select%==q goto begin


:aaa
call:new.bat
[ Last edited by yardian on 2006-10-20 at 09:28 ]

2006-10-20 06:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『第 2 楼』:  

说明一下:其中有几处没实现的地方用注释指出了
另外:
if not exist %ciscoios% goto reinput
这句的作用是想验证当手动输入的时候,其是否存在,但当ciscoios为空的时候,会提示:'reinput' 不是内部或外部命令,也不是可运行的程序或批处理文件。
不知如何解决.

[ Last edited by yardian on 2006-10-20 at 15:24 ]

2006-10-20 06:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 3 楼』:  


  我想楼主最好把这个批处理的作用和实现思路和大伙说一下比较好……


2006-10-20 06:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 4 楼』:  

  请把 idlepc.txt 等文件的内容贴一部分出来,以便于查错。感觉这段代码还可大为精简。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-20 06:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 5 楼』:  

好东东,快全部发上来啊




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-10-20 06:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by electronixtar at 2006-10-20 06:56 AM:
好东东,快全部发上来啊

楼上的知道我写这个做什么?


idlepc.txt的内容都是形如:c7200-ik9o3s-mz.123-17a.bin ======>>> 0x60729c0c 的
我的需求是:运行程序,
1.选择需要模拟的对象(通过,1.2.3.4.5.q选择)
1.1.检测当前目录下有没有IOS(格式为:xxxx.bin有则显示并赋值给iosname,没有显示空)
1.2.检测idlepc.txt有没有匹配的内容(如果有则显示该值并赋值给idlepc.没有显示空)
1.3.检测idelpc.txt的内容是否标准,并删除不标准的部分.
2.要求输入ios,并显示,改写iosname的值.需要检测ios是否符合xxx.bin,不符合重新输入,同时如果为空,要求重新输入
3,要求输入idlepc值,并显示.同时改写idlepc值.需要检测是否以0x开头,而且一共只有10位
4.将输入的iosname和idlepc值以iosname======>>>>idlepc的形式写入idlepc.txt
5.选择r1,r2,r3,r4.....符合选项继续,不符合,提示重新输入,还是返回开始菜单.
6,如果5成立.调用外部bat
7.由于外部bat,变化较大.暂时还没想到用什么方法尽可能使用变量,以增加灵活性.所以就没什么问题了

[ Last edited by yardian on 2006-10-20 at 09:34 ]

2006-10-20 09:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『第 7 楼』:  

晕,没人帮忙了?自己小顶一下

2006-10-20 22:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zerocq
中级用户




积分 458
发帖 196
注册 2006-10-5
状态 离线
『第 8 楼』:  

测了一下下代码,好像代码是没写错

但楼主要注意一下代码分段可能效果好点

你说的那一段我运行也会出现你说的那种错误
================================================================================                                                  
echo 如果IOS检测正确请直接回车确认,否则
:reinput
set /p ciscoios=请直接将%name% IOS拖到本窗口:
echo ==============================================================================
if   {%ciscoios%}=={} (
      if   {%ios%}=={} goto reinput
)
if not exist %ciscoios% goto reinput
rem 需要加入对%ciscoios%的验证:以bin结尾.但不知道如何写


我把:reinput上边加几个空行
rem这句去掉就没有问题了咯
不知道是什么原因:P

分段容易阅读,P处理可能效果也好点^_^

2006-10-21 01:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『第 9 楼』:  

嗯.是的.谢谢!去掉后是没问题了.
namejm版主呢?不是说可以精简吗?能不能帮忙精简一下?写这些代码已经费了很大劲.如果精简可是一点都不会的.麻烦你帮帮忙吧

2006-10-21 03:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zerocq
中级用户




积分 458
发帖 196
注册 2006-10-5
状态 离线
『第 10 楼』:  

直接看代码精简应该不容易哇

把用到的文本文件内容,各bin文件名列一些出来才方便精简咯

这里有一个地方可以
if {%cisco%}=={} goto begin
if /i %cisco%==1 goto getfilename
if /i %cisco%==2 goto getfilename
if /i %cisco%==3 goto getfilename
if /i %cisco%==4 goto getfilename
if /i %cisco%==5 goto getfilename
if /i %cisco%==q goto quit




直接改成
if {%cisco%}=={} goto begin
if /i %cisco%==1 set name =3620
if /i %cisco%==2 set name =3640
if /i %cisco%==3 set name =3660
if /i %cisco%==4 set name =7200
if /i %cisco%==5 set name =3840
if /i %cisco%==q goto quit

取消getfilename这一步:D

2006-10-21 04:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『第 11 楼』:  

谢谢,这一步真的是多余的

[ Last edited by yardian on 2006-10-21 at 05:06 ]

2006-10-21 04:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: