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

[其他] 一种批处理内的“函数”和“结构体”实现

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式
此贴是因为楼主突发奇想想用批处理写一些较大的工程。
但是苦于批处理语法比较原始,尝试对其进行一定的优化。

“函数”实现(局部变量支持,return时自动release);
“结构体”实现:通过metadata绑定关联的变量。
附赠debug(调用栈级别)支持和性能优化。

util.bat

  1. @echo off
  2. if "%~1" neq "" (
  3.         call %* || (
  4.                 if defined _G.TRACE (
  5.                         2>con >&2 echo [!_G.TRACE!] Fatal: Call "%~nx0" failed.
  6.                 ) else (
  7.                         2>con >&2 echo [%~n0] Fatal: Call "%~nx0" failed.
  8.                 )
  9.                 2>con >&2 pause
  10.                 exit 1
  11.         )
  12. ) else (
  13.         if defined _G.TRACE (
  14.                 2>con >&2 echo [!_G.TRACE!] Fatal: Call "%~nx0" with nothing.
  15.         ) else (
  16.                 2>con >&2 echo [%~n0] Fatal: Call "%~nx0" with nothing.
  17.         )
  18.         2>con >&2 pause
  19.         exit 1
  20. )
  21. exit /b 0

  22. :UTIL_Init Main
  23.         if "%~1" == "" (
  24.                 2>con >&2 echo [%~n0] Fatal: 'Main' undefined.
  25.                 2>con >&2 pause
  26.                 exit 1
  27.         )
  28.        
  29.         if not defined _G.UTIL (
  30.                 set "_G.UTIL=%~n0"
  31.                 set "_G.MAIN=%~1"
  32.                 set "_G.TRACE=!_G.MAIN!"
  33.                 set /a "_G.LEVEL = 0
  34.                 set "_G.RET="
  35.                 set "_G.ERR="
  36.                
  37.                 set "_T.UTIL="
  38.                 if not defined _G.PACKED set "_T.UTIL=!_G.UTIL!"
  39.                
  40.                 set "<-=call !_T.UTIL! :UTIL_SetRet"
  41.                 set "->=& call !_T.UTIL! :UTIL_GetRet"
  42.                 set "|->=call !_T.UTIL! :UTIL_GetRet"
  43.                 set "??=call !_T.UTIL! :UTIL_Throw"               
  44.                 set "?|=call !_T.UTIL! :UTIL_Fatal"
  45.                 set "&=call !_T.UTIL! :UTIL_Copy"
  46.                 set "{=call !_T.UTIL! :UTIL_Invoke"
  47.                 set "}=& (if defined _G.ERR (exit /b 0))"
  48.                 set "?}=& if defined _G.ERR"
  49.                 set "?=if defined _G.ERR"
  50.                 set "-|=exit /b 0"

  51.                 if defined _G.FAST (
  52.                         set _G.SKIPTHIS=rem
  53.                         set _G.DOTHIS=
  54.                 ) else (
  55.                         set _G.SKIPTHIS=
  56.                         set _G.DOTHIS=rem
  57.                 )
  58.         ) else (
  59.                 %?|% "double initialized."
  60.         )
  61.        
  62.         %_G.SKIPTHIS% for /f "delims==" %%a in (
  63.         %_G.SKIPTHIS%         'set "_T" 2^>nul'
  64.         %_G.SKIPTHIS% ) do set "%%a="
  65. %-|%

  66. :UTIL_Invoke ModName Fn ... -> ...
  67.         %_G.SKIPTHIS% if not defined _G.UTIL (
  68.         %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: UTIL not initialized.
  69.         %_G.SKIPTHIS%         2>con >&2 pause
  70.         %_G.SKIPTHIS% )
  71.        
  72.         %_G.SKIPTHIS% if "%~1" == "" %?|% "'ModName' undefined."
  73.         %_G.SKIPTHIS% if "%~2" == "" %?|% "'Fn' undefined."
  74.        
  75.         %_G.SKIPTHIS% set "_G.TRACE[!_G.LEVEL!]=!_G.TRACE!"
  76.         %_G.SKIPTHIS% set "_G.TRACE=!_G.TRACE!>(%~1)%~2"
  77.        
  78.         set /a "_G.LEVEL += 1"
  79.        
  80.         for /f "tokens=1,2,*" %%a in ('echo.%*') do (
  81.                 if defined _G.PACKED (
  82.                         if /i "%%a" == "MAIN" (
  83.                                 call :MAIN_%%b %%c
  84.                         ) else (
  85.                                 call :%%a_%%b %%c
  86.                         )
  87.                 ) else (
  88.                         if /i "%%a" == "MAIN" (
  89.                                 call !_G.MAIN! CALL_SELF :MAIN_%%b %%c
  90.                         ) else (
  91.                                 call %%a :%%a_%%b %%c
  92.                         )
  93.                 )
  94.         )
  95.        
  96.         if defined _G.NSUTIL (
  97.                 %_G.SKIPTHIS% set "_G.TRACE[!_G.LEVEL!]=!_G.TRACE!"
  98.                 %_G.SKIPTHIS% set "_G.TRACE=!_G.TRACE!>(NSUTIL)Free"
  99.                 set /a "_G.LEVEL += 1"
  100.                 set /a "_T.PrevLevel = _G.LEVEL - 1"

  101.                 for /f "delims==" %%a in (
  102.                         'set "_G.LEVEL[!_T.PrevLevel!]" 2^>nul'
  103.                 ) do (
  104.                         if defined _G.PACKED (
  105.                                 call :NSUTIL_Free "%%a"
  106.                         ) else (
  107.                                 call NSUTIL :NSUTIL_Free "%%a"
  108.                         )
  109.                         set "%%a="
  110.                 )

  111.                 for /f "delims==" %%a in (
  112.                         'set "_L[!_G.LEVEL!]" 2^>nul'
  113.                 ) do set "%%a="

  114.                 set /a "_G.LEVEL -= 1"
  115.                 %_G.SKIPTHIS% %&% "_G.TRACE[!_G.LEVEL!]" "_G.TRACE"
  116.                 %_G.SKIPTHIS% set "_G.TRACE[!_G.LEVEL!]="
  117.         )
  118.        
  119.         for /f "delims==" %%a in (
  120.                 'set "_L[!_G.LEVEL!]" 2^>nul'
  121.         ) do set "%%a="
  122.        
  123.         set /a _G.LEVEL -= 1
  124.        
  125.         %_G.SKIPTHIS% %&% "_G.TRACE[!_G.LEVEL!]" "_G.TRACE"
  126.         %_G.SKIPTHIS% set "_G.TRACE[!_G.LEVEL!]="
  127.        
  128.         %_G.SKIPTHIS% for /f "delims==" %%a in (
  129.         %_G.SKIPTHIS%         'set "_T" 2^>nul'
  130.         %_G.SKIPTHIS% ) do set "%%a="
  131. %-|%

  132. :UTIL_GetRet *Var
  133.         %_G.SKIPTHIS% if not defined _G.UTIL (
  134.         %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: UTIL not initialized.
  135.         %_G.SKIPTHIS%         2>con >&2 pause
  136.         %_G.SKIPTHIS%         exit 1
  137.         %_G.SKIPTHIS% )

  138.         %_G.SKIPTHIS% if "%~1" == "" %?|% "'Var' undefined."       

  139.         if not defined _G.ERR (
  140.                 %&% "_G.RET" "%~1"
  141.         )
  142.         set "_G.RET="

  143.         %_G.SKIPTHIS% for /f "delims==" %%a in (
  144.         %_G.SKIPTHIS%         'set "_T" 2^>nul'
  145.         %_G.SKIPTHIS% ) do set "%%a="
  146. %-|%

  147. :UTIL_SetRet *Var
  148.         %_G.SKIPTHIS% if not defined _G.UTIL (
  149.         %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: UTIL not initialized.
  150.         %_G.SKIPTHIS%         2>con >&2 pause
  151.         %_G.SKIPTHIS%         exit 1
  152.         %_G.SKIPTHIS% )

  153.         %_G.SKIPTHIS% if "%~1" == "" %?|% "'Var' undefined."

  154.         if defined _G.NSUTIL (
  155.                 %&% "!%~1!.Type" "_T.Type"
  156.                 if /i "!_T.Type!" == "NSMeta" (
  157.                         if defined _G.LEVEL[!_G.LEVEL!][!%~1!] (
  158.                                 set "_G.LEVEL[!_G.LEVEL!][!%~1!]="
  159.                                 set /a "_T.PrevLevel = _G.LEVEL - 1"
  160.                                 set "_G.RET=!%~1!"
  161.                                 set "_G.LEVEL[!_T.PrevLevel!][!_G.RET!]=!_G.RET!"
  162.                         ) else (
  163.                                 rem Found NS argument, just return it.
  164.                                 set "_G.RET=!%~1!"
  165.                         )
  166.                 ) else (
  167.                         set "_G.RET=!%~1!"
  168.                 )
  169.         ) else (
  170.                 set "_G.RET=!%~1!"
  171.         )


  172.         %_G.SKIPTHIS% for /f "delims==" %%a in (
  173.         %_G.SKIPTHIS%         'set "_T" 2^>nul'
  174.         %_G.SKIPTHIS% ) do set "%%a="
  175. %-|%

  176. :UTIL_Throw *Var
  177.         %_G.SKIPTHIS% if not defined _G.UTIL (
  178.         %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: UTIL not initialized.
  179.         %_G.SKIPTHIS%         2>con >&2 pause
  180.         %_G.SKIPTHIS%         exit 1
  181.         %_G.SKIPTHIS% )
  182.        
  183.         %_G.SKIPTHIS% if "%~1" == "" %?|% "'Var' undefined."

  184.         %?|% TODO: Add NS logic.
  185.         set "_G.ERR=!%~1!"

  186.         %_G.SKIPTHIS% for /f "delims==" %%a in (
  187.         %_G.SKIPTHIS%         'set "_T" 2^>nul'
  188.         %_G.SKIPTHIS% ) do set "%%a="
  189. %-|%

  190. :UTIL_Copy *From *To
  191.         %_G.SKIPTHIS% if not defined _G.UTIL (
  192.         %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: UTIL not initialized.
  193.         %_G.SKIPTHIS%         2>con >&2 pause
  194.         %_G.SKIPTHIS%         exit 1
  195.         %_G.SKIPTHIS% )
  196.        
  197.         %_G.SKIPTHIS% if "%~1" == "" %?|% "'From' undefined."
  198.         %_G.SKIPTHIS% if "%~2" == "" %?|% "'To' undefined."
  199.        
  200.         set "%~2=!%~1!"
  201. %-|%

  202. :UTIL_Fatal Msg
  203.         %_G.SKIPTHIS% if not defined _G.UTIL (
  204.         %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: UTIL not initialized.
  205.         %_G.SKIPTHIS%         2>con >&2 pause
  206.         %_G.SKIPTHIS%         exit 1
  207.         %_G.SKIPTHIS% )
  208.        
  209.         %_G.SKIPTHIS% if "%~1" == "" %?|% "'Msg' undefined."
  210.        
  211.         2>con >&2 echo [!_G.TRACE!] Fatal: %~1
  212.         2>con >&2 pause
  213.         exit 1
  214. %-|%
