Batch file Windows批处理文件-验证用户输入的环境变量为十六进制

Batch file Windows批处理文件-验证用户输入的环境变量为十六进制,batch-file,hex,validation,command-prompt,Batch File,Hex,Validation,Command Prompt,在Windows Server 2003命令提示符下以交互方式运行的批处理文件中,SET/p接受用户对环境变量的输入。如何确保用户输入仅由十六进制字符组成(即0123456789ABCDEF)?包含任何其他字符的输入应失败 例如: 02A13应该没问题 3Du*23I应该失败 逻辑应该是这样的: :Get_Hex Set /p _HexVal = Enter hex value: If not *ValidHexCheck* Echo Invalid input. Try

在Windows Server 2003命令提示符下以交互方式运行的批处理文件中,SET/p接受用户对环境变量的输入。如何确保用户输入仅由十六进制字符组成(即0123456789ABCDEF)?包含任何其他字符的输入应失败

例如:

  • 02A13应该没问题
  • 3Du*23I应该失败
逻辑应该是这样的:

:Get_Hex   
   Set /p _HexVal = Enter hex value:
   If not *ValidHexCheck* Echo Invalid input. Try again.&Goto Get_Hex
:Continue

ValidExcheck将被实际代码替换。我不能使用FINDSTR,因为我太蠢了,不能进入这里。我想我可以用FOR循环来做。有人有好的想法吗?

单向-用“.”替换输入字符串中的每个十六进制字符。
如果结果不是“”,则存在无效字符

@echo off
setlocal enabledelayedexpansion
set alphabet=0123456789ABCDEF

set input=DEADBEEF1234  
rem you will need to handle empty input
set test=%input%

for /l %%c in (0,1,15) do (
    if [!test!] neq [] (
        set hexdigit=!alphabet:~%%c,1!
        call set test=%%test:!!hexdigit!!=%%
    )
)

if [%test%] neq [] (
    echo character: %test% in %input% is invalid
    goto :eof
)

echo %input% is valid
对于32位值(不确定是否在64位上展开)


小心-您可能不希望在变量名中使用空格,因此需要删除SET语句中
=
前面的空格

一种解决方案是将所有十六进制数字替换为零,然后查看是否还有剩余的数字

@echo off
setlocal enableDelayedExpansion
:Get_Hex
set "_HexVal="
set /p _HexVal=Enter hex value:
if not defined _HexVal echo You must enter a value. Try again.&goto Get_Hex
set "test=!_HexVal!"
for %%C in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do if defined test set "test=!test:%%C=!"
if defined test echo Invalid input. Try again.&goto Get_Hex
我还添加了一个额外的测试,以确保输入了内容。如果未输入任何内容,则当前值保持不变。这就是为什么必须在输入语句之前清除变量

更简单的方法是使用FINDSTR查找只包含1个或多个十六进制数字字符的行:

@echo off
setlocal enableDelayedExpansion
:Get_Hex
set "_HexVal="
set /p "_HexVal=Enter hex value: "
echo !_HexVal!|findstr /ri "^[0123456789ABCDEF][0123456789ABCDEF]*$" >nul || (
  echo Invalid input. Try again.
  goto Get_Hex
)
或者,您可以使用FINDSTR查找非十六进制数字,但必须再次验证是否存在值

@echo off
setlocal enableDelayedExpansion
:Get_Hex
set "_HexVal="
set /p "_HexVal=Enter hex value: "
if not defined _HexVal echo Invalid input. Try again.&goto Get_Hex
echo !_HexVal!|findstr /ri "[^0123456789ABCDEF]" >nul && (
  echo Invalid input. Try again.
  goto Get_Hex
)
另一种方法是让FOR/F查找非十六进制数字。同样,您还必须验证是否存在值

@echo off
setlocal enableDelayedExpansion
:Get_Hex
set "_HexVal="
set /p "_HexVal=Enter hex value: "
if not defined _HexVal echo Invalid input. Try again.&goto Get_Hex
for /f "eol=0 delims=0123456789ABCDEFabcdef" %%A in ("!_HexVal!") do (
  echo Invalid input. Try again.
  goto Get_Hex
)

我也想到了SET/A测试。但是我放弃了它,因为它将接受像
1+1
这样的输入。算术运算符肯定不是有效的十六进制数字:)啊,是的,这是一个非常好的点,任何运算符都会被接受添加额外的解决方案
@echo off
setlocal enableDelayedExpansion
:Get_Hex
set "_HexVal="
set /p "_HexVal=Enter hex value: "
if not defined _HexVal echo Invalid input. Try again.&goto Get_Hex
for /f "eol=0 delims=0123456789ABCDEFabcdef" %%A in ("!_HexVal!") do (
  echo Invalid input. Try again.
  goto Get_Hex
)