【CMD】关于在for中SET变量失效的问题

  如题,在for中进行一些细化操作时发现SET变量一直不成功(尤其在读取文件时)
  简单搜了下看到有个帖子(BAT求助与讨论-SET变量失效)是讨论这个问题的,然后有个老哥给出的解答,其中使用了使用CALL,这让我想起几天前看到的一个博客(批处理获取当前目录名称(非完整路径))也是用了CALL,只能说CALL+goto这俩命令是真的伟大(不少疑难杂症要通过这个方式绕开),同时也深深感叹Win的命令行工具写的跟坨苟石一样。

  然后在处理“for命令读取文本时跳过空行的问题”时又看到了一个帖子(BAT求助与讨论-for命令不遗漏空行)(又是同个域名-批处理之家)给出了答案,其中用的是setlocal enabledelayedexpansionendlocal,至于这俩命令的作用我也不是很关心,我这里就主要以CALL+goto的搭配编写脚本。



CMD/BAT脚本代码:

无效代码:

@echo off
rem 这个脚本无法成功SET变量,导致无法进一步操作
for /f "delims=" %%i in (%0) do (SET val=%%iecho.%val%
)

有效代码-【CALL+goto】:

@echo off
chcp 65001
for /f "delims=" %%i in (%0) do (call :DoSth "%%i"
)
goto :eof:DoSth
rem 将头尾的引号去除以获取行数据
SET row=%1
SET row=%row:~1,-1%
echo %row%

有效代码-【setlocal enabledelayedexpansion+endlocal】:

@echo off
chcp 65001for /f "delims=" %%i in ('findstr /n .* %0') do (set str=%%isetlocal enabledelayedexpansionset str=!str:*:=!echo,!str!endlocal
)


实际运用场景:

例如,要逐行读取文本文件(往往是各种参数配置或者是其他)并进行一些细化操作。

当然,实际上可以自己写一些C/C++代码编译成exe程序供实际生产环境使用,不少时候是这么做的,自己花个把小时造的小轮子远比在BAT原生命令里苦苦寻找可行性操作要来得实际,例如我以前写的一个可通过命令行进行键鼠控制的小轮子(github)CPP_Mouse_Keyboard,这在原生命令行里是想都不敢想的操作(因为根本就没这样的命令)
bat命令是真的太令人感到悲哀,它的功能如此受限以至于不时怀疑这玩意儿到底还能干些啥


读取脚本开头的注释内容:

rem 解决for语句中set变量失效的问题:https://blog.csdn.net/weixin_44733774/article/details/134774369
rem 逐行获取文件内容:https://www.cnblogs.com/gered/p/10682741.html#autoid-2-0-0
rem 字符串截取+替换:https://zhuanlan.zhihu.com/p/421422830
rem for命令不遗漏空行:http://www.bathome.net/thread-9174-1-1.html
rem SET变量判空:https://blog.csdn.net/weixin_44733774/article/details/134774852@echo off
chcp 65001rem flag等效于循环语句的break。flag为0时后面的文本不作处理
SET flag=1
for /f "delims=" %%i in ('findstr /n .* %0') do (call :ReadRow "%%i")
goto :eof:ReadRow
if %flag%==0 (goto :eof)
SET row=%1
SET row=%row:~1,-1%
SET row=%row:*:=%
call :EmptyTest %row%
goto :eof:EmptyTest
if "%1"=="" ( echo. goto :eof
) if "%row:~,2%"=="::" (SET row=%row:~2%goto :PrintRow
)
if "%row:~,4%"=="rem " (SET row=%row:~4%goto :PrintRow
)
SET /A flag=0
goto :eof:PrintRow
echo %row%

运行结果


参考:

  • BAT求助与讨论-SET变量失效:http://www.bathome.net/thread-55988-1-1.html
  • BAT求助与讨论-for命令不遗漏空行:http://www.bathome.net/thread-9174-1-1.html


未经个人同意不得私自转载,本文发布于CSDN:https://blog.csdn.net/weixin_44733774/article/details/134774369

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

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

相关文章

Linux4.7、环境变量

个人主页:Lei宝啊 愿所有美好如期而遇 目录 基本概念 见见环境变量 指令原理 常见环境变量及其测试 环境变量相关指令 环境变量组织方式 通过代码获取环境变量 通过系统变量获取环境变量以及设置环境变量 环境变量的全局属性 基本概念 首先,…

什么?居然可以免费使用Jetbrains?!

JetBrains是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄罗斯的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA。 如下是jetbrains旗下的产…

【笔记】Clion 中运行 C/C++11 之 CMakeLists.txt 的配置

该文章记录第一次使用 Clion 时,对 CMakeLists 的配置,使其能够运行 C/C11 的代码。 一. CMakeLists.txt 的配置 1、首先我们在需要新建一个项目 2、填写新建项目相关的信息 3、修改 CMakeLists.txt 文件内容 替换文本: # 使用此 CMakeLis…

帆软报表不能增加SAP连接方式 通过插件一致性检测 同步至本地解决

帆软报表开发人员需要增加一个SAP数据连接方式:SAP_ECC_600环境 在服务器端不能直接增加,而在帆软报表设计器切换到远程模式时,又不能显示SAP连接,导致不能增加。 解决:重新进入帆软报表报计器时报以下错误&#xff0c…

