В 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 )