“Bullet防爆”批量验证

时间:2014-11-28 13:47:32

标签: validation batch-file special-characters

这是一个关于用户输入验证的相当普遍的问题,特别关注特殊字符。在这个“最简单”的案例中,寻求一个字符验证。

代码是从5岁thread修改而来的,但很明显,大多数特殊字符需要额外处理以下建议:

Setlocal EnableDelayedExpansion
:Prompter
REM Eliminate poison chars on <CR>
SET "validateText="
SET /P "validateText=Type f to foo or b to bah. (f/b)"
call :Validate
if /i %validateText%==f (echo foo pause>nul goto :eof
) else (
if /i %validateText%==b (echo bah pause>nul goto :eof
) else (goto Prompter))


:Validate
SET Input=%validateText:~0,1%
For %%G In (^= ^| ^& ^< ^> ^^ + ^( ^) \ / . @ # $ { } [ ] ' : ` ^%% ^") Do (
REM Test Script fails for = | & < > ^ ) ; " and space
REM Loops through the set, but the if clauses are never evaluated
If %Input%==%%G (@echo isequal pause>nul exit /b) else (echo isnotequal pause>nul exit /b))

REM quotes on the test clause also fail
rem If "%validateText%==%%G" (echo equal pause >nul goto :eof) else (echo not equal pause >nul goto :eof))

REM The following are what is intended. All fail
rem If "%validateText%==%%G" (set Input=!Input:%%G=! goto BangDO) else (set Input=%validateText% goto :eof))
rem If %validateText%==%%G (set "Input=%Input:%%G=%" goto BangDO) else (set "Input=%validateText%" goto :eof))
:BangDO
@echo %Input%
pause
Set Input=!Input:%=!
REM Remove !
SetLocal DisableDelayedExpansion
Set "%Input:!=X"
Setlocal EnableDelayedExpansion
Set "validateText=%Input%"
@echo %validateText%
pause

问题是,鉴于命令处理器没有更新(至少自引用的帖子以来),为什么它不起作用。要么改进这种验证尝试,要么提供自己的代码。

2 个答案:

答案 0 :(得分:3)

答案几乎是在盯着你:-)你启用了延迟扩展,但是你没有使用它!

延迟扩展的一个美妙特征是您永远不必担心内容中的毒物字符。

另一件事,如果用户只是在不输入值的情况下按set /p<Enter>将保留任何现有变量值。这可能是也可能不是你想要的。在使用set /p

之前,我通常会明确清除变量值
setlocal EnableDelayedExpansion

REM set /p does not clear existing value if user enters empty string
REM Remove REM below if you want to ignore any existing str value

REM set "str="

:prompter
set /p "str=Type f to foo or b to bah. (f/b) "
if /i !str!==f (
  echo foo
) else if /i !str!==b (
  echo bah
) else goto prompter
pause >nul

答案 1 :(得分:0)

在您的情况下,只需要一次更换即可。

SET "validateText="
SET /P "validateText=Type f to foo or b to bah. (f/b)"
set "validateText=%validateText:"=""%"
if /i "%validateText%"=="f" (
   echo foo pause>nul goto :eof
) else if /i "%validateText%"=="b" (
  echo bah pause>nul goto :eof
) else (
  goto Prompter
)

这适用于所有特殊字符在引号内都是安全的 而且你只需要确保文本中的引号不会引起问题,这可以通过将所有引号加倍来实现。