Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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 验证批处理文件XY中的输入-字母和数字组合_Validation_Batch File - Fatal编程技术网

Validation 验证批处理文件XY中的输入-字母和数字组合

Validation 验证批处理文件XY中的输入-字母和数字组合,validation,batch-file,Validation,Batch File,我已经创建了一个正确执行的batch/cmd文件,但我想添加一个“验证”层来检查输入是否正确 输入的格式应为字母-字母-######(八个数字) 我自己更喜欢狂欢,所以我有点迷路了 下面是我使用的基本版本 echo Please Input like so XY######## set /P INPUT=Type input: %=% 嗯。我们走吧 如果通过set/p命令读取输入,则无法执行所需操作。在这种情况下,您可以在之后测试输入并重复,直到正确为止 要在输入的同时检查输入,您需要分别读取

我已经创建了一个正确执行的batch/cmd文件,但我想添加一个“验证”层来检查输入是否正确

输入的格式应为
字母-字母-######
(八个数字)

我自己更喜欢狂欢,所以我有点迷路了

下面是我使用的基本版本

echo Please Input like so XY########
set /P INPUT=Type input: %=%
嗯。我们走吧

如果通过
set/p
命令读取输入,则无法执行所需操作。在这种情况下,您可以在之后测试输入并重复,直到正确为止

要在输入的同时检查输入,您需要分别读取和测试每个字符。有几种方法可以做到这一点。最简单的方法是基于
选择
命令:

@echo off
setlocal EnableDelayedExpansion

echo Please Input like so XY########
set /P "=Type input: " < NUL
set "INPUT="

rem Get two *UPPERCASE* letters
set "letter= ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for /L %%i in (1,1,2) do (
   choice /C %letter% /N > NUL
   for %%l in ("!errorlevel!") do set "INPUT=!INPUT!!letter:~%%~l,1!"
   set /P "=!INPUT:~-1!" < NUL
)

rem Get eight digits
set "digit= 0123456789"
for /L %%i in (1,1,8) do (
   choice /C %digit% /N > NUL
   for %%l in ("!errorlevel!") do set "INPUT=!INPUT!!digit:~%%~l,1!"
   set /P "=!INPUT:~-1!" < NUL
)

echo/
echo INPUT = "%INPUT%"
@echo关闭
setlocal EnableDelayedExpansion
回音请像这样输入XY########
设置/P“=类型输入:”NUL
对于(“!errorlevel!”)中的%%l,请设置“输入=!输入!!字母:~%%%l,1!”
设置/P“=!输入:~-1!”NUL
对于(“!errorlevel!”)中的%%l,请设置“输入=!输入!!位数:~%%%l,1!”
设置/P“=!输入:~-1!”
在此代码中:

  • 任何按下的字母都转换为大写。此行为可能会被取消,包括
    letter
    变量中的大写字母和小写字母,并添加
    /CS
    切换到
    choice
    命令
  • 无法删除最后输入的字符
  • 输入最后一个字符后,输入将自动完成。不需要最后的回车键

如果您不希望这种行为,并且需要对输入字符进行更精确的控制,则必须使用另一种方法;例如,通过
xcopy
技巧读取钥匙。上面由Squashman发布的链接是如何做到这一点的一个很好的例子…

Aacini的答案也强制有效的用户输入而不是验证追溯性,他的答案代码更少,在我看来更“可读”。我将使用他的答案,但我想我会分享这个方法

我要求“追溯”验证用户输入,但@Squashmans注释URL首先强制有效的用户输入

这是我最后得到的“净化代码”

@echo off
@cls

::::START -- Section Blocks User from Inputting Invalid Data::::
setlocal
set "thisFile=%~F0"

call :ReadFormattedLine INPUT="__########" /M "Enter Input in Form XY########: "
echo/

:ReadFormattedLine var="mask" [/M "message"] [/P] [/F /W /A]

if "%~2" equ "" echo ERROR: Missing parameters & exit /B 1
setlocal EnableDelayedExpansion

set "var=%~1"
set "mask=%~2"
shift & shift
set "message="
if /I "%1" equ "/M" set "message=%~2" & shift & shift
set "password="
if /I "%1" equ "/P" set "password=1" & shift
set "switch=%~1"

set quote="
set "digit= 0 1 2 3 4 5 6 7 8 9 "
set "letter= A B C D E F G H I J K L M N O P Q R S T U V W X Y Z "
set "alphaNum=%digit%%letter%"
set "fmt=#_+?@"
set "show=$/\()[]:;,.- %digit: =%%letter: =%"
for /F %%a in ('copy /Z "%thisFile%" NUL') do set "CR=%%a"
for /F %%a in ('echo prompt $H ^| cmd') do set "BS=%%a" & set "SP=.%%a "

< NUL (
   set /P "=%message%"
   for /F "eol=| delims=" %%a in ('cmd /U /C echo !mask!^| find /V ""') do (
      if "!fmt:%%a=!" neq "%fmt%" (
         set /P "=Û"
      ) else if "%%a" neq " " (
         set /P "=%%a"
      ) else (
         set /P "=!SP!"
      )
   )
   set /P "=!SP!!CR!%message%"
)
set "input="
set /A i=0, key=0
goto checkFormat

