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
::这里自己定义
::要求输入为~!@!~#@!$#!$!@$#@!%"