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

时间:2012-02-10 16:22:19

标签: 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 again.&Goto Get_Hex
:Continue

ValidHexCheck 将被实际代码替换。我不能使用FINDSTR因为太愚蠢而无法进入这里。我想我可以在FOR循环中完成它。有人有好主意吗?

2 个答案:

答案 0 :(得分:3)

注意 - 您可能不希望变量名中有空格,因此您需要删除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查找仅包含一个或多个十六进制数字字符的行:

@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
)

答案 1 :(得分:0)

一种方法 - 用“”替换输入字符串中的每个十六进制字符 如果结果不是“”则表示存在无效字符;

@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 input=deadbeef
set test=
set /a test=0x%input% >nul 2>&1
if [%test%] equ [] echo invalid