Board logo

标题: [已结]有关变量延迟及组合显示变量(变量套嵌)的问题 [打印本页]

作者: exzzz     时间: 2008-12-24 13:13    标题: [已结]有关变量延迟及组合显示变量(变量套嵌)的问题

我在写一个批处理“查询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 ]
作者: HAT     时间: 2008-12-24 13:15
本版搜索“变量嵌套”
作者: exzzz     时间: 2008-12-24 13:16
OK,刚才没有想到这个关键词,呵呵,再去看看,稍后解决了我回来结帖
作者: exzzz     时间: 2008-12-24 16:42
已经搞定,固定字符为  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 ]
作者: exzzz     时间: 2008-12-24 17:25
另外有个缺陷,我不知道如何使用 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 ]
作者: HAT     时间: 2008-12-24 18:20    标题: Re 5楼

用 for skip=55 跳过前面的55行行么?
作者: exzzz     时间: 2008-12-24 18:24
呵呵,skip可以的,不过想探索一下findstr有无可能。

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

[ Last edited by exzzz on 2008-12-24 at 18:36 ]
作者: HAT     时间: 2008-12-24 18:26    标题: Re 7楼

findstr没有这样的功能,^用在正则表达式里面,表示以指定内容开头的行。
作者: gool123456     时间: 2010-5-27 17:19


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

还不会,先搜搜~