开源运维监控系统-Nightingale(夜莺)应用实践(未完)

一、前言 某业务系统因OS改造,原先的Zabbix监控系统推倒后未重建,本来计划用外部企业内其他监控系统接入,后又通知需要自建才能对接,考虑之前zabbix的一些不便,本次计划采用一个类Prometheus的监控系统,镜调研后发现Nightingale兼容Prometheus,又有一些其他功能增强,又…

从马帮到金蝶云星空通过接口配置打通数据

从马帮到金蝶云星空通过接口配置打通数据 接入系统:马帮 上海马帮科技有限公司,是一家专注于提供全流程跨境电商ERP管理软件解决方案的企业。聚焦服务于各阶段、各领域的跨境电商从业者,旗下包含专业版ERP、亚马逊专用版ERP、东南亚海外版ERP…

JavaScript空值合并运算符

The Nullish Coalescing Operator(空值合并运算符)是一种 JavaScript 的新运算符,用于解决默认值设定中存在的一些问题。它的语法为 ??(两个问号),表示当左侧的操作数为 null 或 undefined 时&#xff0c…

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)spring boot项目搭建、vue项目搭建、微信小程序项目搭建

项目笔记为项目总结笔记,若有错误欢迎指出哟~ 【项目专栏】 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)项目搭建 持续更新中… java+vue+微信小程序项目】从零开始搭建——健身房管理平台 项目简介Java项目搭建(IDEA)1.新建项目2.项目类型3.项目设置4…

mysql基础语句

【select查询】 1、Select * from 表名; 查询 例: Where 限定的条件查询 AND 连接两个或者多个查询条件 OR 连接两个或者多个查询条件,满足其中一个就可以查询出 2、Select * from 表名 where 字段 某某条件; 例: 3、Selec…

EasyRecovery易恢复2024最新免费版电脑数据恢复软件功能介绍

EasyRecovery从(易恢复2024)支持恢复不同存储介质数据,在Windows中恢复受损和删除文件,以及能检索数据格式化或损坏卷,甚至还可以从初始化磁盘。同时,你只需要最简单的操作就可以恢复数据文件,如&#xff1…

kubeadm 安装k8s1.28.x 底层走containerd 容器

1. k8s1.28.x 的概述 1.1 k8s 1.28.x 更新 Kubernetes v1.28 是 2023 年的第二个大版本更新,包含了 46 项主要的更新。 而今年发布的第一个版本 v1.27 有近 60 项,所以可以看出来,在发布节奏调整后, 每个 Kubernetes 版本中都会包…

DeepSort知识整理:余弦距离和马氏距离 (一)

一、余弦距离 1.1 余弦相似度 余弦相似度是用来衡量两个非零向量之间的夹角的余弦值。对于两个向量 A A A 和 B B B,余弦相似度的计算公式为: C o s i n e S i m i l a r i t y ( A , B ) A ⋅ B ∥ A ∥ ∥ B ∥ {\rm{Cosine Similarity }}\left( …

maven篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、什么是Maven的坐标?二、讲一下maven的生命周期三、说说你熟悉哪些maven命令?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的…

离散型制造业生产管理mes系统介绍

典型的离散制造业主要包括机械、电子、航空、汽车等行业,这些企业既有按订单生产,也有按库存生产,既有批量生产,也有单件小批生产。那么,注重生产计划的制定,生产的快速响应是离散行业MES系统应用的关键。 …

两道面试题秒杀你的C++基础!

大家好,我是光城,今天发两个非常重要的面试题,可以留言区说出你的答案,这两个题目都比较重要,看你能答对不? 1.C中初始化变量有几种方式,各自有什么区别? 或者说Initialization分为哪…

【已验证】SqlBulkCopy 执行批量插入的时候报超时问题-解决办法

把datatable里面的数据插入到数据库,但是数据量大的情况下批量插入会提示超时,所以把datatable的数据分批写入数据库的 using (SqlConnection connection new SqlConnection(ConnectionString)){connection.Open();int pageSize 100000;//SqlBulkCopy大…

已解决:虚拟机集群xsehll连接不上

问题描述: hadoop102能连上,hadoop103、hadoop104无法连接,以前都能连上,今天突然就连不上了 解决方案: 使用ifconfig命令查看有没有ens33 如果没有的话那就证明你的问题和我一样 依次使用以下命令: sys…

MVCC是如何保证隔离性的

之前提到了MVCC可以一定程度上避免幻读,那具体MVCC是咋工作的呢? 需要介绍两个机制:read view和聚簇索引的两个隐藏列 read view 这个就是我们理解的快照,有四个字段,本事务id、活跃事务id列表(包含自己&…

精神衰弱怎么办?如何改变精神衰弱?

精神衰弱也叫神经衰弱,跟个人体质有一定的关系,更多是因为环境因素的长期作用所致,比如长期处于紧张和压力之下,这容易产生精神衰弱。当下有个流行词叫“精神内耗”,这个严重的精神内耗其实同样会导致精神衰弱。 精神…

MySQL 的 NULL 是怎么存储的?

目录 一、MySQL介绍 二、什么是NULL 三、MySQL 的 NULL 是怎么存储的 一、MySQL介绍 MySQL是一种关系型数据库管理系统(RDBMS),它是一种开源软件,由瑞典MySQL AB公司开发,后被Sun Microsystems收购,现在…