中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]有关变量延迟及组合显示变量(变量套嵌)的问题
作者:
标题: [已结]有关变量延迟及组合显示变量(变量套嵌)的问题 上一主题 | 下一主题
exzzz
初级用户

游手好闲 + 无所事事 ..



积分 194
发帖 167
注册 2007-4-30
状态 离线
『楼 主』:  [已结]有关变量延迟及组合显示变量(变量套嵌)的问题

我在写一个批处理“查询ID.bat”的时候,脚本部分内容如下:
@echo off
echo 请输入名称?  部分汉字 或 拼音缩写 均可
set /p ting=
set n=0
echo 符合条件的服务厅列表如下:
for /f "tokens=1-4 delims=^|" %%a in ('type 查询ID.bat ^|findstr "%ting%"') do (
        set /a n=n+1
        set tingid!n!=%%a
        set tingname!n!=%%b
)
for /l %%i in (1,1,%n%) do (
        echo 编号:%tingid%%i%%   名称:%%tingname%%i%%
)

:data
1|大浪|dl
2|安徽|ah
3|大鹏|dp
4|大陆|dl
我输入 dl 后,希望得到的输出结果是:
1 大浪
4 大陆
但是现在得不到这个结果。在批处理中加上set可以看到系统生成了几个变量
tingid1=1
tingname1=大浪
tingid2=4
tingname4=大陆
我想请问下怎么样才能把这几个变量echo出来?我估计我错在【echo 编号:%tingid%%i%%   】这里了
我实在不知道如何组合显示这些变量,请协助,谢谢!

[ Last edited by exzzz on 2008-12-24 at 16:46 ]

2008-12-24 13:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

本版搜索“变量嵌套”



2008-12-24 13:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
exzzz
初级用户

游手好闲 + 无所事事 ..



积分 194
发帖 167
注册 2007-4-30
状态 离线
『第 3 楼』:  

OK,刚才没有想到这个关键词,呵呵,再去看看,稍后解决了我回来结帖

2008-12-24 13:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
exzzz
初级用户

游手好闲 + 无所事事 ..



积分 194
发帖 167
注册 2007-4-30
状态 离线
『第 4 楼』:  

已经搞定,固定字符为  tingid ,要显示变量 tingid1到tingid4,则可以这样表示

for /l %%i in (1,1,4) echo !tingid%%i!
@echo off&setlocal ENABLEDELAYEDEXPANSION
:start
title administrator 密码修改工具。(会顺便将inst的密码设置为gmcc@10086) XXX 版权所有
echo.
echo 请输入服务厅名称,部分汉字、拼音、拼音缩写均可(至少2个字符)~~~
echo 输入 h 可查看帮助
set ting=
set /p ting=
if /I "%ting%"=="h" goto help
if "%ting%"=="" goto start

rem 下面这段确定要跳过的行数num,避免了查询无效数据
for /f "delims=:" %%a in ('findstr /n /I /c:":data" 服务厅密码修改.bat') do set num=%%a
for /f "skip=%num%" %%a in (服务厅密码修改.bat) do echo %%a>>data.dat

set n=0
echo 符合条件的服务厅列表如下:
echo.
for /f "tokens=1-5 delims=^|" %%a in ('findstr /I /c:"%ting%" data.dat') do (
        set /a n=n+1
        set tingname!n!=%%b
        set tingpw!n!=%%e
)
del /f /s /q data.dat >nul 2>nul
for /l %%i in (1,1,%n%) do (
        echo 编号:%%i  服务厅:!tingname%%i!  管理员密码:【!tingpw%%i!】
)
:select
echo.
echo 请输入服务厅的编号以便设置本机管理员密码:
set ting=
set /p ting=

