首页 > 解决方案 > 使用批处理,为什么 %string% GTR/GEQ 数等于 true?

问题描述

为什么字符串值大于 ( GTR) 或大于或等于 ( GEQ) 的数字总是返回值true

例如这个:

Set var=abc

if %var% gtr 0 echo true

或者

if %var% geq 0 echo true

无论比较次数是多少“var”,结果都是一样的。为什么?

另外为什么使用LSSLEQ(小于,小于或等于)结果总是false

我想创建一个简单的脚本,只允许最多 31 的数值和一个像这样的字母:

:MENU
CLS
echo. Insert Day or "X" to return to another script
Set /p variable=Insert date:

for /f "delims=0123456789" %%a in ("%variable%") do set variable=%%a

if not defined %variable% goto :MENU
if /i %variable% equ X goto :otherscript2

if %variable% equ 0 goto :MENU
if %variable% gtr 31 goto :MENU

:: Continue script
.
.

使用此脚本,只要数字在 1-31 之间,它将继续,如果有字母,它将返回,:MENU但如果是,X则转到:otherscript2。它按预期工作,我发现这是因为

  if %variable% gtr 31 goto :MENU

意思是

  if <string> gtr 31 goto :MENU // where <string> = any string except the X

但我不明白为什么它会这样工作。

先感谢您。

标签: batch-filevariablescmd

解决方案


当使用此语法 ( if string compare-op number statements) 比较字符串和数字时,使用第一个字符的 ascii 代码进行比较。在您的第一个示例中,您展示了:

set var=abc
if %var% gtr 0 echo True

这里字符串的第一个字符abc是a。a的ASCII码是65,大于0,所以返回True。要了解有关 ascii 代码的更多信息,请访问https://ee.hawaii.edu/~tep/EE160/Book/chap4/subsection2.1.1.1.html

并且您的代码有效,因为 X 和其他字符的 ascii 代码大于 31,这已解释。


推荐阅读