复制代码



nsutil.bat

  1. @echo off
  2. if "%~1" neq "" (
  3.         call %* || (
  4.                 if defined _G.TRACE (
  5.                         2>con >&2 echo [!_G.TRACE!] Fatal: Call "%~nx0" failed.
  6.                 ) else (
  7.                         2>con >&2 echo [%~n0] Fatal: Call "%~nx0" failed.
  8.                 )
  9.                 2>con >&2 pause
  10.                 exit 1
  11.         )
  12. ) else (
  13.         if defined _G.TRACE (
  14.                 2>con >&2 echo [!_G.TRACE!] Fatal: Call "%~nx0" with nothing.
  15.         ) else (
  16.                 2>con >&2 echo [%~n0] Fatal: Call "%~nx0" with nothing.
  17.         )
  18.         2>con >&2 pause
  19.         exit 1
  20. )
  21. exit /b 0

  22. :NSUTIL_Init Main
  23.         if not defined _G.NSUTIL (
  24.                 if defined _G.PACKED (
  25.                         call :UTIL_Init "%~1"
  26.                 ) else (
  27.                         call UTIL :UTIL_Init "%~1"
  28.                 )

  29.                 set "_G.NSUTIL=%~n0"

  30.                 set /a "_G.NSP = 0"

  31.                 set "{n=!{! NSUTIL New"
  32.                 set "{c=!{! NSUTIL Clone"
  33.                 set "{g=!{! NSUTIL Get"
  34.                 set "{s=!{! NSUTIL Set"
  35.         )
  36. %-|%

  37. :NSUTIL_New *NSVar
  38.         for %%. in (_L[!_G.LEVEL!].) do (
  39.                 %_G.SKIPTHIS% if not defined _G.NSUTIL (
  40.                 %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  41.                 %_G.SKIPTHIS%         2>con >&2 pause
  42.                 %_G.SKIPTHIS%         exit 1
  43.                 %_G.SKIPTHIS% )
  44.                
  45.                 %_G.SKIPTHIS% if "%~1" == "" %?|% "'NSVar' undefined."

  46.                 set /a "_G.NSP += 1"
  47.                 set "%%.NSBody=_G.NS[!_G.NSP!]"
  48.                 set "!%%.NSBody!.Type=NSBody"
  49.                 set /a "_G.NSP += 1"
  50.                 set "%%.NSMeta=_G.NS[!_G.NSP!]"
  51.                 set "!%%.NSMeta!.Type=NSMeta"

  52.                 set "!%%.NSBody!.RefCnt=1"
  53.                 set "!%%.NSMeta!.Target=!%%.NSBody!"
  54.                
  55.                 set /a "%%.PrevLv = _G.LEVEL - 1"
  56.                 set "_G.LEVEL[!%%.PrevLv!][!%%.NSMeta!]=!%%.NSMeta!"
  57.                
  58.                 set "%~1=!%%.NSMeta!"
  59.         )
  60. %-|%

  61. :NSUTIL_IsNSMeta *NS -> Bool
  62.         for %%. in (_L[!_G.LEVEL!].) do (
  63.                 %_G.SKIPTHIS% if not defined _G.NSUTIL (
  64.                 %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  65.                 %_G.SKIPTHIS%         2>con >&2 pause
  66.                 %_G.SKIPTHIS%         exit 1
  67.                 %_G.SKIPTHIS% )

  68.                 %_G.SKIPTHIS% if "%~1" == "" %?|% "'NS' undefined."

  69.                 %&% "!%~1!.Type" "%%.Type"
  70.                 if /i "!%%.Type!" == "NSMeta" (
  71.                         set "%%.Res=1"
  72.                 ) else (
  73.                         set "%%.Res=0"
  74.                 )
  75.                 %<-% "%%.Res"
  76.         )
  77. %-|%

  78. :NSUTIL_IsNSBody *NS -> Bool
  79.         for %%. in (_L[!_G.LEVEL!].) do (
  80.                 %_G.SKIPTHIS% if not defined _G.NSUTIL (
  81.                 %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  82.                 %_G.SKIPTHIS%         2>con >&2 pause
  83.                 %_G.SKIPTHIS%         exit 1
  84.                 %_G.SKIPTHIS% )

  85.                 %_G.SKIPTHIS% if "%~1" == "" %?|% "'NS' undefined."

  86.                 %&% "!%~1!.Type" "%%.Type"
  87.                 if /i "!%%.Type!" == "NSBody" (
  88.                         set "%%.Res=1"
  89.                 ) else (
  90.                         set "%%.Res=0"
  91.                 )
  92.                 %<-% "%%.Res"
  93.         )
  94. %-|%

  95. :NSUTIL_IsValidNS *NS -> Bool
  96.         for %%. in (_L[!_G.LEVEL!].) do (
  97.                 %_G.SKIPTHIS% if not defined _G.NSUTIL (
  98.                 %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  99.                 %_G.SKIPTHIS%         2>con >&2 pause
  100.                 %_G.SKIPTHIS%         exit 1
  101.                 %_G.SKIPTHIS% )

  102.                 %_G.SKIPTHIS% if "%~1" == "" %?|% "'NS' undefined."

  103.                 %{% NSUTIL IsNSMeta "%~1" %}% %->% %%.Res
  104.                 if not "!%%.Res!" == "1" (
  105.                         %<-% %%.Res
  106.                         %-|%
  107.                 )
  108.                 %{% NSUTIL IsNSBody "!%~1!.Target" %}% %->% %%.Res
  109.                 %<-% %%.Res
  110.         )
  111. %-|%

  112. :NSUTIL_AssertValidNS *NS
  113.         for %%. in (_L[!_G.LEVEL!].) do (
  114.                 %_G.DOTHIS% %-|%
  115.                 if not defined _G.NSUTIL (
  116.                         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  117.                         2>con >&2 pause
  118.                         exit 1
  119.                 )

  120.                 if "%~1" == "" %?|% "'NS' undefined."
  121.                 %{% NSUTIL IsValidNS "%~1" %}% %->% %%.Res
  122.                 if not "!%%.Res!" == "1" %?|% "not a valid NS."
  123.         )
  124. %-|%

  125. :NSUTIL_AssertValidNSBody *NS
  126.         for %%. in (_L[!_G.LEVEL!].) do (
  127.                 %_G.DOTHIS% %-|%
  128.                 if not defined _G.NSUTIL (
  129.                         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  130.                         2>con >&2 pause
  131.                         exit 1
  132.                 )

  133.                 if "%~1" == "" %?|% "'NS' undefined."
  134.                 %{% NSUTIL IsNSBody "%~1" %}% %->% %%.Res
  135.                 if not "!%%.Res!" == "1" %?|% "not a valid NS."
  136.         )
  137. %-|%

  138. :NSUTIL_Clone *From *To
  139.         for %%. in (_L[!_G.LEVEL!].) do (
  140.                 %_G.SKIPTHIS% if not defined _G.NSUTIL (
  141.                 %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  142.                 %_G.SKIPTHIS%         2>con >&2 pause
  143.                 %_G.SKIPTHIS%         exit 1
  144.                 %_G.SKIPTHIS% )
  145.                 %_G.SKIPTHIS% if "%~1" == "" %?|% "'From' undefined."
  146.                 %_G.SKIPTHIS% if "%~2" == "" %?|% "'To' undefined."

  147.                 %_G.SKIPTHIS% %{% NSUTIL AssertValidNS "%~1" %}%

  148.                 set /a "_G.NSP += 1"
  149.                 set "_G.NS[!_G.NSP!].Type=NSMeta"
  150.                 %&% "!%~1!.Target" "_G.NS[!_G.NSP!].Target"
  151.                 %&% "!%~1!.Target" "%%.NSBody"
  152.                 set /a "!%%.NSBody!.RefCnt += 1"

  153.                 set "%~2=_G.NS[!_G.NSP!]"

  154.                 set /a "%%.PrevLv = _G.LEVEL - 1"
  155.                 set "_G.LEVEL[!%%.PrevLv!][!%~2!]=!%~2!"
  156.         )
  157. %-|%

  158. :NSUTIL_CloneMeta *From *To
  159.         for %%. in (_L[!_G.LEVEL!].) do (
  160.                 %_G.SKIPTHIS% if not defined _G.NSUTIL (
  161.                 %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  162.                 %_G.SKIPTHIS%         2>con >&2 pause
  163.                 %_G.SKIPTHIS%         exit 1
  164.                 %_G.SKIPTHIS% )
  165.                 %_G.SKIPTHIS% if "%~1" == "" %?|% "'From' undefined."
  166.                 %_G.SKIPTHIS% if "%~2" == "" %?|% "'To' undefined."

  167.                 %_G.SKIPTHIS% %{% NSUTIL AssertValidNS "%~1" %}%

  168.                 set /a "_G.NSP += 1"
  169.                 set "_G.NS[!_G.NSP!].Type=NSMeta"
  170.                 %&% "!%~1!.Target" "_G.NS[!_G.NSP!].Target"
  171.                 %&% "!%~1!.Target" "%%.NSBody"
  172.                 set /a "!%%.NSBody!.RefCnt += 1"

  173.                 set "%~2=_G.NS[!_G.NSP!]"
  174.         )
  175. %-|%

  176. :NSUTIL_HasField *NS -> Bool
  177.         for %%. in (_L[!_G.LEVEL!].) do (
  178.                 %_G.SKIPTHIS% if not defined _G.NSUTIL (
  179.                 %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  180.                 %_G.SKIPTHIS%         2>con >&2 pause
  181.                 %_G.SKIPTHIS%         exit 1
  182.                 %_G.SKIPTHIS% )

  183.                 %_G.SKIPTHIS% if "%~1" == "" %?|% "'NS' undefined."
  184.                 %_G.SKIPTHIS% if "%~2" == "" %?|% "'Field' undefined."

  185.                 %_G.SKIPTHIS% %{% NSUTIL AssertValidNS "%~1" %}%

  186.                 %&% "!%~1!.Target" "%%.NSBody"
  187.                 if defined !%%.NSBody!.Data.Key[%~2] (
  188.                         set "%%.Res=1"
  189.                 ) else (
  190.                         set "%%.Res=0"
  191.                 )
  192.                 %<-% "%%.Res"
  193.         )
  194. %-|%

  195. :NSUTIL_Get *NS Field *Val
  196.         for %%. in (_L[!_G.LEVEL!].) do (
  197.                 %_G.SKIPTHIS% if not defined _G.NSUTIL (
  198.                 %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  199.                 %_G.SKIPTHIS%         2>con >&2 pause
  200.                 %_G.SKIPTHIS%         exit 1
  201.                 %_G.SKIPTHIS% )
  202.        
  203.                 %_G.SKIPTHIS% if "%~1" == "" %?|% "'NS' undefined."
  204.                 %_G.SKIPTHIS% if "%~2" == "" %?|% "'Field' undefined."
  205.                 %_G.SKIPTHIS% if "%~3" == "" %?|% "'Val' undefined."

  206.                 %_G.SKIPTHIS% %{% NSUTIL AssertValidNS "%~1" %}%

  207.                 %{% NSUTIL HasField "%~1" "%~2" %}% %->% %%.Res

  208.                 %&% "!%~1!.Target" "%%.NSBody"
  209.                 %&% "!%%.NSBody!.Data.Value[%~2]" "%~3"
  210.                 set "!%%.NSBody!.Data.Key[%~2]="
  211.                 set "!%%.NSBody!.Data.Value[%~2]="
  212.         )
  213. %-|%

  214. :NSUTIL_Free *NS
  215.         for %%. in (_L[!_G.LEVEL!].) do (
  216.                 %_G.SKIPTHIS% if not defined _G.NSUTIL (
  217.                 %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  218.                 %_G.SKIPTHIS%         2>con >&2 pause
  219.                 %_G.SKIPTHIS%         exit 1
  220.                 %_G.SKIPTHIS% )

  221.                 %_G.SKIPTHIS% if "%~1" == "" %?|% "'NS' undefined."

  222.                 %&% _G.RET %%.RetBackup

  223.                 %_G.SKIPTHIS% %{% NSUTIL AssertValidNS "%~1" %}%
  224.        
  225.                 %&% !%~1!.Target %%.NSBody
  226.                 set "!%~1!.Type="
  227.                 set "!%~1!.Target="

  228.                 %{% NSUTIL FreeNSBody "%%.NSBody" %}%

  229.                 %&% %%.RetBackup _G.RET
  230.         )
  231. %-|%

  232. :NSUTIL_FreeNSBody *NS
  233.         for %%. in (_L[!_G.LEVEL!].) do (
  234.                 %_G.SKIPTHIS% if not defined _G.NSUTIL (
  235.                 %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  236.                 %_G.SKIPTHIS%         2>con >&2 pause
  237.                 %_G.SKIPTHIS%         exit 1
  238.                 %_G.SKIPTHIS% )
  239.        
  240.                 %_G.SKIPTHIS% if "%~1" == "" %?|% "'NS' undefined."
  241.                
  242.                 %_G.SKIPTHIS% %{% NSUTIL AssertValidNSBody "%~1" %}%

  243.                 %&% "!%~1!.RefCnt" "%%.RefCnt"

  244.                 if !%%.RefCnt! gtr 1 (
  245.                         set /a "!%~1!.RefCnt -= 1"
  246.                 ) else (
  247.                         if !%%.RefCnt! lss 1 (
  248.                                 %?|% "double free detected."
  249.                         )

  250.                         set "!%~1!.Type="
  251.                         set "!%~1!.RefCnt="

  252.                         for /f "delims==" %%a in (
  253.                                 'set !%~1!.Data.Key 2^>nul'
  254.                         ) do (
  255.                                 %&% "!%~1!.Data.Value[!%%a!]" "%%.Var"
  256.                                 set "!%~1!.Data.Value[!%%a!]="

  257.                                 %{% NSUTIL IsNSMeta "%%.Var" %}% %->% "%%.IsMeta"
  258.                                 if "!%%.IsMeta!" == "1" (
  259.                                         %{% NSUTIL Free "%%.Var" %}%
  260.                                 )
  261.                                 set "%%a="
  262.                         )
  263.                 )
  264.         )
  265. %-|%

  266. :NSUTIL_CloneBody *NS *NewNS
  267.         for %%. in (_L[!_G.LEVEL!].) do (
  268.                 %_G.SKIPTHIS% if not defined _G.NSUTIL (
  269.                 %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  270.                 %_G.SKIPTHIS%         2>con >&2 pause
  271.                 %_G.SKIPTHIS%         exit 1
  272.                 %_G.SKIPTHIS% )
  273.        
  274.                 %_G.SKIPTHIS% if "%~1" == "" %?|% "'NS' undefined."
  275.                 %_G.SKIPTHIS% if "%~2" == "" %?|% "'NewNS' undefined."

  276.                 %_G.SKIPTHIS% %{% NSUTIL AssertValidNSBody "%~1" %}%

  277.                 set /a "_G.NSP += 1"
  278.                 set "%%.NewBody=_G.NS[!_G.NSP!]"
  279.                 set "!%%.NewBody!.Type=NSBody"
  280.                 set "!%%.NewBody!.RefCnt=1"

  281.                 for /f "delims==" %%a in (
  282.                         'set !%~1!.Data.Key 2^>nul'
  283.                 ) do (
  284.                         set "!%%.NewBody!.Data.Key[!%%a!]=!%%a!"

  285.                         %{% NSUTIL IsNSMeta "!%~1!.Data.Value[!%%a!]" %}% %->% %%.IsMeta
  286.                         if "!%%.IsMeta!" == "1" (
  287.                                 %{% NSUTIL CloneMeta "!%~1!.Data.Value[!%%a!]" "!%%.NewBody!.Data.Value[!%%a!]" %}%
  288.                         ) else (
  289.                                 %&% "!%~1!.Data.Value[!%%a!]" "!%%.NewBody!.Data.Value[!%%a!]"
  290.                         )
  291.                 )

  292.                 %&% "%%.NewBody" "%~2"
  293.         )
  294. %-|%

  295. :NSUTIL_Set *NS Field *Val
  296.         for %%. in (_L[!_G.LEVEL!].) do (
  297.                 %_G.SKIPTHIS% if not defined _G.NSUTIL (
  298.                 %_G.SKIPTHIS%         2>con >&2 echo [%~n0] Fatal: NSUTIL not initialized.
  299.                 %_G.SKIPTHIS%         2>con >&2 pause
  300.                 %_G.SKIPTHIS%         exit 1
  301.                 %_G.SKIPTHIS% )
  302.        
  303.                 %_G.SKIPTHIS% if "%~1" == "" %?|% "'NS' undefined."
  304.                 %_G.SKIPTHIS% if "%~2" == "" %?|% "'Field' undefined."
  305.                 %_G.SKIPTHIS% if "%~3" == "" %?|% "'Val' undefined."

  306.                 %_G.SKIPTHIS% %{% NSUTIL AssertValidNS "%~1" %}%

  307.                 %&% "!%~1!.Target" "%%.NSBody"

  308.                 %&% "!%%.NSBody!.RefCnt" "%%.RefCnt"
  309.                 if !%%.RefCnt! gtr 1 (
  310.                         set /a "!%%.NSBody!.RefCnt -= 1"
  311.                         %{% NSUTIL CloneBody "%%.NSBody" "%%.NewBody" %}%
  312.                         %&% "%%.NewBody" "%%.NSBody"
  313.                         %&% "%%.NewBody" "!%~1!.Target"
  314.                 )

  315.                 %{% NSUTIL HasField "%~1" "%~2" %}% %->% "%%.HasField"
  316.                 if "!%%.HasField!" == "1" (
  317.                         %&% "!%%.NSBody!.Data.Value[%~2]" %%.OldVal
  318.                         %{% NSUTIL IsValidNS "%%.OldVal" %}% %->% "%%.IsMeta"
  319.                         if "!%%.IsMeta!" == "1" (
  320.                                 %{% NSUTIL Free "%%.OldVal" %}%
  321.                         )
  322.                 )

  323.                 set "!%%.NSBody!.Data.Key[%~2]=%~2"

  324.                 %{% NSUTIL IsValidNS "%~3" %}% %->% "%%.IsNS"
  325.                 if "!%%.IsNS!" == "1" (
  326.                         %{% NSUTIL CloneMeta "%~3" "!%%.NSBody!.Data.Value[%~2]" %}%
  327.                 ) else (
  328.                         %&% "%~3" "!%%.NSBody!.Data.Value[%~2]"
  329.                 )
  330.         )
  331. %-|%

