中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-12 04:40
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]有关变量延迟及组合显示变量(变量套嵌)的问题 查看 1,040 回复 8
楼 主 [已结]有关变量延迟及组合显示变量(变量套嵌)的问题 发表于 2008-12-24 13:13 ·  中国 广东 深圳 电信
初级用户
★★
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-04-30 09:43
19年会员
UID 87022
性别 男
状态 离线
我在写一个批处理“查询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 ]
2 发表于 2008-12-24 13:15 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
本版搜索“变量嵌套”
3 发表于 2008-12-24 13:16 ·  中国 广东 深圳 电信
初级用户
★★
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-04-30 09:43
19年会员
UID 87022
性别 男
状态 离线
OK,刚才没有想到这个关键词,呵呵,再去看看,稍后解决了我回来结帖
4 发表于 2008-12-24 16:42 ·  中国 广东 深圳 电信
初级用户
★★
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-04-30 09:43
19年会员
UID 87022
性别 男
状态 离线
已经搞定,固定字符为 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 "" 文本】
echo %ting%>data.dat
rem 用findstr判断变量是否数字,如果不是数字就输出为空,其他情况设置ting为数字
for /f %%a in ('findstr "" 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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
moniuming +9 2008-12-24 16:52
5 发表于 2008-12-24 17:25 ·  中国 广东 深圳 电信
初级用户
★★
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-04-30 09:43
19年会员
UID 87022
性别 男
状态 离线
另外有个缺陷,我不知道如何使用 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 ]
6 Re 5楼 发表于 2008-12-24 18:20 ·  中国 上海 联通
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
用 for skip=55 跳过前面的55行行么?
7 发表于 2008-12-24 18:24 ·  中国 广东 深圳 电信
初级用户
★★
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-04-30 09:43
19年会员
UID 87022
性别 男
状态 离线
呵呵,skip可以的,不过想探索一下findstr有无可能。

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

[ Last edited by exzzz on 2008-12-24 at 18:36 ]
8 Re 7楼 发表于 2008-12-24 18:26 ·  中国 上海 联通
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
findstr没有这样的功能,^用在正则表达式里面,表示以指定内容开头的行。
9 发表于 2010-05-27 17:19 ·  中国 广东 广州 电信
初级用户
★★
积分 89
发帖 76
注册 2009-12-13 13:41
16年会员
UID 156499
性别 男
状态 离线
Originally posted by HAT at 2008-12-24 13:15:
本版搜索“变量嵌套”


还不会,先搜搜~
论坛跳转: