Board logo

标题: [特效代码] [分享]批处理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 ......
  1. @echo off
  2. 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)"
  3. set M=0%M%&set D=0%D%
  4. 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:
  1. if "%a%"=="a" (
  2. if not "%b%"=="b" set n==
  3. if "%b%|%c%|%d%"=="b|c|d" set n==
  4. )
  5. if "%d%"=="d-" set n==
  6. 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 发表
实际上,逻辑或在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 发表
条件:(区分大小写,不存在敏感字符)
变量%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://bbs.bathome.net/) Powered by Discuz! 7.2