Пакетный файл Windows - проверьте, что введенная пользователем переменная окружения является шестнадцатеричной - PullRequest
2 голосов
/ 10 февраля 2012

В пакетном файле, который запускается в интерактивном режиме в командной строке 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 ]

3 голосов
/ 10 февраля 2012

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

В одну сторону - заменить каждый шестнадцатеричный символ во входной строке на «».
Если результат не «», значит, был недопустимый символ;

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