Board logo

标题: [其他] 求助批处理if命令“或”应该怎么写 [打印本页]

作者: 1967906656    时间: 2021-9-15 17:07     标题: 求助批处理if命令“或”应该怎么写

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的原因吗?
作者: Fit    时间: 2021-9-15 17:22

我记得字符串比较好像是
字符串1==字符串2

if not 字符串1==字符串2
作者: 1967906656    时间: 2021-9-15 17:29

回复 2# Fit 跟这个应该没关系,字符串1==字符串2即字符串1 equ 字符串2,if not 字符串1==字符串2即if 字符串1 neq 字符串2。
作者: Fit    时间: 2021-9-15 17:36

本帖最后由 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
作者: Fit    时间: 2021-9-15 17:42

回复 3# 1967906656

刚试了下equ,对的。
作者: qixiaobin0715    时间: 2021-9-16 08:51

本帖最后由 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. )
复制代码

作者: 380333722    时间: 2021-9-16 09:02

反过来判断就好了,下面实现或的判断。
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
作者: Batcher    时间: 2021-9-16 09:20

回复 7# 380333722


    建议按照4楼的格式写。你这个写法可能导致if被重复执行4次,效率较低。4楼的写法if只执行1次。
作者: 380333722    时间: 2021-9-16 09:28

本帖最后由 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
作者: 380333722    时间: 2021-9-16 09:35

回复 9# Batcher


我也会按4楼的方法写,不过有些时候这样写的优势是逻辑更清晰,适合调试,不用考虑括号配对问题,等调试好了,再改成4楼的方式。
另外,批处理处理这些小问题,其实不用考虑效率,批处理本来也不是高效率的。如果是涉及处理大文件,则需要重视效率。
作者: zaqmlp    时间: 2021-9-16 10:13

  1. for %%a in (".mp4" ".mkv" ".jpg" ".png") do set "#%%~a=1"
  2. if not defined #%~x1 (
  3. echo;都不符合
  4. ) else (
  5. echo;符合其一
  6. )
复制代码

作者: qixiaobin0715    时间: 2021-9-16 10:49

本帖最后由 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. )
复制代码

作者: a20150604    时间: 2021-9-16 11:25

  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
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2