![Board logo](images/default/logo.gif)
标题: [特效代码] [分享]批处理IF实现OR的一种方法 [打印本页]
作者: caruko 时间: 2011-1-24 16:16 标题: [分享]批处理IF实现OR的一种方法
在if中实现 AND,很容易,直接嵌套就可以了..
而实现OR就很不方便了,比如要 if (A=B OR C=D) command
一般情况下,都用这种方法
if A=B (command) else (if C=D command)
这样就需要重复代码,如果在一堆很长很复杂代码中,或者还有第3,第4个条件时,复杂度就大大提高。
实际上,逻辑或在CMD中有,不错,就是set /a
如上例,可以这样
if A=B set /a m=1
if C=D set /a n=1
set /a x=m "|" n
if %x% EQU 1 command
如果有多个条件,以及嵌套,就可以这样
set /a x=(a "|" b) "&" (c "|" d)
同理,还可以实现XOR
[ 本帖最后由 caruko 于 2011-1-24 16:21 编辑 ]
作者: 随风 时间: 2011-1-24 16:48
感谢分享
看意思好像是只要有一个if成立就 command
我一般都是 if defined 简洁程度似乎不亚于这个方法 ^_^
if a==b set m=a
if c==d set m=a
if defined m command
不知是我没理解透还是。。。
作者: hanyeguxing 时间: 2011-1-24 17:05
知道更多思路是好事,实际使用需要根据情况来决定
例如:一天前的日期的获取,要求 %date% 形如2011-01-24 ......- @echo off
- set/a D=1%date:~8,2%%%100-1,M=1%date:~5,2%%%100-!D,Y=%date:~0,4%-!M,M+=!M*12,"K=!(M-4)|!(M-6)|!(M-9)|!(M-11)","D+=!D*(!(M-2)*(28+!(Y%%4))+K*30+(!!(M-2)&!K)*31)"
- set M=0%M%&set D=0%D%
- Echo;%Y%-%M:~-2%-%D:~-2%&pause
复制代码
在这里:
D=1%date:~8,2%%%100-1 当前日期减1
M=1%date:~5,2%%%100-!D 如果D为0,则M减1,否则M不变
Y=%date:~0,4%-!M 如果M为0,则Y减1,否则Y不变
M+=!M*12 如果M为0,则令M为12,否则M不变
"K=!(M-4)|!(M-6)|!(M-9)|!(M-11)" 如果M为4或6或9或11,令K为1,其他时候为0
D+=!D*(!(M-2)*(28+!(Y%%4))+K*30+(!!(M-2)&!K)*31) 这里!D* :如果D为非0,则D不变,如果D为0,则D为(!(M-2)*(28+!(Y%%4))+K*30+(!!(M-2)&!K)*31)
而(!(M-2)*(28+!(Y%%4))+K*30+(!!(M-2)&!K)*31)中,如果M为4或6或9或11,则D为30;如果M为1或3或5或7或8或10或12时,D为31;如果M为2时,若闰年D为29,若非闰年,D为28
在这一个set/a中,完成了大量的if判断
所以楼主的思路放到复杂运算中,效果会很好,但放到非数字的一般字符逻辑中,效果就不明显
[ 本帖最后由 hanyeguxing 于 2011-1-24 17:50 编辑 ]
作者: caruko 时间: 2011-1-24 19:12
楼上代码确实很巧妙。。
大开眼界!
一般字符处理确实用不上那个,2楼的方法处理2个条件足够了。
可能在需要复杂判断的情况下,用数值逻辑计算代替IF的逻辑判断,可以节省大量代码,同时代码可读性也大大提高。
作者: hanyeguxing 时间: 2011-1-24 19:49 标题: 回复 4楼 的帖子
条件:(区分大小写,不存在敏感字符)
变量%a%为a,%b%不为b时
或者
变量%a%为a,变量b、c、d分别为b、c、d时
或者
%d%为d-时
满足以上条件时显示ok:- if "%a%"=="a" (
- if not "%b%"=="b" set n==
- if "%b%|%c%|%d%"=="b|c|d" set n==
- )
- if "%d%"=="d-" set n==
- if defined n echo ok
复制代码
这里 | 为变量值中不存在的字符
[ 本帖最后由 hanyeguxing 于 2011-1-24 20:10 编辑 ]
作者: powerbat 时间: 2011-1-24 22:14
一般来说,当一个批处理学习者的水平达到掌握“逻辑或”、“算术或”这些概念的时候,自然就会想到这个方法。
可惜当今初中生甚至高中生的计算机知识都没到了解“求余运算”这个水平,现代化教育实在可悲。
作者: zhoubin 时间: 2011-1-24 23:12
原帖由 caruko 于 2011-1-24 16:16 发表 ![](http://www.bathome.net/images/common/back.gif)
实际上,逻辑或在CMD中有,不错,就是set /a
如上例,可以这样
if A=B set /a m=1
if C=D set /a n=1
set /a x=m "|" n
if %x% EQU 1 command
如果有多个条件,以及嵌套,就可以这样
set /a x=(a "|" b) "&" (c "|" d)
同理,还可以实现XOR
不错,谢谢楼主,小菜鸟我水平太低。
我从第三句开始就看不懂了,不过我感觉这个可能不错。
我找机会试一下,谢谢楼主。。。
作者: caruko 时间: 2011-1-25 01:52
原帖由 hanyeguxing 于 2011-1-24 19:49 发表 ![](http://bbs.bathome.net/images/common/back.gif)
条件:(区分大小写,不存在敏感字符)
变量%a%为a,%b%不为b时
或者
变量%a%为a,变量b、c、d分别为b、c、d时
或者
%d%为d-时
满足以上条件时显示ok:if "%a%"=="a" (
if not "%b%"=="b" set n==
if "%b%|% ...
不错,"%b%|%c%|%d%"=="b!c!d"很有意思,而且很直观。也很方便字符判断。
逻辑运算归根结底就是0,1运算,字符模拟确实可以做到。
[ 本帖最后由 caruko 于 2011-1-25 01:56 编辑 ]
作者: acaigg 时间: 2011-1-25 19:20
学习一下。谢谢分享!
作者: 空-空 时间: 2015-7-25 14:52
好像这方法都行不通
作者: meiszp 时间: 2019-1-21 21:05
这两句看不明白, "|"和"&"带双引号什么意思呢?
set /a x=m "|" n
set /a x=(a "|" b) "&" (c "|" d)
作者: Batcher 时间: 2019-1-21 21:34
回复 11# meiszp
set /? 命令的帮助信息里有介绍:
& - bitwise and
^ - bitwise exclusive or
| - bitwise or
参考:
https://baike.baidu.com/item/%E5%B8%83%E5%B0%94%E8%BF%90%E7%AE%97
作者: meiszp 时间: 2019-1-21 21:38
回复 12# Batcher
谢谢!加个双引号有点不理解。
作者: Batcher 时间: 2019-1-21 21:42
回复 13# meiszp
这些运算符号本身是特殊字符,如果不加引号会报错,试试就知道了。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |