在Windows Server 2003命令提示符中以交互方式运行的批处理文件中,SET / p接受用户输入到环境变量中。如何确保用户输入仅由十六进制字符组成(即0123456789ABCDEF)?包含任何其他字符的输入应该失败。
例如:
逻辑需要像这样:
:Get_Hex
Set /p _HexVal = Enter hex value:
If not *ValidHexCheck* Echo Invalid input. Try again.&Goto Get_Hex
:Continue
ValidHexCheck 将被实际代码替换。我不能使用FINDSTR因为太愚蠢而无法进入这里。我想我可以在FOR循环中完成它。有人有好主意吗?
答案 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