batch-file - 使用批处理,为什么 %string% GTR/GEQ 数等于 true?
问题描述
为什么字符串值大于 ( GTR
) 或大于或等于 ( GEQ
) 的数字总是返回值true
?
例如这个:
Set var=abc
if %var% gtr 0 echo true
或者
if %var% geq 0 echo true
无论比较次数是多少“var”,结果都是一样的。为什么?
另外为什么使用LSS
或LEQ
(小于,小于或等于)结果总是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
但我不明白为什么它会这样工作。
先感谢您。
解决方案
当使用此语法 ( 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,这已解释。
推荐阅读
- ios - 如何使用 swift playground 将概率分配给 switch 语句中的随机间隔?
- html - 悬停时从左下角到右上角对角过渡背景颜色
- ios - 在手机休眠时运行计时器
- android - 在 Flutter pubspec.yaml 文件中将版本更新为 1.1.0+3 但在上传到 playConsole 时,仍然错误版本代码 1
- javascript - 导致什么都没有发生和“发送”未定义的代码问题
- javascript - 此 Javascript 在 IE 或 Edge 中不起作用。有人有什么想法吗?
- angular - 根据需要销毁 Angular 组件
- spring - JpaRepository findByFieldEquals 忽略大小写
- python - 来自两列的滚动事件
- react-native - Appium 用于 React Native 应用程序的 accessibilityLabel 的替代方案