dit*_*ncy 7 windows cmd if-statement batch-file
在批处理中,我总是==在使用if命令时使用.(例如:if "19"=="3" echo My computer doesnt know maths)
怎么样对所有其他的(LSS,LEQ,NEQ等)?是不是有什么样!=的NEQ,还是我想Unix的?
我想使用符号的原因是因为我认为有人说文字或数字符号比使用文本变体更有效.
无论哪种方式,我还是想知道.谢谢.
>不使用运算符的原因是因为它们在shell脚本中具有特殊含义.所述>用于重定向输出; <用于重定向输入等
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
Run Code Online (Sandbox Code Playgroud)
此外,该词not用于否定一个条件.
我想使用符号的原因是因为我认为有人说过文本或数字符号比使用文本变体更有效.
他们可能指的是bash及其庞大的运营商目录.它为整数和字符串操作数提供不同的运算符.
Windows内部命令IF默认只有两个运算符:
==它在相等性上对两个参数进行字符串比较,即使用strcmp,条件是在返回0时为truestrcmp。not结合==将相等时的字符串比较结果取反,即,如果两个比较的字符串不相等,则条件为true。因此,命令行:
if "19"=="3" echo My computer doesn't know maths
Run Code Online (Sandbox Code Playgroud)
运行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.
Run Code Online (Sandbox Code Playgroud)
并启用命令扩展有额外的比较操作:EQU,NEQ,LSS,LEQ,GTR,GEQ
在Windows命令行上使用尖括号<和将>它们用作重定向操作符。因此,它们不能在IF条件下用作比较运算符。同样,感叹号!不能用作运算符,因为它表示启用了延迟的环境变量扩展后环境变量引用的开始/结束。运行set /?和setlocal /?和endlocal /?有关延迟的环境变量扩展的详细信息。
视窗命令解释试图既参数字符串使用符号的32位整数转换strtol将与base上的使用0(碱的自动检测)EQU,NEQ,LSS,LEQ,GTR,GEQ。如果对两个参数字符串都成功,则完成整数比较,因为两个比较的字符串是十进制数或以开头的十六进制数0x或以开头的八进制数0。否则,将再次使用strcmp比较两个参数字符串,并将比较运算符应用于此函数的整数结果。
将两个字符串参数都转换为带符号的32位整数需要一些额外的处理器指令(取决于CPU性能,大约为纳秒或微秒)。因此,整数比较会稍慢一些,但实际上不会明显变慢。
例子:
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.
Run Code Online (Sandbox Code Playgroud)
/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".
Run Code Online (Sandbox Code Playgroud)
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。否则,通过让Windows命令处理器首先使用而无法比较两个EQU或NEQ几纳秒或几微秒的字符串,strtol这将无法转换两个字符串中的一个进行比较,从而导致cmd.exe下一个运行,strcmp或者stricmp在使用运算符时立即执行==。
一个重要的事实:
的字符串,而不是在所述比较器的使用整数的比较EQU,NEQ,LSS,LEQ,GTR,GEQ由加工cmd.exe上的执行IF条件仅在两个参数中的一个的情况下,包含无效字符。尽管如此,仍在超出范围的条件下(例如,一个参数小于-2147483648或大于IF的奇怪结果2147483647所讨论的条件)进行了整数比较。
可以通过将两个值作为字符串进行比较来解决值范围限制,在两个字符串上两个值字符串具有相同的位数。这是一个示例,以确定文件是否具有两个或多个GiB,即文件大小为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
Run Code Online (Sandbox Code Playgroud)
将名称传递给批处理文件的文件的文件大小FileSize以字符串形式分配给环境变量,该字符串的开头始终总是至少有15个其他零数字。
接下来,将FileSize最后16位的字符串与0000002147483648代表2 GiB字节的字符串进行比较。strcmp逐字节比较两个长度相等的字符串,从而两个比较字符串的每个字节只能有十六进制值0x30到0x39。strcmp如果左字符串中的当前字节小于右字符串中的当前字节,则立即返回负值,这意味着文件大小小于2 GiB。strcmp如果左字符串中的当前字节大于右字符串中的当前字节,则立即返回正值,这意味着文件大小大于2 GiB。strcmp在两个字符串上返回零的返回值100%相同,这意味着文件大小恰好是2 GiB。
请注意,使用字符串比较来比较值需要两个值具有相同的数字位数才能获得准确的结果。位数较少的值字符串必须以正确的数量开头0。
| 归档时间: |
|
| 查看次数: |
19110 次 |
| 最近记录: |