CMD/BAT, содержит ли переменная число.
В 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
)
На GitHub
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/17/cmd-b