[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[特效代码] [分享]批处理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 编辑 ]
1

评分人数

感谢分享
看意思好像是只要有一个if成立就 command
我一般都是 if defined 简洁程度似乎不亚于这个方法 ^_^
if a==b set m=a
if c==d set m=a
if defined m command
不知是我没理解透还是。。。
技术问题请到论坛发帖求助!

TOP

知道更多思路是好事,实际使用需要根据情况来决定
例如:一天前的日期的获取,要求 %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 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

楼上代码确实很巧妙。。
大开眼界!

一般字符处理确实用不上那个,2楼的方法处理2个条件足够了。
可能在需要复杂判断的情况下,用数值逻辑计算代替IF的逻辑判断,可以节省大量代码,同时代码可读性也大大提高。

TOP

回复 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 编辑 ]
1

评分人数

    • zhoubin: 我试了一下,还是这个好!!!技术 + 1
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

一般来说,当一个批处理学习者的水平达到掌握“逻辑或”、“算术或”这些概念的时候,自然就会想到这个方法。

可惜当今初中生甚至高中生的计算机知识都没到了解“求余运算”这个水平,现代化教育实在可悲。

TOP

原帖由 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

不错,谢谢楼主,小菜鸟我水平太低。
我从第三句开始就看不懂了,不过我感觉这个可能不错。
我找机会试一下,谢谢楼主。。。

TOP

原帖由 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 编辑 ]

TOP

学习一下。谢谢分享!

TOP

好像这方法都行不通

TOP

这两句看不明白, "|"和"&"带双引号什么意思呢?
set /a x=m "|" n
set /a x=(a "|" b) "&" (c "|" d)

TOP

回复 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
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 12# Batcher
谢谢!加个双引号有点不理解。

TOP

回复 13# meiszp


    这些运算符号本身是特殊字符,如果不加引号会报错,试试就知道了。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表