[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 批处理如何在循环中保存变量?

  1. :test_不要在endlocal & call set 后面加 & rem )
  2. @ echo off
  3. set "srcFile=a.reg"
  4. set "dstFile=b.reg"
  5. type "%~f0">"%TEMP%\$$$"
  6. type nul>"%dstFile%"
  7. set flag_is_hex=0
  8.         set sum=
  9. @setlocal DisableDelayedExpansion & rem (
  10. for /f "delims=" %%a in ('findstr /n .* "%TEMP%\$$$"') do (
  11. set "line=%%a"
  12. @setlocal EnableDelayedExpansion & rem (
  13. set line=!line:*:=!
  14. @ set line
  15. if not defined line (
  16. (echo;)>>"%dstFile%"
  17. ) else (
  18. @ echo flag_is_hex1=!flag_is_hex!&pause
  19. if "!flag_is_hex!"=="0" (
  20. @ echo flag_is_hex2=!flag_is_hex!&pause
  21.                                 set sum=!sum!!line!
  22. ) else (
  23. rem 预期不可能会跑到这里来,但实际很奇怪的跑到了这里
  24. @ echo flag_is_hex3=!flag_is_hex!&pause
  25. )
  26. )
  27. @endlocal & call set flag_is_hex=%%flag_is_hex%% & call set sum=%%sum%% & rem )
  28. )
  29. @endlocal & rem )
  30. pause
  31. @goto :EOF
复制代码
遇到个奇怪的问题,把 @endlocal & call set flag_is_hex=%%flag_is_hex%% & rem )
后面的  & rem ) 语句去掉就正常了。
但我不明白它为什么为跑到错误的分支。求大神解惑

另外,似乎没有办法把 sum 原样地保存到下一次循环,
使用 %%sum%% 也会对 sum 里面的变量求值,如sum 里面有 %TEMP%, 这个值会被展开
如何在循环中保存变量,对我来说一直是个难题。。。

本帖最后由 qixiaobin0715 于 2024-12-23 10:03 编辑

1.没看明白在代码中为何要加上那么多rem,到底会起什么作用;
2.setlocal endlocal----endlocal之间的设置变量会在执行到endlocal后全部归空,相当于结束此段内部环境变量的设置。所以下一次循环开始时sum就是一个空值。

TOP

难道不是因为把流程搞混了? 还有加那么多没意义的 & rem ( 和& rem )做啥?

想在setlocal EnableDelayedExpansion后继续使用变量就将变量带出去
或者单独弄一个call 流程

TOP

本帖最后由 aloha20200628 于 2024-12-23 11:41 编辑

回复 1# tiandyoin

   关于 !var! 变量在符合语句中如何 ‘续命’ 给 %var% 变量,是批处的一个经典话题,已知 endlocal &set "gv=%lv%" 或 endlocal &set "gv=%%lv%%" 两个句式可用于非复合语块,但在复合语块中则无效(因cmd预处理所致),这就是为何一楼代码27行赋值无效而导致 if 分支错判的关键原因...
   要在复合语块中实现!v! ‘续命’ 给%v%,可参考以下代码示例(关键是逃逸cmd预处理

一。一个变量 !_#xx! ‘续命’ 给变量 %_#xx%
  1. @echo off &setlocal &set/a "_#xx=0"
  2. for /l %%n in (1,1,3) do (
  3.     setlocal enabledelayedexpansion
  4.     set/a "_#xx+=1, xx+=1"
  5.     for /f "delims=" %%a in ('set _#') do (endlocal&set "%%a")
  6. )
  7. set _#
  8. echo,xx=%xx%
  9. pause&exit/b
复制代码
二。多个!v! 变量 !_#xx!, !_#yy!, !_#zz! ‘续命’ 给变量 %_#xx%, %_#yy%, %_#zz%
  1. @echo off &setlocal &set/a "_#xx=_#yy=_#zz=0"
  2. for /l %%n in (1,1,3) do (
  3.     setlocal enabledelayedexpansion
  4.     set/a "_#xx+=1, _#yy+=5, _#zz+=10, xyz+=1"
  5.     set "k=1" &for /f "delims=" %%a in ('set _#') do (
  6.         if defined k (endlocal&set "k=")
  7.         set "%%a")
  8. )
  9. set _#
  10. echo,xyz=%xyz%
  11. pause&exit/b
复制代码
1

评分人数

    • tiandyoin: 巧妙利用 for 自动变量保存临时变量,带出 ...技术 + 1

TOP

本帖最后由 tiandyoin 于 2024-12-23 12:36 编辑

回复 4# aloha20200628


    妙呀,我怎么没想到万能的 for ,只要放在 %%a 里面就可以了。
  1. type 2>nul
  2. endlocal & if errorlevel 1 set ...
  3. ::也可以带出err,不过只能赋值常量标记
复制代码

TOP

回复 3# Five66


我使用 Notepad++ 等一些高级编辑器,只要选中左(右)括号,就可以定位到对应的右(左)括号

TOP

@endlocal & call set flag_is_hex=%%flag_is_hex%%空格& call set sum=%%sum%%空格& rem )
变量值会包括空格
bat小白,请多指教!谢谢!

TOP

回复 6# tiandyoin


    啊 ,你这代码没有其他字面值的括号干扰吧 ,不加编辑器不也能正确匹配??

TOP

返回列表