中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 读取文件名作菜单选项,并可分别选择执行相应命令。
作者:
标题: 读取文件名作菜单选项,并可分别选择执行相应命令。 上一主题 | 下一主题
f6fly
初级用户




积分 123
发帖 13
注册 2004-2-24
状态 离线
『楼 主』:  读取文件名作菜单选项,并可分别选择执行相应命令。

当前目录有多个txt文件,现在我想用批处理将每个txt文件做为一个菜单,当用户选择某个txt文件时,则显示选中的txt文件内容。

如c:\下有以下txt文件:
1.txt
2.txt
3.txt

我现在要做个批处理,运行时显示
[1] 显示1.txt内容
[2] 显示2.txt内容
[3] 显示3.txt内容
Select:
这里当用敲1回车,则运行type 1.txt,
敲2回车,则运行type 2.txt,
敲3回车,则运行type 3.txt,

请问各位高手该如何写才好呢?

2010-4-2 14:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 2 楼』:  


@echo off
:s
cls
echo.当前目录存在文本文件:
echo.********************
dir /b /a *.txt
echo.********************
set p=
set/p p=请输入文本文件名称(不含.扩展名):
if not exist "%p%.txt" echo.输入错误&goto e
type %p%.txt
:e
echo.********************
pause
goto s




批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-4-2 15:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
f6fly
初级用户




积分 123
发帖 13
注册 2004-2-24
状态 离线
『第 3 楼』:  

果真厉害,
现在是需要输入整个文件名,或是想输入序号该怎么做?如输入1,则type 第一个文件。...

2010-4-2 15:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 4 楼』:  


@echo off
:s
cls&Endlocal
setlocal enabledelayedexpansion
echo.当前目录存在文本文件:&echo.********************
for /F "delims=" %%a in ('dir /b /a *.txt') do set/a a+=1&set "han_!a!=%%a"&echo.[!a!] 显示 %%a 的内容
echo.********************
set/p p=请输入[]内的代码:
if not defined han_%p% echo.输入错误&goto e
type "!han_%p%!"
:e
echo.&echo.********************&pause
goto s
cls
清屏.
Endlocal
结束本地化,用于清除goto s前所产生的所有本地化环境变量.
setlocal enabledelayedexpansion
开始本地化及启用延迟的环境变量扩展.
for /F "delims=" %%a in ('dir /b /a *.txt') do
解析当前目录中所有.txt文件名.
set/a a+=1从1
开始加记数并赋值给变量a.
set "han_!a!=%%a"
将%%a赋值给变量han_!a!.
echo.[!a!] 显示 %%a 的内容
输出信息.
if not defined han_%p% echo.输入错误&goto e
通过变量han_%p%是否存在来判断输入的%p%正确与否.
type "!han_%p%!"
显示文件!han_%p%!即for /f中的%%a文件名的内容

[ Last edited by Hanyeguxing on 2010-4-2 at 16:18 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-4-2 15:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
f6fly
初级用户




积分 123
发帖 13
注册 2004-2-24
状态 离线
『第 5 楼』:  

非常感谢。是这样的效果,可是为什么在纯DOS下运行出错呢,提示语法错误。

2010-4-2 16:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 6 楼』:  

纯dos下的set、for等,与xp sp3下的cmd命令解释器语法不一样
我从不写dos下的批处理



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-4-2 16:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
f6fly
初级用户




积分 123
发帖 13
注册 2004-2-24
状态 离线
『第 7 楼』:  

:s
@echo off&setlocal enabledelayedexpansion
cls
set a=0
echo.
echo.    当前目录有以下BIOS文件可供刷新:
echo.    *************************************
echo.
for /F "delims=" %%a in ('dir /b /a *.rom') do (
set/a a+=1
set "han_!a!=%%a"
echo.        [!a!] 刷新 %%a BIOS文件
echo.
)
echo.    *************************************
set p=
set/p p=    请输入要刷新的BIOS文件序号:
if not defined han_%p% echo.&echo.    输入错误,请按任意键继续,或按 Ctrl+C 终止程序!&goto e
@echo on
AFUDOS %p%.rom /P /B /N /C /S
@echo off
goto end
:e
echo.
rem echo.    *************************************
echo.    Press any key to continue... &pause >nul
goto s

:end

我改成了这种,
因为有多个BIOS文件可供选择刷新,在XP的CMD下运行正常,可为什么DOS下却不可以呢?

2010-4-2 16:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 8 楼』:  

因为我从没运行过dos ,所以你可以运行下面P脚本进行测试,并贴上所有的返回信息
@echo off&setlocal enabledelayedexpansion
echo.本批处理仅用于测试1
set a=0
for /F "delims=" %%a in ('dir /b /a *.rom') do (
set/a a+=1
set "han_!a!=%%a"
echo.代码:!a! 变量名:han_!a! 文件名:%%a
)
echo.本批处理仅用于测试2
set|find /i "han_"
echo.本批处理仅用于测试3
if defined han_1 (echo 完成.) else echo 测试
pause
很奇怪,你的主板不支持Q-Flash和@BIOS功能吗?为什么要进DOS刷呢?

[ Last edited by Hanyeguxing on 2010-4-2 at 18:29 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-4-2 18:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 9 楼』:  

你可以尝试把你的代码中部分做修改:


如果DOS下不支持for /f则
for /F "delims=" %%a in ('dir /b /a *.rom') do (
改成
for %%a in (*.rom) do (
在xp系统的批处理中,此语法的for不支持隐藏及系统属性的文件。

如果DOS下不支持if not defined,则
if not defined han_%p% echo.&echo.    输入错误,请按任意键继续,或按 Ctrl+C 终止程序!&goto e
改成
if "!han_%p%!"=="" echo.&echo.    输入错误,请按任意键继续,或按 Ctrl+C 终止程序!&goto e

[ Last edited by Hanyeguxing on 2010-4-2 at 19:14 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-4-2 19:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
f6fly
初级用户




积分 123
发帖 13
注册 2004-2-24
状态 离线
『第 10 楼』:  

因DOS下操作较多。

@echo off&setlocal enabledelayedexpansion
echo.TEST1
set a=0
for /F "delims=" %%a in ('dir /b /a *.rom') do (
set/a a+=1
set "han_!a!=%%a"
echo.Code:!a! variable:han_!a! filename:%%a )
echo.TEST2
set|find /i "han_"
echo.TEST3
if defined han_1 (echo SUCCESS.) else echo TEST
pause


执行结果如下:
A:\test.bat
off&setlocal enabledelayedexpansion

A:\echo.TEST1
TEST1

A:\set a=0

A:\for /F "delims=" %a in ('dir /b /a *.rom') do (
Synatax error

A:\set/a a+=1

A:\set "han_!a!=%a"

A:\echo.Code:!a! variable:han_!a! filename:%a )
Code:!a! variable:han_!a! filename:%a )

A:\echo.TEST2
TEST2

A:\set|find /i "han_"
Bad command or file name (注,我没有find命令)

A:\echo.TEST3
TEST3

A:\if defined han_1 (echo SUCCESS.) else echo TEST
Syntax error

A:\pause

请帮忙分析,谢谢。

2010-4-6 18:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: