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

【项目1】批处理函数库调用接口的约定

[复制链接]
发表于 2012-11-16 20:34:00 | 显示全部楼层
我都觉得29楼的代码还是比较清晰简洁的
如果能把UB[ArrayName]换成ArrayName.length可读性更好些

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

另外思考了下标准所需要遵循的几个原则:
1、被广泛使用的用法不应该轻易改变
2、标准应用后代码的可读性不应该降低
3、无法达成大多数意见的不做约定
发表于 2012-11-16 22:32:39 | 显示全部楼层
回复 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,但这个容易看懂,行数也可以压缩得很短
复制代码
发表于 2012-11-16 22:39:33 | 显示全部楼层
话说 endlocal 后保留变量面临一个很郁闷的问题,如果用户在调用函数之前已经开启了变量延迟,而需要保留的变量内容中又含 ! 号,如何避免它被解释掉?难道输出到临时文件再 set /p?可是不用 setlocal 又难保变量环境的干净——尤其是函数间互相调用的时候
发表于 2012-11-21 22:44:51 | 显示全部楼层
回32楼和33楼
感觉为了通用性过多的牺牲了简洁性
而复杂性的提升往往意味着可读性的下降
同时也意味着健壮性的下降

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

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

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 好地方

查看全部评分

发表于 2012-11-21 23:46:15 | 显示全部楼层
讨论了那么多年都没开始写,符合我党作风。
发表于 2012-11-22 00:16:52 | 显示全部楼层
回复 33# CrLf


是个问题, 研究下。。
发表于 2012-11-22 04:16:01 | 显示全部楼层
实在没办法的话,为了兼顾可读性和兼容性最大化,只好用临时文件了
  1. set>"%tmp%\var.$"&endlocal
  2. for /f "eol==delims=" %%a in ("%tmp%\var.$") do set "%%a"
  3. del "%tmp%\var.$"
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 22:14 , Processed in 0.016251 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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