rem 判断变量是否数字,如果不是则返回select
rem 下面将变量写入文本,因为findstr好像不能 【findstr "[0-9]" 文本】
echo %ting%>data.dat
rem 用findstr判断变量是否数字,如果不是数字就输出为空,其他情况设置ting为数字
for /f %%a in ('findstr "[0-9]" data.dat') do set ting=%%a
rem 下面三行检查变量ting是否为空,以及是否小于0或大于列表的最大值,如果是,就返回select
if "%ting%"=="" goto select
if /i %ting% LEQ 0 goto select
if /i %ting% GTR %n% goto select

echo.
echo 将执行命令【net user administrator !tingpw%ting%!】
net user administrator !tingpw%ting%!
pause
net user inst gmcc@10086

:exit
exit


:help
title 帮助文件。内置密码文件为 20080115 版本         XXX 版权所有
cls
echo.
echo 输入服务厅的名字、拼音、缩写都可以模糊查询到数据
echo 内置的密码表是20080115版本的,如果以后更新了,请
echo 编辑本文件,并将最后的【:data】小节依样添加上去,
echo 并用 ^| 符号隔开,格式如下:
echo.
echo 序号^|服务厅名称^|拼音缩写^|拼音全称密码
echo.
pause
cls
goto :start


:data
1|洪湖|hh|honghu|xxxxxxx
2|湖贝|hb|hubei|xxxxxxx
3|火车站|hcz|huochezhan|xxxxxxx
4|宝安路|bal|baoanlu|xxxxxxx
5|布心|bx|buxin|xxxxxxx
第一次修改:
跳过了标签 :data 之前的数据,避免了findstr查询类似 a 这样在很多地方都有的数据导致产生的无效变量。

第二次修改:
增加了输入判断,第一次判断输入的服务厅缩写是否为空或h,如果是空则跳回开头,h跳到帮助。
第二个判断,是列出满足查询条件的厅列表后,判断输入的编号是否数字,以及数字范围是否超过1~%n%的范围,如果不满足条件,要求重新输入

[ Last edited by exzzz on 2008-12-24 at 19:08 ]

   此帖被 +9 点积分       点击查看详情   
评分人:【 moniuming 分数: +9  时间:2008-12-24 16:52


2008-12-24 16:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
exzzz
初级用户

游手好闲 + 无所事事 ..



积分 194
发帖 167
注册 2007-4-30
状态 离线
『第 5 楼』:  

另外有个缺陷,我不知道如何使用 findstr命令,从指定的行开始查询数据,
现在已经可以得到data开始的行数是56,但是不知道findstr怎么设置从56行开始查询数据。
因为如果你输入a,那么findstr会在56行之前的很多地方都发现a这个字符并设置变量,产生很多无用数据,请指教一下。
findstr /?里的帮助:
一般表达式的快速参考:
  .        通配符: 任何字符
  *        重复: 以前字符或类别出现零或零以上次数
  ^        行位置: 行的开始
  $        行位置: 行的终点
实在是看不懂。试过加上  ^56  ^:56  ^"56"  都无效。

搜索google和baidu  ”findstr 指定 行“无果,请哪位指点一下?

[ Last edited by exzzz on 2008-12-24 at 17:27 ]

2008-12-24 17:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 6 楼』:  Re 5楼

用 for skip=55 跳过前面的55行行么?



2008-12-24 18:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
exzzz
初级用户

游手好闲 + 无所事事 ..



积分 194
发帖 167
注册 2007-4-30
状态 离线
『第 7 楼』:  

呵呵,skip可以的,不过想探索一下findstr有无可能。

不过还是修改了一下脚本,现在可以跳过前面的数据了,不过临时产生了一个data.dat,不过马上就删除了。

[ Last edited by exzzz on 2008-12-24 at 18:36 ]

2008-12-24 18:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 8 楼』:  Re 7楼

findstr没有这样的功能,^用在正则表达式里面,表示以指定内容开头的行。



2008-12-24 18:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
gool123456
初级用户




积分 89
发帖 76
注册 2009-12-13
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by HAT at 2008-12-24 13:15:
本版搜索“变量嵌套”

还不会,先搜搜~



Discuz! 现在时间
2010-5-27 17:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: