小心 - 您可能不希望变量名中有空格,因此您需要删除 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
)