这是一个关于用户输入验证的相当普遍的问题,特别关注特殊字符。在这个“最简单”的案例中,寻求一个字符验证。
代码是从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
问题是,鉴于命令处理器没有更新(至少自引用的帖子以来),为什么它不起作用。要么改进这种验证尝试,要么提供自己的代码。
答案 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
)
这适用于所有特殊字符在引号内都是安全的 而且你只需要确保文本中的引号不会引起问题,这可以通过将所有引号加倍来实现。