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

[其他] 将 setlocal 和 endlocal 之间的变量 传递到 endlocal 之后,变量的数量不定

[复制链接]
 楼主| 发表于 2024-8-25 04:03:30 | 显示全部楼层
如果比较复杂的,setlocal 隔离还是必要的,虽然隔离要麻烦些。
我现在遇到的一个情况是,以前有一个脚本,单独使用的,现在要在另一个脚本里调用,两个脚本里有变量冲突。
认为,与其改变量名,不如 setlocal ,仅仅返回需要的变量,把输出的变量名,前面加一个前缀,_a_var1
用一个通用的办法比较好些。
 楼主| 发表于 2024-8-25 04:05:52 | 显示全部楼层
本帖最后由 newswan 于 2024-8-25 04:10 编辑

回复 13# HOPE2021

变量名 变量值 不够多的时候,可以,一般的脚本不会有那么多输出。
可以用把参数的方式返回。调用的地方获取整个字符串后,再进行处理。
 楼主| 发表于 2024-8-25 04:13:36 | 显示全部楼层
回复 3# qixiaobin0715

代码位置是在 endlocal 之外,但是逻辑上还是在 endlocal 运行之前
 楼主| 发表于 2024-8-25 04:39:17 | 显示全部楼层
本帖最后由 newswan 于 2024-8-26 09:55 编辑

最后选择这种方式
a.bat

  1. @echo off
  2. setlocal

  3. set _var1_=111
  4. call b.bat

  5. echo :1
  6. set _

  7. for /f "usebackq tokens=1,* delims==" %%a in (`set __`) do (
  8.         set _b%%a=%%b
  9.         set %%a=
  10. )

  11. echo :2
  12. set _

  13. endlocal

  14. pause
  15. exit/b
复制代码
b.bat

  1. @echo off
  2. setlocal enableDelayedExpansion

  3. set __var1__=value1
  4. set __var2__=value2
  5. set __var3__=value3

  6. for /f "delims=" %%a in ('set __') do (
  7.         if defined _inLocal_ (endlocal)
  8.         set %%a
  9. )

  10. exit/b
复制代码
个人习惯,变量用 "_" 开头,要输出的变量,用 "__" 开头
发表于 2024-8-25 10:49:34 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-8-25 10:56 编辑

回复 1# newswan

主批通过 call 调用子批,其实是共享主批的变量环境,除非子批用 setlocal [...] 独建自己的本地变量环境,但子批最后将本地变量 ‘续命’ 给主批,还是要避免与主批的同类同名变量的覆盖问题,因此,多个子批被主批通过 call 调用的一个简捷而稳妥之策,是由主批给每个子批分配共享变量名区段(子批独建的本地变量除外)用前缀或后缀或流水号标识等方法,不必再绕经每个子批的 ‘续命’
弯道,此法不仅是针对批处,其他脚本依然... 仅供参考
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 22:21 , Processed in 0.017149 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表