中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]前些天写的输入验证,写得有些啰嗦,请大家修改
作者:
标题: [求助]前些天写的输入验证,写得有些啰嗦,请大家修改 上一主题 | 下一主题
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『楼 主』:  [求助]前些天写的输入验证,写得有些啰嗦,请大家修改


@echo off
setlocal enabledelayedexpansion

set values=ASCII,Big5,Big5-HKSCS,Cp037:-1,Cp273,Cp277,Cp278,Cp280,Cp284,Cp285,Cp297,Cp420,Cp424,Cp437,Cp500,Cp737,Cp775,Cp838,Cp850,Cp852,Cp855,Cp856,Cp857,Cp858,Cp860,Cp861,Cp862,Cp863,Cp864,Cp865,Cp866,Cp868,Cp869,Cp870,Cp871,Cp874,Cp875,Cp918,Cp921,Cp922,Cp930,Cp933,Cp935,Cp937,Cp939,Cp942,Cp942C,Cp943,Cp943C,Cp948,Cp949,Cp949C,Cp950,Cp964,Cp970,Cp1006,Cp1025,Cp1026,Cp1046,Cp1097,Cp1098,Cp1112,Cp1122,Cp1123,Cp1124,Cp1140,Cp1141,Cp1142,Cp1143,Cp1144,Cp1145,Cp1146,Cp1147,Cp1148,Cp1149,Cp1250,Cp1251,Cp1252,Cp1253,Cp1254,Cp1255,Cp1256,Cp1257,Cp1258,Cp1381,Cp1383,Cp33722,EUC-JP,EUC_JP_LINUX,EUC-KR,EUC_CN,EUC_TW,GB18030 ,GBK,ISCII91 ,ISO-2022-JP,ISO-2022-KR,ISO-8859-1,ISO2022CN,ISO2022CN_CNS,ISO2022CN_GB,ISO2022JP,ISO2022KR,ISO8859_1,ISO8859-2,ISO8859-3,ISO8859-4,ISO8859-5,ISO8859-6,ISO8859-7,ISO8859-8,ISO8859-9,ISO8859-13,ISO8859-15,JIS0201,JIS0208,JIS0212,JISAutoDetect,Johab,MacArabic,MacCentralEurope,MacCroatian,MacCyrillic,MacDingbat,MacGreek,MacHebrew,MacIceland,MacRoman,MacRomania,MacSymbol,MacThai,MacTurkish,MacUkraine,MS874,MS932,MS936,MS949,MS950,MS950_HKSCS,Shift_JIS,SJIS,TIS-620,TIS620,UnicodeBigUnmarked,UnicodeLittleUnmarked,US-ASCII,UTF-16,UTF-16BE,UTF-16LE,UTF-8,UTF8,windows-1250,windows-1251,windows-1252,windows-1253,windows-1254,windows-1255,windows-1256,windows-1257,windows-1258,windows-31j,x-EUC-CN,x-EUC-JP-LINUX,x-EUC-TW,x-MS950-HKSCS,x-mswin-936,x-windows-949:0,x-windows-950
:loop
set input=
set /p input=Input:
call :validate status indeces input values /n /i /x
echo !status!
echo !indeces!
goto :loop

:validate _envState _envIndex _envInput _envValues /n(/nn):Nullable /i(/ni):Ignore case /x(/nx):type eXit to quit
set ^%1=invalid
set ^%2=0
if not defined %3 (if "%5"=="/n" (set ^%1=valid)) & goto :EOF
if !%3!==exit (if "%7"=="/x" exit)
if "%6"=="/i" (set ignorecase_validate=/i) else (set ignorecase_validate= )
set values_validate=!%4:,=^

!
for /f "delims=: tokens=1,2" %%i in ("!values_validate!") do (
    if !%1!==valid goto :EOF
    if not "%%j"=="" (set ^%2=%%j) else set /a ^%2=!%2!+1
    if %ignorecase_validate% "!%3!"=="%%i" set ^%1=valid
)
goto :EOF
[ Last edited by obsolete on 2008-7-24 at 11:58 PM ]

2008-7-24 23:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 2 楼』:  

_envState 作返回值使用,表示输入是否合法
_envIndex 作返回值使用,用户输入在可选输入中的“索引”或排序,在可选输入中可以用:10指定排序值,并影响到后面所有可选输入的排序值。
_envInput 用户从控制台的输入
_envValues 可选输入集合,只允许通常的单词、数字,以半角逗号分隔,可以使用:5给某个可选输入指定排序值,这里指定了5

/n或/nn 输入是否允许为空
/i或/ni 是否区分大小写
/x或/nx 是否允许输入exit退出

2008-7-24 23:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




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

可以解释一下么?

看不太明白……

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





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 4 楼』:  

是写得很晦涩啊-_-||,稍微解释一下
:validate 是验证输入的子程序,可复用,参数用法见2楼
其它部分是调用:validate的一个演示程序,用于判断用户在控制台的输入是否是一个合法的编码,如果正确,返回它的排序值。(验证未通过时,返回的排序值没有意义)

2008-7-24 23:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: