在【批处理】中过滤特殊字符

http://tieba.baidu.com/p/137943723 众所周知,利用set /P可以让批处理接受输入,但经常会碰到这样的问题: 1、只允许输入数字; 2、当输入特殊字符“<、>、 &、 ^、 "”都会导致程序意外终止: 测试程序一: -------------------- @echo off :Test set /p Input=输入特殊字符之一“ ^< ”试试: echo %Input% goto :Test --------------------- 有什么办法可以解决以上的办法呢?首先让我们来解决第一个问题: 解决问题相应代码(千万记得删除每一行程序后面多余的空格): ----------------------------- @echo off :Test set Var=0 & rem 赋初值给Var set /p Input= set /a Var=%Input%>nul 2>nul if "%Var%"=="0" (echo 输入非法!) else echo ok! %Var% goto :Test ------------------------------ 程序利用的原理: 利用set命令的a开关,如果输入值不为一个数字时,则“set /a Var=%Input%>nul 2>nul”则会产生赋值失败,Var还会保持初值;否则Var值就会改变(0除外)。因此,利用此种方法,只要检测Var值是否改变,则可以判定输入值是否是数字。 让我们先来看看产生第二个问题的原因:上述的特殊字符(除"),在批处理里碰到set命令是被当作运算符来处理的,如果它后面没有对象的话,自然会产生错误。 举个例子: 在测试程序一中: 我们输入“<”会意外退出程序,如果构造一个特殊的输入:“< nul"则不会意外退出。 类似的,“>”,构造为:“> nul”,&(后跟命令)构造为& echo off,^为:^任意字符。 当然,这个构造我们不能由使用者来完成,而应该由设计者来完成,因此,在写程序的时候,就可以这样构造: set /p Input=请输入数字: set Filter=S%Input%echo off >nul 2 >nul 测试程序二: ------------------------ @echo off :Test set /p Input=输入特殊字符之一“ ^< ”试试: set Filter=S%Input%echo off >nul 2 >nul echo %Filter% goto :Test -------------------------- 上述这个程序,就过滤了那些特殊字符,但“"”除外,我们可以这样做: set Filter=%Filter:"=>% 就是将"替换为>,这样就可以将"过滤掉。 欢迎提出批评建议。   测试程序二 里,如果我输入一个值:ab&cd, set /p Input= set Filter=%Input%echo off >nul 2 >nul echo %filter% 输出结果是ab,结果不理想;   过滤特殊字符嘛 @echo off & setlocal enabledelayedexpansion set "chars=^ & < > |" set /p "str=input:" for %%i in (!chars!) do set str=!str:^%%i=! echo !str! pause   ---   @echo off&SETLOCAL ENABLEDELAYEDEXPANSION title 批处理中判断用户的输入是否是一指定数值的方法,支持任何特殊字符的方法 by:vkill findstr "^::要求输入为" "%~nx0" >"%temp%\b.txt" 2>nul ||(echo 你没有定义要求输入的数值&pause&exit/b) :loop cls set v=&set/p=输入:<nul&set/p "v= " echo. if not defined v (echo 输入为空,不符合你的要求&goto end) set v|findstr "^v=" >"%temp%\a.txt" set/p lv=<"%temp%\a.txt" set/p=输入为 [ !lv:~2! ] <nul >"%temp%\a.txt" set/p=::要求输入为!lv:~2!<nul fc "%temp%\a.txt" "%temp%\b.txt" >nul 2>nul||(set/p=不<nul) set/p=符合你的要求<nul :end echo. echo. pause goto loop ::这里自己定义 ::要求输入为~!@!~#@!$#!$!@$#@!%"
posted @ 2012-11-28 14:14  adodo1  Views(203)  Comments(0Edit  收藏  举报