Преамбула
В 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 "
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-bat-soderzhit-li-peremennaya-chislo/(
Comments |
Comment on this)