Будьте осторожны - вам, вероятно, не нужен пробел в имени переменной, поэтому вам нужно удалить пробел перед =
в вашем операторе 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
)