batch的“此时不应有)”报错、batch的if内部代码规范、batch最容易踩坑的几点探讨

此篇文章详细详细讲解了一、if内部的空行问题;二、if内部的标签问题;三、%变量%与!变量!混用问题

Hello,欢迎观看此篇文章,如有问题随时到首页的“关于”里提问哦~

最近闲来无事,又给我的bat项目更新了点,但这离谱的cmd解析器让我遇到了好几个棘手的问题,而且这些问题还都不是语法的问题,当时排查的我真的是很崩溃,于是整理给大家以防踩坑

一、if内部的空行问题

当我们写batch代码时有时候会为了好看而在if中加入空行,比如

if !errorlevel! equ 0 (
	call :log "成功检测到该文件!"
	CLS
	echo 检查权限中...(54%%)
	call :log "检测写入的内容..."
	CLS
	echo 检查权限中...(63%%)
	if "!findstrexist!"=="1" (
		!SYS_SYSTEM32!\findstr.exe /m "1" "Ivbjk39349292S89SBH28DH3.txt" > nul
		goto a12
	)
	if "!findstrno!"=="1" goto a12
	findstr /m "1" "Ivbjk39349292S89SBH28DH3.txt" > nul
	:a12
	
	echo 检查权限中...(72%%)
    if %errorlevel% equ 0 (
		call :log "成功检测到写入的内容"
		CLS
		echo 检查权限中...(81%%)
		call :log "检查删除权限"
	    DEL Ivbjk39349292S89SBH28DH3.txt
		CLS
...

我在:a12标签下加了个空行导致了脚本直接闪退,但具体报错忘了,提醒大家在编写脚本时注意如果无缘无故闪退了试着把空行删一下再试。

二、if内部的标签问题

我们在写代码时可能会在if内写入”:”标签,比如

if not "!js!"=="0" (
	if "!js!"=="1" (
		call :echo "有'NO'项,是否继续运行"
		:younoxuanze1
                ::上面这里
		set /p gl="请输入y或n: "
		if /i "!gl!"=="y" (
			call :log "y"
			cls
		) else if /i "!gl!"=="n" (
			call :log "n 退出"
			exit
		) else (
			goto younoxuanze1
		)

或者是下面的

call :yunxing "xxx.xxx" "xxx"
:yunxing
call :log "进入:yunxing"
call :log "当前文件夹下查找!name!中..."
dir /b /s !name! >nul 2>&1
call :log "errorlevel值:!errorlevel!"
if !errorlevel! equ 0 (
	call :log "成功找到!name!"
	if not "!sha256jianceno!"=="0" (
		call :log "检测!name!的SHA-256是否等于原来检测到的..."
		call :sha256bijiao "!name!"
		call :log "退出sha256bijiao"
		if "!errorlevel!"=="3" (
			call :log "已终止!name!的运行!"
			goto tswb
		)
		if "!errorlevel!"=="0" (
			call :log "!name!的SHA-256检测通过,正在进行内容查找检测..."
                        if "!findexist!"=="1" (
	                    !SYS_SYSTEM32!\find.exe "!contentdetection!" !name! > nul
	                    goto a6
                        )
                        if "!findno!"=="1" goto a6
                        find "!contentdetection!" !name! > nul
                        :a6
...

在某些时候可能就是因为这样的标签导致了脚本闪退,尤其是调用函数中函数内的if可能会也导致报错,报错内容比如“此时不应有)”,遇到这种情况还是新建个函数再call比较好。

比如这样:

:chazhao
if "!findexist!"=="1" (
	!SYS_SYSTEM32!\find.exe "!contentdetection!" !name! > nul
	goto a6
)
if "!findno!"=="1" goto a6
find "!contentdetection!" !name! > nul
:a6
exit /b

三、%变量%与!变量!混用问题

当你开启了延迟变量后虽然没强制禁用%%但在某些时候使用%%会导致脚本闪退,所以开启演示延迟变量后应当一直使用!变量!而非%变量%。

暂时就想到这么多,如有其他的会立即补充,也可通过主页的“关于”界面提交建议,如合适我会添加进去

好了,本篇文章就到这里了,谢谢观看!

类似文章