Win7下bat条件满足语句不执行的奇怪案例

news/2025/10/3 11:34:09/文章来源:https://www.cnblogs.com/wutou/p/19124373

前言全局说明

今天在写bat脚本时,一个if里的部分代码不执行。


一、说明

1.1 环境:

Windows 7 旗舰版

二、错误结果

2.1 错误结果图片

image

2.2 错误结果代码

@echo offset updata_conf_flag=False@REM 检查adb_PATH变量是否空
:input_adb_PATH 
if "%adb_PATH%" == "" (set /p "adb_PATH=[ INPUT ] 请输入adb路径:" if "%adb_PATH%" == "" ( echo ----adb_PATH=%adb_PATH%@REM 再次检查是否为空 goto input_adb_PATH) @REM bug:上面内容执行了,下面2句内容没有执行,为什么?set updata_conf_flag=True echo 1updata_conf_flag1=%updata_conf_flag% 
) 
echo aldkfjif "%updata_conf_flag%" == "True" (echo updata_conf_flag1=%updata_conf_flag%
) else (echo updata_conf_flag2=%updata_conf_flag%
)@REM 
echo. && echo. && echo. && pause

三、问题分析

3.1 正常过程

按上面代码里执行,正常结果,第16行应该会输出echo的相关内容。

3.2 出现问题

第8-13行执行后,第15、16行没有执行,就直接跳到 18行执行

3.3 问题排查

确认后、不是语法错误、也不是变量名和关键字重名。

既然第8-13行执行会,把15、16行挪到9行之前,得到结果也能执行,排除15、16行语法或其他问题。

那么,很明显,问题出在9-13行。看到结果,输出了"----adb_PATH=", 说明已经进入到了 10-12行执行了。

奇怪,上面提示输入的时候,已经输入了,但是为什么判断还为空?
而且还有个问题,既然判为空应该执行到 goto 跳到标签处(第6行),再次提示用户输入,可是没有跳到第6行,而是跳出,直接到了18行?

3.4 问题解决

3.4.1 已经输入了,但是为什么判断还为空?

这个问题需要使用“延迟变量”解决。

3.4.2 可是没有跳到第6行,而是跳出,直接到了18行?

和上面问题一样,也是用“延迟变量”解决。
延迟变量是什么? 
举例子,把 set 和下面的 if语句看成两个人干活。
正常情况下,set 干完活 if 就去拿 set 赋值完变量去用。
但是,因为 set 干活慢(执行指令时间长),还没干完,if就去拿结果,if肯定拿不到结果。
if去拿了,set又不能不给,所以给了个错误结果,也许是随机值,也许是不完整的值。
此时巧了,if拿到了空值,所以 if 语句成立,但是刚执行完第10行,set活干完了,
可能把内存中 第12行的内容覆盖了(具体没有去看,先这么认为),然后就出现错误,跳出了 2 层if,继续执行后面第18行当内容
延迟变量的缺点。
如果全文开启,那么在后续使用都要把 % 替换成 ! ,在有些不需要延迟变量的地方,还可能出去其他问题。
所以,最好像下面代码里修改的一样,哪里用到,在哪里开启,用完直接关闭。下次再用到,再打开。

四、问题解决

4.1 使用“延迟变量”

红框处,是增加代码,箭头处把 %adb_PATH% 改成 !adb_PATH!
image

细心的你肯定发现,18行输出的代码结果还是不对。原因还是没有使用“延迟变量”。
只不过这次干活的人把 if 换成里 echo ,其实最后的结果 执行了第23行就对了。
18行那个输出只是调试用看的,调试完删除即可。

4.2 修改后的代码

@echo offset updata_conf_flag=False@REM 检查adb_PATH变量是否空
:input_adb_PATH 
if "%adb_PATH%" == "" (set /p "adb_PATH=[ INPUT ] 请输入adb路径:" setlocal enabledelayedexpansionif "!adb_PATH!" == "" ( echo ----adb_PATH=%adb_PATH%@REM 再次检查是否为空 goto input_adb_PATH) setlocal disabledelayedexpansion@REM bug:上面内容执行了,下面2句内容没有执行,为什么?set updata_conf_flag=Trueecho 1updata_conf_flag1=%updata_conf_flag% 
) 
echo aldkfjif "%updata_conf_flag%" == "True" (echo updata_conf_flag1=%updata_conf_flag%
) else (echo updata_conf_flag2=%updata_conf_flag%
)@REM 
echo. && echo. && echo. && pause


免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。




参考、来源:



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt qtablewidget 行拖动(事件过滤器)

#include <QTableWidget> class TablewidgetLineDropFilter : public QObject {Q_OBJECT public:explicit TablewidgetLineDropFilter(QTableWidget* _box,QObject *parent = nullptr) : QObject(parent) {table…

3.8 材料链路层设备 (答案见原书 P122)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

