[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
我都觉得29楼的代码还是比较清晰简洁的
如果能把UB[ArrayName]换成ArrayName.length可读性更好些

27楼的代码可读性略有些差
没看出为什么不直接赋值而用for嵌套
而且如果v2为类似!v1!的值话
会得到意外的结果

另外思考了下标准所需要遵循的几个原则:
1、被广泛使用的用法不应该轻易改变
2、标准应用后代码的可读性不应该降低
3、无法达成大多数意见的不做约定
天的白色影子

TOP

回复 31# qzwqzw


    我的目的是通用性最大化,常见的方案大思路主要有 set var=%var% 和 set var=%%a 两类,但前者的通用性实在是...
1、
  1. endlocal&set var1=%var1%&set var2=%var2%
  2. rem 若含 " 等将极易致错
复制代码
2、
  1. for %%a in ($ "!var1=!var1!" "var2=!var2!") do (
  2.    if %%a==$ (endlocal) else set "%%a"
  3. )
  4. rem 遇到变量内容含 * 和 ? 则必死无疑
复制代码
3、
  1. set 换行符=^
  2. for /f "delims=" %%a in ("$!换行符!var1=!var1!!换行符!var2=!var2!") do (
  3.    if %%a==$ (endlocal) else set "%%a"
  4. )
  5. rem 个人认为比较好的方案1,但是获取换行符的那三行不容压缩和添字,难保 copy 的时候会不会出岔子(尤其是有些论坛经常会在行末添加空格)
复制代码
4、
  1. for /f "delims=" %%a in ("var1=!var1!") do (
  2.    for /f "delims=" %%b in ("var2=!var2!") do (
  3.       endlocal
  4.       set "%%b"
  5.    )
  6.    set "%%a"
  7. )
  8. rem 个人认为比较好的方案2,实际上我更喜欢方案3,但这个容易看懂,行数也可以压缩得很短
复制代码

TOP

话说 endlocal 后保留变量面临一个很郁闷的问题,如果用户在调用函数之前已经开启了变量延迟,而需要保留的变量内容中又含 ! 号,如何避免它被解释掉?难道输出到临时文件再 set /p?可是不用 setlocal 又难保变量环境的干净——尤其是函数间互相调用的时候

TOP

回32楼和33楼
感觉为了通用性过多的牺牲了简洁性
而复杂性的提升往往意味着可读性的下降
同时也意味着健壮性的下降

就楼上所讨论的set保存变量来说
虽然它存在种种的不足和缺陷
但它仍然是绝对主流的用例
因为它简洁易懂而且能处理大多数情形
对于某些特殊性的场合
建议调用者区别对待

另外刚从cndos的备份站点中看到了函数库的讨论帖
很老了但仍然有借鉴意义
http://cndos.fam.cx/forum/viewthread.php?tid=38969&fpage=5
1

评分人数

    • CrLf: 好地方技术 + 1
天的白色影子

TOP

讨论了那么多年都没开始写,符合我党作风。

TOP

回复 33# CrLf


是个问题, 研究下。。

TOP

实在没办法的话,为了兼顾可读性和兼容性最大化,只好用临时文件了
  1. set>"%tmp%\var.$"&endlocal
  2. for /f "eol==delims=" %%a in ("%tmp%\var.$") do set "%%a"
  3. del "%tmp%\var.$"
复制代码

TOP

返回列表