Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation &引用;防弹;批量验证_Validation_Batch File_Special Characters - Fatal编程技术网

Validation &引用;防弹;批量验证

Validation &引用;防弹;批量验证,validation,batch-file,special-characters,Validation,Batch File,Special Characters,这是一个关于用户输入验证的相当普遍的问题,特别关注特殊字符。在这种“最简单”的情况下,寻求一个字符验证 代码从5年前修改而来,但很明显,大多数特殊字符需要额外处理,如下所示: 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

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

代码从5年前修改而来,但很明显,大多数特殊字符需要额外处理,如下所示:

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
Setlocal EnableDelayedExpansion
:提示器
快速眼动消除身上的毒炭
设置“validateText=”
设置/P“validateText=将f类型设置为foo或将b类型设置为bah。(f/b)”
呼叫:验证
如果/i%validateText%==f(echo foo pause>nul goto:eof
)否则(
如果/i%validateText%==b(回显bah暂停>nul goto:eof
)else(转到提示器))
:验证
设置输入=%validateText:~0,1%
对于%%G In(^=^^^^&^>^^+^(^)\/.@${}[]':`^%^”)执行以下操作(
对于=|&<>^);“和空格,REM测试脚本失败
REM在集合中循环,但从不计算if子句
如果%Input%==%%G(@echo isequal pause>nul exit/b)其他(echo isnotequal pause>nul exit/b))
测试子句上的REM引用也失败
如果“%validateText%==%%G”(回显相等暂停>nul goto:eof)或者(回显不相等暂停>nul goto:eof))则rem
REM以下是其目的。全部失败
rem如果“%validateText%==%%G”(设置输入=!输入:%%G=!goto BangDO)其他(设置输入=%validateText%goto:eof))
rem如果%validateText%%==%%G(设置“输入=%Input:%%G=%”转到BangDO)其他(设置“输入=%validateText%”转到:eof))
:邦多
@回显%输入%
暂停
设置输入=!输入:%=!
REM移除!
SetLocal DisableDelayedExpansion
设置“%Input:!=X”
Setlocal EnableDelayedExpansion
设置“validateText=%Input%”
@回显%validateText%
暂停

问题是,鉴于命令处理器没有更新(至少在引用文章之后),为什么它不能工作。要么改进这种验证尝试,要么提供自己的代码。

答案几乎就在眼前:-)您启用了延迟扩展,但随后却无法使用它

延迟扩展的一个很好的特点是,你永远不必担心内容中的有毒字符

还有一件事,
set/p
将保留任何现有变量值,如果用户只需按
而不输入值。这可能不是你想要的。我通常在使用
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

答案几乎就在你面前:-)你启用了延迟扩展,但是你却没有使用它

延迟扩展的一个很好的特点是,你永远不必担心内容中的有毒字符

还有一件事,
set/p
将保留任何现有变量值,如果用户只需按
而不输入值。这可能不是你想要的。我通常在使用
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

答案几乎就在你面前:-)你启用了延迟扩展,但是你却没有使用它

延迟扩展的一个很好的特点是,你永远不必担心内容中的有毒字符

还有一件事,
set/p
将保留任何现有变量值,如果用户只需按
而不输入值。这可能不是你想要的。我通常在使用
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

答案几乎就在你面前:-)你启用了延迟扩展,但是你却没有使用它

延迟扩展的一个很好的特点是,你永远不必担心内容中的有毒字符

还有一件事,
set/p
将保留任何现有变量值,如果用户只需按
而不输入值。这可能不是你想要的。我通常在使用
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

在您的情况下,只需更换一个即可确保安全

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
)
这是因为所有特殊字符在引号中都是安全的。

您只需要确保文本中的引号不会引起问题,这可以通过将所有引号加倍来实现。

在您的情况下,只需要一个替换就可以确保安全

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
)
这是因为所有特殊字符在引号中都是安全的。

您只需要确保文本中的引号不会引起问题,这可以通过将所有引号加倍来实现。

在您的情况下,只需要一个替换就可以确保安全

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
)
这是因为所有特殊字符在引号中都是安全的。

您只需要确保文本中的引号不会引起问题,这可以通过将所有引号加倍来实现。

在您的情况下,只需要一个替换就可以确保安全

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
)
这是因为所有特殊字符在引号中都是安全的。

您只需确保文本中的引号不会引起问题,这可以通过将所有引号加倍来实现。

您声明“这是一个关于用户输入验证的相当普遍的问题”,但您从未真正提出过问题。请编辑以包含特定问题。您声明“这是一个关于用户输入验证的相当普遍的问题”,但您从未实际提出过问题。请编辑以包含特定问题。您声明“这是一个关于用户输入验证的相当普遍的问题”,但您从未实际提出过问题。请编辑以包含特定问题。您声明“这是一个关于用户输入验证的相当普遍的问题”,但您从未实际提出过问题。请编辑以包含特定问题。谢谢dbenham。完成!根据引用的线程,问题在“以下是预期的。全部失败”行下。这是一个简单的解决方案!刘海的荣耀!谢谢德本汉姆。完成!根据引用的线程,问题在“以下是预期的。全部失败”行下。这是一个简单的解决方案!刘海的荣耀!谢谢德本汉姆。完成!问题在“REM以下是预期的。全部失败”一行下面