for (EmpExpr empExpr : exprList) {}语法糖

for (EmpExpr empExpr : exprList) {循环体}这段代码表示对名为exprList的集合进行遍历,每次循环取出其中的元素作为EmpExpr类型的对象empExpr。 (遍历 exprList 集合中的每一个元素,每次循环将当前元素赋值给 empE…

251003

目录JT-JY6T3S1-1JT-JY6T3S2-2FT-(JY&VOAs) JT-JY6T3S1-1Good morning, id like to open the bank account please. Certainly, if youd like to take a seat , iwill just get some details from you, you wont t…

wordpress建站博客网站建设公司业务跟不上

3D产品配置器能够为企业的客户带来多重好处&#xff0c;提升他们的整体购物体验和满意度。 主要优势分析&#xff1a; 1、 提升购物体验&#xff1a;3D产品配置器通过提供交互式的3D可视化体验&#xff0c;使客户能够从不同角度查看和理解产品&#xff0c;从而提升他们的购物体…

济宁网站建设 果壳科技wordpress制作数据排行榜

引言 什么是分布式锁&#xff1f; 分布式锁是分布式系统中用于控制多个进程或线程对共享资源的访问的一种机制。在分布式系统中&#xff0c;由于存在多个服务实例或节点&#xff0c;它们可能会同时尝试访问或修改同一份数据或资源。如果没有适当的同步机制&#xff0c;就可能导…

怎么做个人网站建设wordpress关闭注册发邮件

目录快捷键文字样式设置&#xff08;字体, 大小, 颜色, 高亮底色&#xff09;内嵌HTML表格定义列表代码块脚注数学公式UML 图:离线写博客常见颜色[TOC](目录)快捷键 - 加粗 Ctrl B - 斜体 Ctrl I - 引用 Ctrl Q- 插入链接 Ctrl L- 插入代码 Ctrl K- 插入图…

1核1g服务器做网站网页生成助手

大家好&#xff0c;这里是深海网络&#xff0c;今天给大家讲解一下新版影视小程序搭建。  首先给大家看一下新版影视小程序是什么样子的&#xff0c;它有黑夜和白天两种观影模式&#xff0c;而且搜索精准&#xff0c;播放速度快。01第一步&#xff0c;开始正式搭建。新版区小…

深入解析:以CodeBuddy Code为砚,Prompt为丹青,勾勒编程星河

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

学习项目movie-web:构建本地电影、电视视频中心 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Rust泛型详解 - 实践

Rust泛型详解 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

网站建设课程的感想在线考试系统网站开发

算法提高课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 题目描述 给定一个长度为 n n n 的数组&#xff0c;数组中的第 i i i 个数字表示一个给定股票在第 i i i 天的价格。 设计一个算法来计算你所能获取的最大利润&#xff0c;你最多可以完成 k k k 笔交易…

怎么做自己的购物网站怎么给自己建网站

文章目录树状数组lowbit线段树与树状数组单点修改区间查询区间修改区间求和二维树状数组离线树状数组例题POJ&#xff1a;starsMooFest[SDOI2009]HH的项链Turing TreeCounting SequencesZip-line树状数组 用于快速高效的计算与前缀和相关的信息 lowbit int lowbit( int i ) …

有个做搞笑视频的网站桂林市天气预报15天准确

在开发项目过程中&#xff0c;为了方便调试代码&#xff0c;经常会向stdout中输出一些日志&#xff0c;默认的这些日志就直接显示在了终端中。而一般的应用服务器&#xff0c;第三方库&#xff0c;甚至服务器的一些通告也会在终端中显示&#xff0c;这样就搅乱了我们想要的信息…

番禺 大石网站建设建筑模板制作过程

是什么 官网&#xff1a;Redis cluster specification | Redis 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作…

AT_abc205_e [ABC205E] White and Black Balls

本质上就是将卡特兰数的 \(y = x\) 这条限制线移到了 \(y = x + k\) 这条限制线,格路计数即可。

transformers音频实战01-音频概念 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做发包业务网站wordpress主题谁的最好

说明 本文根据B站up主唐老狮的课程所学所记 目录 说明本文根据B站up主唐老狮的课程所学所记 UML面向对象七大原则总体实现目标单一职责原则&#xff08;SRP&#xff0c;Single Responsibility Principle&#xff09;开闭原则&#xff08;OCP&#xff0c;Open-Closed Principle…

网站建设介绍大全杭州网络推广专员

浅谈web应用的负载均衡、集群、高可用(HA)解决方案转载于:https://www.cnblogs.com/hfultrastrong/p/7887420.html

Python 自动化导出PDF表格:List、Dictionary、Pandas DataFrame和数据库实例演示 - 指南

Python 自动化导出PDF表格:List、Dictionary、Pandas DataFrame和数据库实例演示 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importan…