【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=%%i
	echo.%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 65001

for /f "delims=" %%i in ('findstr /n .* %0') do (
   set str=%%i
   setlocal enabledelayedexpansion
   set 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 65001

rem 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%

运行结果


参考:



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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值