В BAT-файлах нет типа переменных, тип разрешается в каждом конкретном случае. Впрочем, это так в большинстве командных языков, в линуксовом bash тоже нельзя явно задать тип переменной.
При этом, процессор cmd не считает числом:
— Числа в системах счисления отличных от десятичной.
— Числа с плавающей точкой (действительные, дробные).
— Если есть лидирующие нули, например 00150
не распознается как число. Хотя с этим мы поборемся.
Числами считаются только целые числа в диапазоне -2147483648..2147483647
.
Так как же проверить, число в переменной BAT/CMD-файла или нет? Будем разбираться.
Оставим числа в системах счисления, отличных от десятичной, а также дробные числа. Нормальных механизмов работы в BAT/CMD с ними нет, так что и не будем усложнять.
1. Включаем расширенный режим (копия) обработки команд. В Windows, начиная с XP SP2 он включен по умолчанию, но лучше явно прописывать для совместимости:
SetLocal EnableExtensions
2. Проверка на пустую переменную. Процессор BAT/CMD считает неинициализированную или пустую переменную пустой, и не задает ей значение 0, если она используется в качестве численной переменной. Так что изначально надо проверять, не пуста ли переменная.
В тестовом примере значение передается в параметре командной строки, его и проверим, а потом запишем значение во внутреннюю переменную скрипта:
rem test if no or void parameter (variable) if "%~1" == "" ( echo No arguments. Use "%~n0%~x0 <test pattern>" exit /b 1 ) set INP=%~1
%~n0%~x0
— при расширенной обработке команд %~n
достает из переменной, в данном случае переменной %0
имя файла, %~x
расширение с точкой. %0
— переменная, содержащая путь к BAT/CMD-файлу
3. Боремся с лидирующими нолями. Данная команда их удалит:
for /f "tokens=* delims=0" %%a in ("%INP%") do set INP=%%a
4. Эта команда сохранит, например 000100
, превратив его в 100
, но удалит 0
или 000...
, так что если переменная после операции оказалась пустой, значит она содержала 0
, надо его восстановить, дабы далее избежать ошибок:
if "%INP%" == "" (
set INP=0
)
5. Число или строка. Теперь можно определить, число или строка в переменной, произведя над ней арифметическое действие не изменяющее значение, например, умножение на 1
. Сделать это можно с помощью команды set /a
. Остается сравнить полученный результат с оригиналом. Если результат операции не равен оригиналу, то в переменной не число, а строка, т.к. результат арифметической операции над строкой всегда будет равен 0
:
rem number or not number set /a "TINP=INP*1" if NOT %TINP% == %INP% ( echo Not number! exit /b 2 )
6. Положительное или отрицательное число. Далее остается только сравнить числа с 0
с помощью оператора IF
и операций сравнения:
Операнд сравнения | Описание |
EQU |
Равно |
NEQ |
Не равно |
LSS |
Меньше |
LEQ |
Меньше или равно |
GTR |
Больше |
GEQ |
Больше или равно |
rem number type if %INP% GEQ 0 ( echo Positive integer exit /b 0 ) if %INP% LSS 0 ( echo Negative integer exit /b 0 )