Windows批处理文件中相当于NEQ、LSS、GTR等的符号
不使用運算符 <和>?的原因是因為它們在 shell 腳本中具有特殊含義。>用于重定向輸出;?<用于重定向輸入。
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用于否定條件。
我想使用符號的原因是因為我認為有人說文本或數(shù)字符號比使用文本變體更有效。
他們可能指的是 bash 及其龐大的運算符目錄。它為整數(shù)和字符串操作數(shù)提供了不同的運算符。
Windows 命令處理器內部命令IF默認只有兩個操作符:
所以命令行
if "19"=="3" echo My computer doesn't know maths運行strcmp與琴弦"19"和"3"該裝置所比較的字節(jié)流是十六進制的22 31 39 22 00和22 33 22 00。在運行字符串比較之前不會刪除雙引號。引號包含在字符串比較中。
在命令提示符窗口中運行命令IF 時會輸出命令IF的幫助if /?。本幫助解釋了默認情況下可用于啟用命令擴展的所有選項和附加運算符。
可以選擇/I使用 stricmp 而不是 來比較兩個不區(qū)分大小寫的參數(shù)strcmp。
例子:
if /I not "%~1" == "/I" echo First argument is neither /i nor /I.有額外的比較操作符EQU,NEQ,LSS,LEQ,GTR,GEQ以啟用命令擴展。
尖括號<和>在 Windows 命令行上用作重定向運算符。因此它們不能用作IF條件的比較運算符。感嘆號!也不能用作運算符,因為它表示啟用延遲環(huán)境變量擴展時環(huán)境變量引用的開始/結束。運行set /?和setlocal /?和endlocal /?對延遲的環(huán)境變量擴展的使用細節(jié)。
視窗命令解釋試圖既參數(shù)字符串使用strtol將符號的32位整數(shù)轉換與base對使用0(堿的自動檢測)EQU,NEQ,LSS,LEQ,GTR,GEQ。如果兩個參數(shù)字符串都成功,則進行整數(shù)比較,因為兩個比較的字符串是
- 十進制數(shù)字的第一個字符是可選的-或+,所有其他字符都是十進制數(shù)字0123456789,第一個數(shù)字不是0像-2147483648,?-200,?+10,?32,?2147483647, 或
- 十六進制數(shù)字的第一個字符是可選的-or+和下一個字符是0xor0X和所有其他字符都是十六進制數(shù)字,0123456789ABCDEFabcdef如-0x80000000,?-0XC8,?+0x0a,?0x20,?0x7fffFFFF, 或
- 八進制數(shù)字的第一個字符是可選的-或+和下一個0,所有其他字符都是八進制數(shù)字,01234567如-020000000000,?-0310,?+012,?040,?017777777777。
否則,兩個參數(shù)字符串將再次與strcmp或 with進行比較,stricmp另外/I使用運算符EQU,?NEQ,?LSS,?LEQ,?GTR,GEQ并將比較運算符應用于字符串比較函數(shù)的整數(shù)結果。
注意:?08和09其他人一樣,人們解釋十進制數(shù),其中一個或多個前導0包含8或被9解釋為無效的八進制數(shù),因此導致字符串而不是整數(shù)比較。
將兩個字符串參數(shù)轉換為有符號的 32 位整數(shù)需要一些額外的處理器指令(一些納秒或微秒,取決于 CPU 性能)。一個整數(shù)比較,因此有點慢的,但通常并不很明顯變慢。
例子:
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在使用比較運算符時被忽略,==并且兩個字符串都可以成功轉換為 32 位有符號整數(shù)。上面的第三行證明了這一點。/I僅在使用運算符EQU,?NEQ,?LSS,?LEQ,時才考慮GTR,GEQ如果兩個字符串之一無法成功轉換為整數(shù),如下例所示:
if /I "0X20" EQU "0x20" echo String "0X20" is case-insensitive equal string "0x20".如果這兩個參數(shù)中的一個雙引號括起來的用法EQU,NEQ,LSS,LEQ,GTR,GEQ,或兩個字符串的一個是不是代表一個有效的整數(shù)字符串,則比較總是與使用情況進行strcmp或stricmp取決于用途/I。strcmp并stricmp返回一個整數(shù)作為結果,它可以是負數(shù)、零或正數(shù)。0根據(jù)使用的運算符將此整數(shù)結果與整數(shù)值進行比較。
例子:
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 環(huán)境變量始終是字符串類型,并且需要在使用整數(shù)比較或整數(shù)運算時始終從字符串轉換為整數(shù)。
在大多數(shù)情況下,建議使用string1 == string2ornot string1 == string2代替string1 EQU string2or?string1 NEQ string2on 比較兩個不代表整數(shù)值的字符串以直接使用strcmp或stricmp。否則,通過讓 Windows 命令處理器首先使用無法將兩個字符串之一轉換為比較并因此運行下一個或將在使用運算符時立即執(zhí)行,從而將字符串與EQU或NEQ僅一些納秒或微秒進行比較會被浪費。strtolcmd.exestrcmpstricmp==
還有一個重要的事實:
字符串而不是所述比較運營商之一的使用整數(shù)的比較EQU,NEQ,LSS,LEQ,GTR,GEQ由加工cmd.exe上的執(zhí)行IF條件僅在兩個參數(shù)中的一個的情況下,包含無效字符。盡管如此,還是在超出范圍的條件下進行整數(shù)比較,例如一個參數(shù)小于-2147483648或大于2147483647IF 的奇怪結果中所討論的。
可以通過將兩個值作為字符串進行比較來解決值范圍限制,其中兩個值字符串具有相同的字符數(shù)。這是一個示例,用于確定文件是否具有兩個或更多 GiB,即文件大小為2147483648或更多字節(jié)。
@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作為字符串分配給環(huán)境變量,開頭總是至少有 15 個額外的零位。
接下來將FileSize字符串與僅最后 16 位數(shù)字進行比較,字符串以0000002147483648字節(jié)為單位表示 2 GiB。strcmp逐字節(jié)比較兩個長度相等的字符串,兩個比較字符串的每個字節(jié)只能具有 0x30 到 0x39 的十六進制值。strcmp如果左字符串的當前字節(jié)小于右字符串的當前字節(jié),則立即返回負值,這意味著文件大小小于 2 GiB。strcmp如果左字符串的當前字節(jié)大于右字符串的當前字節(jié),則立即返回正值,這意味著文件大小大于 2 GiB。strcmp在兩個字符串上返回零是 100% 相同的,這意味著文件大小正好是 2 GiB。
請注意,使用字符串比較來比較值需要兩個值具有相同的字符數(shù)才能獲得準確的結果。數(shù)字較少的值字符串必須在前面加上適量的0.
總結
以上是生活随笔為你收集整理的Windows批处理文件中相当于NEQ、LSS、GTR等的符号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IT开发部门怎样利用RPA机器人解放人力
- 下一篇: Linux#使用ll命令