标题: [其他] 求助批处理if命令“或”应该怎么写 [打印本页]
作者: 1967906656 时间: 2021-9-15 17:07 标题: 求助批处理if命令“或”应该怎么写
if命令中“或”到底应该怎么表示?我遇到的问题是,- if /i "%~x1" neq ".mp4" if /i "%~x1" neq ".mkv" if /i "%~x1" neq ".jpg" if /i "%~x1" neq ".png" goto end
复制代码
,这段代码运行的效果是如果文件后缀名不是这4个的其中1个就结束运行,但是这一段代码- 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"
- ) 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语句,前面一连串的其它语句就会失效,因此就会造成你说的结果。
如果要实现第二段代码所要的目的,可以这样:- set n=true
- if 条件1 (
- if 条件2 (
- if 条件3 (
- 3个条件均满足,执行实现目标的语句
- set n=
- )
- )
- )
-
- if defined n (
- 不满足上面条件,执行实现目标的另外语句
- )
复制代码
作者: 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
- for %%a in (".mp4" ".mkv" ".jpg" ".png") do set "#%%~a=1"
- if not defined #%~x1 (
- echo;都不符合
- ) else (
- echo;符合其一
- )
复制代码
作者: qixiaobin0715 时间: 2021-9-16 10:49
本帖最后由 qixiaobin0715 于 2021-9-16 16:09 编辑
回复 12# zaqmlp
这个思路好,实际上不用for,可把已知扩展名先定义为变量:- set /a .mp4=.mkv=.jpg=.png=0
- ......
- if not defined %~x1 (
- echo;都不符合
- ) else (
- echo;符合其一
- )
复制代码
作者: a20150604 时间: 2021-9-16 11:25
- @echo off
- setlocal enabledelayedexpansion
-
- set "ext_list=/.mp4/.mkv/.jpg/.png/"
-
- for %%a in ("d:\1.mkv") do (
- echo;ext is: %%~xa
- echo;!ext_list:/%%~xa/=!
- if "!ext_list:/%%~xa/=!" equ "!ext_list!" (echo;not in list) else echo;in list
- )
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |