|
|
发表于 2012-11-13 23:53:07
|
显示全部楼层
本帖最后由 plp626 于 2012-11-14 01:21 编辑
回复 12# CrLf
我确实忽视了%~f0获取脚步自身路径;
但这里提供一个不太常见的情形:递归,(这也是后续总要面临的棘手问题)
%0, %~f0,总之, 遇到%var%这样预处理获取的值递归调用中,我暂且认为这是批处理的一个缺陷,
我用的方法就是保存变量然后setlocal; 读取的时候用!var!
--------------------------------------------------
对于多值返回,有时候效率会需要考虑,
函数开启setlocal,要想改写父环境变量,唯一的途径就是在endlocal时后才能改写,
带来的问题就是,你无法在开启setlocal的函数内部去改写外部环境变量的值(只能读,不能写),像C语言的指针传出参数用法没戏了;
有时候你不得不需要在函数内部中途改写外部变量,只好endlocal去改写,那么函数内部产生的“局部” 环境变量 也跟着释放了, 这不是我们想要的,
为此,我再三思考 在这个特殊需求的函数中,放弃开启setlocal
我是这个观点偷懒用setlocal, 你就要为效率付出代价。。
我有个大胆的想法,干脆用高级语言的栈空间思想吧, 临时变量函数内部的变量都用栈来维护。。。
------------------------------------- setlocal
- set test1=value1
- set test2=value2
- set test3=value3
- endlocal & set ret=%test1% %test2% %test3%
- for %%e in (%ret%) do echo %%e
复制代码 确实是个不错的方法,除去考虑效率的问题,在可读性和可维护性上都很好, 下一步就是需要约定一个 特殊变量 前缀的问题,用于维护这类返回值。。
----------------------------------------------
call 脚本中遇到exit/b 退出就一去不返了
exit/b 仅仅用于cmd下的脚本调试,此时已经不是考虑效率的问题了, 子过程返回得用goto:eof |
|