复制代码


一个使用和测试的例子.bat

  1. @echo off
  2. set _G.FAST=1
  3. if "%~1" equ "CALL_SELF" (
  4.         for /f "tokens=1,*" %%a in ('echo.%*') do (
  5.                 call %%b || %?|% "Call '%~nx0' failed."
  6.         )
  7.         %-|%
  8. )
  9. pushd "%~dp0"
  10. setlocal ENABLEDELAYEDEXPANSION
  11. if not defined _G.PACKED (
  12.         call NSUTIL :NSUTIL_Init %~n0
  13. ) else (
  14.         call :NSUTIL_Init %~n0
  15. )


  16. set _ & (set | find /C /V "") & pause<nul
  17. time <nul
  18. %{% MAIN TEST3 %}%
  19. time <nul
  20. set _ & (set | find /C /V "") & pause
  21. %-|%


  22. :MAIN_TEST
  23.         for %%. in (_L[!_G.LEVEL!].) do (
  24.                 %{n% %%.A %}%
  25.                 set %%.B=3

  26.                 set %%.B2=30
  27.                 %{s% %%.A k %%.B %}%
  28.                 %{s% %%.A k2 %%.B %}%
  29.                 %{s% %%.A k3 %%.B %}%
  30.                 %{g% %%.A k  %%.R %}%


  31.                 %{s% %%.A k2 %%.B2 %}%

  32.                 %{n% %%.o %}%
  33.                 %{s% %%.A o1 %%.o %}%

  34.                 %{s% %%.A k3 %%.o %}%

  35.                 %{s% %%.A o1 %%.B2 %}%
  36.                
  37.                 %{c% %%.A %%.B %}%
  38.                 set _ & (set | find /C /V "") & pause
  39.                
  40.                 %{s% %%.A o1 %%.o %}%
  41.                 set _ & (set | find /C /V "") & pause
  42.                
  43.                 %<-% %%.A
  44.         )
  45. %-|%


  46. :MAIN_TEST2
  47.         for %%. in (_L[!_G.LEVEL!].) do (
  48.                 %{% MAIN TEST %}% %->% %%.T
  49.                 %<-% %%.T
  50.         )
  51. %-|%

  52. :MAIN_TEST3
  53.         for %%. in (_L[!_G.LEVEL!].) do (
  54.                 %{% MAIN TEST2 %->% %%.T
  55.                 %<-% %%.T
  56.         )
  57. %-|%
复制代码


也许可以探讨一下有无更好的方法。纯娱乐。

评分

参与人数 1PB +18 技术 +1 收起 理由
523066680 + 18 + 1 hardcore, 古法编程!

查看全部评分

发表于 前天 14:07 | 显示全部楼层
支持楼主 谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-4-8 04:57

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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