找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 25190|回复: 12

[其他] 求助批处理if命令“或”应该怎么写

[复制链接]
发表于 2021-9-15 17:07:33 | 显示全部楼层 |阅读模式
if命令中“或”到底应该怎么表示?我遇到的问题是,
  1. if /i "%~x1" neq ".mp4" if /i "%~x1" neq ".mkv" if /i "%~x1" neq ".jpg" if /i "%~x1" neq ".png" goto end
复制代码
,这段代码运行的效果是如果文件后缀名不是这4个的其中1个就结束运行,但是这一段代码
  1. if /i "%~x1" neq ".mp4" if /i "%~x1" neq ".mkv" if /i "%~x1" neq ".jpg" if /i "%~x1" neq ".png" (
  2. copy /b "%~nx1"+"%~nx2" "%~n2%~x1"
  3. ) else (copy /b "%~nx2"+"%~nx1" "%~n1%~x2")
复制代码
它运行的效果并不是如果文件后缀名不是这4个的其中1个就怎样怎样,而是只有最后一个if条件生效,也就是后缀不为png时才运行后面的结果,为什么两段类似的条件表达的结果不一样,是因为else的原因吗?
发表于 2021-9-15 17:22:25 | 显示全部楼层
我记得字符串比较好像是
字符串1==字符串2

if not 字符串1==字符串2
 楼主| 发表于 2021-9-15 17:29:45 | 显示全部楼层
回复 2# Fit 跟这个应该没关系,字符串1==字符串2即字符串1 equ 字符串2,if not 字符串1==字符串2即if 字符串1 neq 字符串2。
发表于 2021-9-15 17:36:08 | 显示全部楼层
本帖最后由 Fit 于 2021-9-15 17:57 编辑

if /i "%~x1" neq ".mp4" (
   if /i "%~x1" neq ".mkv" (
      if /i "%~x1" neq ".jpg" (
         if /i "%~x1" neq ".png" (
             copy /b "%~nx1"+"%~nx2" "%~n2%~x1"
             goto a)
      )
   )
)
copy /b "%~nx2"+"%~nx1" "%~n1%~x2"
:a
发表于 2021-9-15 17:42:45 | 显示全部楼层
回复 3# 1967906656

刚试了下equ,对的。
发表于 2021-9-16 08:51:16 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2021-9-16 09:35 编辑

回复 1# 1967906656
if 判断语句没有“或”的表示法,你的代码存在以下问题:
1.连续的if判断最好每个都加上括号,这样看起来逻辑性较强;
2.第一段代码是在一行中,后面又没有else语句,基本符合if语句的规则,但规范的写法和4楼的代码基本一样,不建议写在一行中;
3.第二段代码问题就比较大。本来多重判断写的就不规范,最后一个if语句突然就“规范”起来(加上了括号),造成的后果就是else只认最后一个if语句,前面一连串的其它语句就会失效,因此就会造成你说的结果。
如果要实现第二段代码所要的目的,可以这样:
  1. set n=true
  2. if 条件1 (
  3.     if 条件2 (
  4.         if 条件3 (
  5.             3个条件均满足,执行实现目标的语句
  6.             set n=
  7.         )
  8.     )
  9. )

  10. if defined n (
  11.     不满足上面条件,执行实现目标的另外语句
  12. )
复制代码
发表于 2021-9-16 09:02:04 | 显示全部楼层
反过来判断就好了,下面实现或的判断。
if /i "%~x1" equ ".mp4" goto a
f /i "%~x1" equ ".mkv" goto a
if /i "%~x1" equ ".jpg" goto a
if /i "%~x1" equ ".png" goto a
goto eof
:a
发表于 2021-9-16 09:20:33 | 显示全部楼层
回复 7# 380333722


    建议按照4楼的格式写。你这个写法可能导致if被重复执行4次,效率较低。4楼的写法if只执行1次。
发表于 2021-9-16 09:28:36 | 显示全部楼层
本帖最后由 380333722 于 2021-9-16 09:32 编辑

回复 8# qixiaobin0715


    for循环里是无法实现跳转的,如果想实现,需要用 call 方式调用模块,在模块里可以跳转。例如:
for /l %%x (1,1,100) do (call :SUB "%%~x1")
goto :eof
:SUB
if "%~1"=="" (goto :eof)
if /i "%~1" equ ".mp4" (goto a)
f /i "%~1" equ ".mkv" (goto a)
if /i "%~1" equ ".jpg" (goto a)
if /i "%~1" equ ".png" (goto a)
goto :eof
:a
echo %~1
goto :eof
发表于 2021-9-16 09:35:17 | 显示全部楼层
回复 9# Batcher


我也会按4楼的方法写,不过有些时候这样写的优势是逻辑更清晰,适合调试,不用考虑括号配对问题,等调试好了,再改成4楼的方式。
另外,批处理处理这些小问题,其实不用考虑效率,批处理本来也不是高效率的。如果是涉及处理大文件,则需要重视效率。
发表于 2021-9-16 10:13:04 | 显示全部楼层
  1. for %%a in (".mp4" ".mkv" ".jpg" ".png") do set "#%%~a=1"
  2. if not defined #%~x1 (
  3.         echo;都不符合
  4. ) else (
  5.         echo;符合其一
  6. )
复制代码

评分

参与人数 1技术 +1 收起 理由
qixiaobin0715 + 1 思路巧妙!

查看全部评分

发表于 2021-9-16 10:49:41 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2021-9-16 16:09 编辑

回复 12# zaqmlp
这个思路好,实际上不用for,可把已知扩展名先定义为变量:
  1. set /a .mp4=.mkv=.jpg=.png=0
  2. ......
  3. if not defined %~x1 (
  4.         echo;都不符合
  5. ) else (
  6.         echo;符合其一
  7. )
复制代码
发表于 2021-9-16 11:25:05 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. set "ext_list=/.mp4/.mkv/.jpg/.png/"

  4. for %%a in ("d:\1.mkv") do (
  5.         echo;ext is: %%~xa
  6.         echo;!ext_list:/%%~xa/=!
  7.         if "!ext_list:/%%~xa/=!" equ "!ext_list!" (echo;not in list) else echo;in list
  8. )
  9. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 00:40 , Processed in 0.034080 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表