:nextKey
   set "key="
   for /F "delims=" %%a in ('xcopy /W "%thisFile%" "%thisFile%" 2^>NUL') do if not defined key set "key=%%a"
   if "!key:~-1!" neq "!CR!" goto endif
      if /I "%switch%" equ "/A" goto nextKey
      if /I "%switch%" neq "/F" goto check/W
         :nextField
         set "format=!mask:~%i%,1!"
         if "%format%" equ "" goto endRead
         if "!fmt:%format%=!" equ "%fmt%" goto checkFormat
         set /P "=Û" < NUL
         set "input=%input% "
         set /A i+=1
         goto nextField
      :check/W
      if /I "%switch%" neq "/W" goto checkEmpty
         if %i% equ 0 goto endRead
         if "%format%" equ "" goto endRead
         goto nextKey
      :checkEmpty
      if %i% gtr 0 goto endRead
      goto nextKey
   :endif
   set "key=!key:~-1!"
   if "!key!" equ "!BS!" (
      if %i% gtr 0 (
         if "%format%" equ "" (
            set /P "=!SP!!BS!!BS!Û!BS!" < NUL
         ) else (
            set /P "=Û!BS!!BS!Û!BS!" < NUL
         )
         set "input=%input:~0,-1%"
         set /A i-=1
         if !i! equ 0 set key=0
      )
      goto checkFormat
   )
   if "%format%" equ "" goto nextKey
   if "!key!" equ "=" goto nextKey
   if "!key!" equ "!quote!" goto nextKey
   if "%format%" equ "#" ( rem Any digit
      if "!digit: %key% =!" equ "%digit%" goto nextKey
   ) else if "%format%" equ "_" ( rem Any letter
      if "!letter: %key% =!" equ "%letter%" goto nextKey
   ) else if "%format%" equ "+" ( rem Any letter, convert it to uppercase
      if "!letter: %key% =!" equ "%letter%" goto nextKey
      for %%a in (%letter%) do if /I "!key!" equ "%%a" set "key=%%a"
   ) else (
      rem Rest of formats are alphanumeric: ? @
      if "!alphaNum: %key% =!" equ "%alphaNum%" goto nextKey
      if "%format%" equ "@" ( rem Convert letters to uppercase
         for %%a in (%letter%) do if /I "!key!" equ "%%a" set "key=%%a"
      ) else if "%format%" neq "?" echo ERROR: Invalid format in mask: "%format%" & exit /B 2
      )
   )
   if defined password (
      set /P "=*" < NUL
   ) else (
      set /P "=%key%" < NUL
   )
   set "input=%input%%key%"

   :nextFormat
   set /A i+=1
   :checkFormat
   set "format=!mask:~%i%,1!"
   if "%format%" equ "" (
      if /I "%switch%" equ "/A" goto endRead
      if /I "%switch%" equ "/M" goto endRead
      goto nextKey
   )
   if "!show:%format%=!" neq "%show%" (
      if "!key!" equ "!BS!" (
         if "%format%" neq " " (
            set /P "=%format%!BS!!BS!Û!BS!" < NUL
         ) else (
            set /P "=!SP!!BS!!BS!Û!BS!" < NUL
         )
         set "input=%input:~0,-1%"
         set /A i-=1
         if !i! equ 0 set key=0
         goto checkFormat
      ) else (
         if "%format%" neq " " (
            set /P "=%format%" < NUL
         ) else (
            set /P "=!SP!" < NUL
         )
         set "input=%input%%format%"
         goto nextFormat
      )
   )
   if "%input:~-1%!key!" equ " !BS!" (
      set /P "=Û!BS!!BS!" < NUL
      set "input=%input:~0,-1%"
      set /A i-=1
      goto checkFormat
   )

goto nextKey
:endRead
echo/
endlocal & set "%var%=%input%"
echo %INPUT%
pause
exit /B
@echo关闭
@cls
::开始--部分阻止用户输入无效数据:::
setlocal
设置“thisFile=%~F0”
调用:ReadFormattedLine INPUT=“35;########”/M”以XY形式输入输入:
回音/
:ReadFormattedLine var=“mask”[/M“message”][/P][/F/W/A]
如果“%~2”equ“”回显错误:缺少参数并退出/B 1
setlocal EnableDelayedExpansion
设置“var=%~1”
设置“掩码=%~2”
轮班
设置“消息=”
如果/I“%1”相等/M“设置”消息=%2”&shift&shift
设置“密码=”
如果/I“%1”相等/P设置“密码=1”&shift
设置“开关=%~1”
设置引号=”
设置“数字=0 1 2 3 4 5 6 7 8 9”
设置“字母=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z”
设置“alphaNum=%digit%%letter%”
设置“fmt=##+?@”
设置“show=$/\()[]:;,。-%数字:=%%字母:=%“
对于('copy/Z”%thisFile%%“NUL')中的/F%%a,请设置“CR=%%a”
对于('echo prompt$H^ | cmd')中的/F%%a,请设置“BS=%%a”并设置“SP=.%a”
num'),如果未定义键集,则执行“键=%%a”
如果“!键:~-1!“neq”!CR!“转到endif
如果/I“%switch%”相等/A“转到下一个密钥”
如果/I“%switch%”neq/F“转到检查/W”
:nextField
设置“格式=!掩码:~%i%,1!"
如果“%format%”“eq”转到endRead
如果“!fmt:%format%=!equ“%fmt%”转到检查格式
设置/P“=Û”