Символ, эквивалентный NEQ, LSS, GTR и т. Д. В пакетных файлах Windows
В партии я всегда использую ==
при использовании if
команда. (Например: if "19"=="3" echo My computer doesnt know maths
)
Как насчет всех остальных (LSS
, LEQ
, NEQ
, так далее.)? Нет ли что-то вроде !=
за NEQ
Или я имею в виду Unix?
Причина, по которой я хочу использовать символы, заключается в том, что я подумал, что кто-то сказал, что текстовые или числовые символы более эффективны, чем использование текстовых вариантов.
В любом случае, я все еще хотел бы знать. Благодарю.
2 ответа
Операторы причины как >
не используются, потому что они имеют особое значение в сценариях оболочки. >
используется для перенаправления вывода; <
используется для перенаправления ввода и т. д.
В документации от Microsoft перечислены следующие операторы:
Operator | Description
EQU | equal to
NEQ | not equal to
LSS | less than
LEQ | less than or equal to
GTR | greater than
GEQ | greater than or equal to
Кроме того, слово not
используется для отмены условия.
Причина, по которой я хочу использовать символы, заключается в том, что я думал, что кто-то сказал, что для текста или чисел символы более эффективны, чем использование вариантов текста.
Вероятно, они имели в виду bash и его большой каталог операторов. Он предоставляет различные операторы для целочисленных и строковых операндов.
Внутренняя команда Windows IF по умолчанию имеет только два оператора:
==
который запускает сравнение строк двух аргументов на равенство, то есть использует strcmp с условием истинности наstrcmp
возвращая 0.not
в комбинации с==
инвертировать результат сравнения строк на равенство, то есть условие истинно, если две сравниваемые строки не равны.
Итак, командная строка:
if "19"=="3" echo My computer doesn't know maths
работает strcmp
со строками "19"
а также "3"
что означает, что сравниваемые потоки байтов являются шестнадцатеричными 22 31 39 22 00
а также 22 33 22 00
, Двойные кавычки не удаляются перед выполнением сравнения строк. Они включены в сравнение строк.
Справка по команде IF выводится при запуске в окне командной строки команды if /?
, Эта справка объясняет все параметры и дополнительные операторы, которые могут использоваться при включении расширений команд, как по умолчанию.
Есть вариант /I
сравнить два аргумента без учета регистра с использованием stricmp вместо strcmp
,
Пример:
if /I not "%~1" == "/I" echo First argument is neither /i nor /I.
А с включенными расширениями команд есть дополнительные операторы сравнения: EQU
, NEQ
, LSS
, LEQ
, GTR
, GEQ
Угловые скобки <
а также >
используются в командной строке Windows в качестве операторов перенаправления. Поэтому их нельзя использовать в качестве операторов сравнения при условии IF. Также восклицательный знак !
недоступен в качестве оператора, потому что это означает начало / конец ссылки на переменную среды при включенном отложенном расширении переменной среды. Бежать set /?
а также setlocal /?
а также endlocal /?
подробности о задержке расширения переменной среды.
Интерпретатор команд Windows пытается преобразовать обе строки аргумента в 32-разрядные целые числа со знаком, используя strtol с base
0 (автоматическое определение базы) при использовании EQU
, NEQ
, LSS
, LEQ
, GTR
, GEQ
, Целочисленное сравнение выполняется, если это успешно для обеих строк аргумента, потому что две сравниваемые строки являются десятичными числами или шестнадцатеричными числами, начинающимися с 0x
или восьмеричные числа, начинающиеся с 0
, В противном случае две строки аргумента снова сравниваются с strcmp
и оператор сравнения применяется к целочисленному результату этой функции.
Преобразование обоих строковых аргументов в 32-разрядные целые числа со знаком требует некоторых дополнительных инструкций процессора (несколько наносекунд или микросекунд в зависимости от производительности процессора). Таким образом, целочисленное сравнение немного медленнее, но не очень заметно медленнее.
Примеры:
if 014 EQU 12 echo Octal number 014 is equal decimal number 12.
if 0x0C EQU 12 echo Hexadecimal number 0C is equal decimal number 12.
if /I 0X0C EQU 014 Hexadecimal number 0C is equal octal number 014.
Опция /I
игнорируется при использовании оператора сравнения, кроме ==
и обе строки состоят только из числовых цифр, причем первый символ также может быть дефисом, интерпретируемым как знак минус. Это доказано третьей строкой выше.
Если один из двух аргументов заключен в двойные кавычки на использование EQU
, NEQ
, LSS
, LEQ
, GTR
, GEQ
или одна из двух строк не является строкой, представляющей целое число, сравнение всегда выполняется с использованием strcmp
или же stricmp
в зависимости от использования /I
, strcmp
а также stricmp
вернуть как целое число как результат, который может быть отрицательным числом, нулем или положительным числом. Этот целочисленный результат сравнивается с целочисленным значением 0
в соответствии с используемым оператором.
Примеры:
if 010 NEQ "10" echo String 010 is not equal string "10".
if "100" LSS "20" echo String "100" is less than string "20".
Второй персонаж 1
на левой стороне имеет более низкое значение кода (49 = 0x31) в качестве второго символа 2
на правой стороне (50 = 0x32), что приводит к strcmp
возвращая отрицательное значение, в результате чего function result LSS 0
быть правдой
Обратите внимание, что переменные среды Windows всегда имеют строковый тип и должны всегда преобразовываться из строки в целое при использовании целочисленного сравнения или целочисленной арифметики.
Рекомендуется в большинстве случаев использовать string1 == string2
или же not string1 == string2
вместо string1 EQU string2
или же string1 NEQ string2
при сравнении двух строк, не представляющих целочисленные значения для непосредственного использования strcmp
или же stricmp
, В противном случае при сравнении строк с EQU
или же NEQ
только некоторые наносекунды или микросекунды тратятся впустую, если сначала использовать командный процессор Windows strtol
который не может преобразовать одну из двух строк для сравнения и, следовательно, cmd.exe
бежит дальше strcmp
или же stricmp
как это будет сделано сразу же при использовании оператора ==
,
Еще один важный факт:
Строка вместо целочисленного сравнения при использовании компараторов EQU
, NEQ
, LSS
, LEQ
, GTR
, GEQ
обрабатывается cmd.exe
при выполнении условия IF только в случае, если один из двух аргументов содержит недопустимый символ. Тем не менее, целочисленное сравнение выполняется для условия вне диапазона, например, один аргумент меньше, чем -2147483648
или больше чем 2147483647
как обсуждалось в странных результатах с IF.
Ограничение диапазона значений можно обойти, сравнив два значения в виде строк, в которых обе строки значений имеют одинаковое количество цифр. Вот пример, чтобы узнать, имеет ли файл два или более ГиБ, то есть размер файла 2147483648
или больше байтов.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if "%~1" == "" ( set "FileName=%~f0" ) else set "FileName=%~1"
for %%I in ("%FileName%") do set "FileSize=000000000000000%%~zI"
if "%FileSize:~-16%" GEQ "0000002147483648" (
echo "%FileName%" is greater or equal 2 GiB.
) else echo "%FileName%" is less than 2 GiB.
endlocal
pause
Размер файла, имя которого передается в пакетный файл, присваивается переменной среды FileSize
как строка, в начале которой всегда должно быть не менее 15 дополнительных нулевых цифр.
И рядом сравнивается FileSize
строка только с последними 16 цифрами со строкой 0000002147483648
представляет 2 ГиБ в байтах. strcmp
сравнивает две строки байта одинаковой длины, причем каждый байт двух сравниваемых строк может иметь только шестнадцатеричные значения от 0x30 до 0x39. strcmp
немедленно возвращает отрицательное значение, если текущий байт из левой строки меньше текущего байта из правой строки, что означает, что размер файла меньше 2 ГиБ. strcmp
немедленно возвращает положительное значение, если текущий байт из левой строки больше, чем текущий байт из правой строки, что означает, что размер файла превышает 2 ГиБ. strcmp
Возврат с нуля для двух строк идентичен на 100%, что означает, что размер файла составляет ровно 2 ГиБ.
Обратите внимание, что сравнение значений с использованием сравнения строк требует, чтобы оба значения имели одинаковое количество цифр для точного результата. Строка значения с меньшим количеством цифр должна начинаться с правильного количества 0
,