Windows(cmd)批处理-在子例程中使用括号

d7v8vwbk  于 2023-10-22  发布在  Windows
关注(0)|答案(1)|浏览(158)

我经常在:LABEL中看到括号( ... )的示意图。
我读了圆括号/方括号,但我不太明白如何在子例程中解释这一点。
(例如https://ss64.com/nt/syntax-brackets.html

使用括号内的变量

  • CMD shell将扩展[读入内存]代码块开头的所有变量,并使用这些值,即使变量的值在代码块中发生了更改。打开DelayedExpansion将强制shell在每行的开头读取变量。*

不幸的是,我在互联网上找不到对调用或子例程的具体描述。
(例如https://ss64.com/nt/call.htmlhttps://ss64.com/nt/syntax-functions.html
我想知道它是否只是一种代码风格(例如,(这是我目前的猜测。
举个简单的例子:

  1. @ECHO OFF
  2. CALL :ShortLabel
  3. CALL :LongLabel
  4. GOTO :EndOfBatch
  5. :ShortLabel
  6. ECHO I'm called "%~0" .
  7. EXIT /B
  8. :LongLabel
  9. (
  10. ECHO I'm called "%~0" , because I have two extra lines.
  11. EXIT /B
  12. )
  13. :EndOfBatch
  14. PAUSE
  15. EXIT /B

如果没有,我希望你能简要解释一下。

更新:

由于我以前的“时间测量”是垃圾,这里有一个更好的版本(我希望)。第一个调用只是复制粘贴出第二个括号:

  1. @ECHO OFF
  2. SETLOCAL EnableExtensions EnableDelayedExpansion
  3. REM *** This string has the maximum length of 8191
  4. set "str=."
  5. FOR /L %%n in (1 1 13) DO SET "str=!str:~-4000!!str:~-4000!"
  6. (set^ string=!str!!str:~-191!)
  7. SET /A Loops=3000
  8. TITLE A - StrLenNoLocal
  9. CALL :TimeStamp StrLenNoLocalStart
  10. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenNoLocal LenDummyStrLenNoLocalA string %%a
  11. CALL :TimeStamp StrLenNoLocalEnd
  12. TITLE A - StrLenNoLocalBrackets
  13. CALL :TimeStamp StrLenNoLocalBracketsStart
  14. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenNoLocalBrackets LenDummyStrLenNoLocalBracketsA string %%a
  15. CALL :TimeStamp StrLenNoLocalBracketsEnd
  16. TITLE A - StrLenLocal
  17. CALL :TimeStamp StrLenLocalStart
  18. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenLocal LenDummyStrLenLocalA string %%a
  19. CALL :TimeStamp StrLenLocalEnd
  20. TITLE A - StrLenLocalBrackets
  21. CALL :TimeStamp StrLenLocalBracketsStart
  22. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenLocalBrackets LenDummyStrLenLocalBracketsA string %%a
  23. CALL :TimeStamp StrLenLocalBracketsEnd
  24. CALL :MeasureTime StrLenNoLocalTime StrLenNoLocalStart StrLenNoLocalEnd
  25. CALL :MeasureTime StrLenNoLocalBracketsTime StrLenNoLocalBracketsStart StrLenNoLocalBracketsEnd
  26. CALL :MeasureTime StrLenLocalTime StrLenLocalStart StrLenLocalEnd
  27. CALL :MeasureTime StrLenLocalBracketsTime StrLenLocalBracketsStart StrLenLocalBracketsEnd
  28. REM Invert order
  29. TITLE B - StrLenLocalBrackets
  30. CALL :TimeStamp StrLenLocalBracketsStart
  31. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenLocalBrackets LenDummyStrLenLocalBracketsB string %%a
  32. CALL :TimeStamp StrLenLocalBracketsEnd
  33. TITLE B - StrLenLocal
  34. CALL :TimeStamp StrLenLocalStart
  35. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenLocal LenDummyStrLenLocalB string %%a
  36. CALL :TimeStamp StrLenLocalEnd
  37. TITLE B - StrLenNoLocalBrackets
  38. CALL :TimeStamp StrLenNoLocalBracketsStart
  39. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenNoLocalBrackets LenDummyStrLenNoLocalBracketsB string %%a
  40. CALL :TimeStamp StrLenNoLocalBracketsEnd
  41. TITLE B - StrLenNoLocal
  42. CALL :TimeStamp StrLenNoLocalStart
  43. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenNoLocal LenDummyStrLenNoLocalB string %%a
  44. CALL :TimeStamp StrLenNoLocalEnd
  45. TITLE Results
  46. ECHO.
  47. ECHO Time StrLenNoLocal A : !StrLenNoLocalTime!
  48. ECHO Time StrLenNoLocalBrackets A : !StrLenNoLocalBracketsTime!
  49. ECHO Time StrLenLocal A : !StrLenLocalTime!
  50. ECHO Time StrLenLocalBrackets A : !StrLenLocalBracketsTime!
  51. ECHO StrLen !LenDummyStrLenNoLocalA! / !LenDummyStrLenNoLocalBracketsA! / !LenDummyStrLenLocalA! / !LenDummyStrLenLocalBracketsA!
  52. ECHO.
  53. CALL :MeasureTime StrLenNoLocalTime StrLenNoLocalStart StrLenNoLocalEnd
  54. CALL :MeasureTime StrLenNoLocalBracketsTime StrLenNoLocalBracketsStart StrLenNoLocalBracketsEnd
  55. CALL :MeasureTime StrLenLocalTime StrLenLocalStart StrLenLocalEnd
  56. CALL :MeasureTime StrLenLocalBracketsTime StrLenLocalBracketsStart StrLenLocalBracketsEnd
  57. ECHO Time StrLenNoLocal B : !StrLenNoLocalTime!
  58. ECHO Time StrLenNoLocalBrackets B : !StrLenNoLocalBracketsTime!
  59. ECHO Time StrLenLocal B : !StrLenLocalTime!
  60. ECHO Time StrLenLocalBrackets B : !StrLenLocalBracketsTime!
  61. ECHO StrLen !LenDummyStrLenNoLocalB! / !LenDummyStrLenNoLocalBracketsB! / !LenDummyStrLenLocalB! / !LenDummyStrLenLocalBracketsB!
  62. ECHO.
  63. GOTO :EndOfBatch
  64. REM https://stackoverflow.com/a/5841587/1378342
  65. REM The original "function" is missing the /A for a number twice, which is wrong in my opinion. It seems to speed up the output.
  66. REM I also added missing cosmetic double quotes for "set" to make it more accurate
  67. :StrLenNoLocal
  68. ECHO Loop %~3 / %Loops%
  69. (SET^ tmp=!%~2!)
  70. IF DEFINED tmp (
  71. SET /A "len=1"
  72. FOR %%P IN (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) DO (
  73. IF "!tmp:~%%P,1!" NEQ "" (
  74. SET /A "len+=%%P"
  75. SET "tmp=!tmp:~%%P!"
  76. )
  77. )
  78. ) ELSE (
  79. SET /A "len=0"
  80. )
  81. SET /A "%~1=!len!"
  82. EXIT /B
  83. :StrLenNoLocalBrackets
  84. (
  85. ECHO Loop %~3 / %Loops%
  86. (SET^ tmp=!%~2!)
  87. IF DEFINED tmp (
  88. SET /A "len=1"
  89. FOR %%P IN (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) DO (
  90. IF "!tmp:~%%P,1!" NEQ "" (
  91. SET /A "len+=%%P"
  92. SET "tmp=!tmp:~%%P!"
  93. )
  94. )
  95. ) ELSE (
  96. SET /A "len=0"
  97. )
  98. SET /A "%~1=!len!"
  99. EXIT /B
  100. )
  101. :StrLenLocal
  102. echo Loop %~3 / %Loops% & setlocal EnableDelayedExpansion & (set^ tmp=!%~2!)
  103. if defined tmp (
  104. set /a "len=1"
  105. for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  106. if "!tmp:~%%P,1!" NEQ "" (
  107. set /a "len+=%%P"
  108. set "tmp=!tmp:~%%P!"
  109. )
  110. )
  111. ) else (
  112. set /a "len=0"
  113. )
  114. endlocal & set /a "%~1=%len%" & exit /b
  115. :StrLenLocalBrackets
  116. (
  117. echo Loop %~3 / %Loops%
  118. )
  119. (
  120. setlocal EnableDelayedExpansion
  121. (set^ tmp=!%~2!)
  122. if defined tmp (
  123. set /a "len=1"
  124. for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  125. if "!tmp:~%%P,1!" NEQ "" (
  126. set /a "len+=%%P"
  127. set "tmp=!tmp:~%%P!"
  128. )
  129. )
  130. ) else (
  131. set /a "len=0"
  132. )
  133. )
  134. (
  135. endlocal
  136. set /a "%~1=%len%"
  137. exit /b
  138. )
  139. :TimeStamp
  140. SET /A %~1=1%time:~-5,-3%%time:~-2%
  141. EXIT /B
  142. :MeasureTime
  143. SET /A %~1=!%~3!-!%~2!
  144. IF !%~1! LSS 0 SET /A %~1=6000+!%~1!
  145. SET %~1=!%~1:~0,-2!.!%~1:~-2!sec
  146. EXIT /B
  147. :EndOfBatch
  148. PAUSE
  149. ENDLOCAL
  150. GOTO :EOF

输出量:

  1. Time StrLenNoLocal A : 17.57sec
  2. Time StrLenNoLocalBrackets A : 15.06sec
  3. Time StrLenLocal A : 17.70sec
  4. Time StrLenLocalBrackets A : 18.09sec
  5. StrLen 8191 / 8191 / 8191 / 8191
  6. Time StrLenNoLocal B : 17.05sec
  7. Time StrLenNoLocalBrackets B : 14.56sec
  8. Time StrLenLocal B : 17.39sec
  9. Time StrLenLocalBrackets B : 17.84sec
  10. StrLen 8191 / 8191 / 8191 / 8191

( ... )版本比较快。
只要大家没有异议,我的结论是:
我更喜欢行数少的代码,只要它不影响可读性。* 但是 * 如果这两个括号可以使脚本更快一点,而且不会造成任何伤害-为什么不呢?;)

rsl1atfo

rsl1atfo1#

在“如果”之后...

  • 我的措施毫无意义
  • 我测量超时/ ping
  • 我把所有的东西都放在括号里
  • 我调用方括号内的嵌套标签

思考:

  1. @ECHO OFF
  2. SETLOCAL EnableExtensions EnableDelayedExpansion
  3. REM *** This string has the maximum length of 8191
  4. set "str=."
  5. FOR /L %%n in (1 1 13) DO SET "str=!str:~-4000!!str:~-4000!"
  6. (set^ string=!str!!str:~-191!)
  7. SET /A Loops=3000
  8. TITLE A - StrLenNoLocal
  9. CALL :TimeStamp StrLenNoLocalStart
  10. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenNoLocal LenDummyStrLenNoLocalA string %%a
  11. CALL :TimeStamp StrLenNoLocalEnd
  12. TITLE A - StrLenNoLocalBrackets
  13. CALL :TimeStamp StrLenNoLocalBracketsStart
  14. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenNoLocalBrackets LenDummyStrLenNoLocalBracketsA string %%a
  15. CALL :TimeStamp StrLenNoLocalBracketsEnd
  16. TITLE A - StrLenLocal
  17. CALL :TimeStamp StrLenLocalStart
  18. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenLocal LenDummyStrLenLocalA string %%a
  19. CALL :TimeStamp StrLenLocalEnd
  20. TITLE A - StrLenLocalBrackets
  21. CALL :TimeStamp StrLenLocalBracketsStart
  22. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenLocalBrackets LenDummyStrLenLocalBracketsA string %%a
  23. CALL :TimeStamp StrLenLocalBracketsEnd
  24. CALL :MeasureTime StrLenNoLocalTime StrLenNoLocalStart StrLenNoLocalEnd
  25. CALL :MeasureTime StrLenNoLocalBracketsTime StrLenNoLocalBracketsStart StrLenNoLocalBracketsEnd
  26. CALL :MeasureTime StrLenLocalTime StrLenLocalStart StrLenLocalEnd
  27. CALL :MeasureTime StrLenLocalBracketsTime StrLenLocalBracketsStart StrLenLocalBracketsEnd
  28. REM Messure Timeout 5sec
  29. TITLE Timeout 5sec
  30. CALL :TimeStamp TimeoutStart
  31. timeout /NOBREAK /T 5 >NUL
  32. CALL :TimeStamp TimeoutEnd
  33. CALL :MeasureTime TimeoutTime TimeoutStart TimeoutEnd
  34. REM Ping...
  35. TITLE Ping 5000
  36. CALL :TimeStamp PingStart
  37. ping 1.2.3.4 -n 1 -w 5000 >NUL
  38. CALL :TimeStamp PingEnd
  39. CALL :MeasureTime PingTime PingStart PingEnd
  40. REM Ping 50 * 100
  41. TITLE PingOneHundredTimes
  42. CALL :TimeStamp PingOneHundredTimesStart
  43. CALL :PingOneHundredTimes
  44. CALL :TimeStamp PingOneHundredTimesEnd
  45. TITLE PingOneHundredTimesBrackets
  46. CALL :TimeStamp PingOneHundredTimesBracketsStart
  47. CALL :PingOneHundredTimesBrackets
  48. CALL :TimeStamp PingOneHundredTimesBracketsEnd
  49. CALL :MeasureTime PingOneHundredTimesTime PingOneHundredTimesStart PingOneHundredTimesEnd
  50. CALL :MeasureTime PingOneHundredTimesBracketsTime PingOneHundredTimesBracketsStart PingOneHundredTimesBracketsEnd
  51. REM Invert order
  52. TITLE B - StrLenLocalBrackets
  53. CALL :TimeStamp StrLenLocalBracketsStart
  54. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenLocalBrackets LenDummyStrLenLocalBracketsB string %%a
  55. CALL :TimeStamp StrLenLocalBracketsEnd
  56. TITLE B - StrLenLocal
  57. CALL :TimeStamp StrLenLocalStart
  58. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenLocal LenDummyStrLenLocalB string %%a
  59. CALL :TimeStamp StrLenLocalEnd
  60. TITLE B - StrLenNoLocalBrackets
  61. CALL :TimeStamp StrLenNoLocalBracketsStart
  62. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenNoLocalBrackets LenDummyStrLenNoLocalBracketsB string %%a
  63. CALL :TimeStamp StrLenNoLocalBracketsEnd
  64. TITLE B - StrLenNoLocal
  65. CALL :TimeStamp StrLenNoLocalStart
  66. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenNoLocal LenDummyStrLenNoLocalB string %%a
  67. CALL :TimeStamp StrLenNoLocalEnd
  68. TITLE Results
  69. ECHO.
  70. REM "Empty" Timestamp Measure
  71. CALL :TimeStamp TimestampStart
  72. CALL :TimeStamp TimestampEnd
  73. CALL :MeasureTime TimestampTime TimestampStart TimestampEnd
  74. ECHO Time StrLenNoLocal A : !StrLenNoLocalTime!
  75. ECHO Time StrLenNoLocalBrackets A : !StrLenNoLocalBracketsTime!
  76. ECHO Time StrLenLocal A : !StrLenLocalTime!
  77. ECHO Time StrLenLocalBrackets A : !StrLenLocalBracketsTime!
  78. ECHO StrLen !LenDummyStrLenNoLocalA! / !LenDummyStrLenNoLocalBracketsA! / !LenDummyStrLenLocalA! / !LenDummyStrLenLocalBracketsA!
  79. ECHO.
  80. CALL :MeasureTime StrLenNoLocalTime StrLenNoLocalStart StrLenNoLocalEnd
  81. CALL :MeasureTime StrLenNoLocalBracketsTime StrLenNoLocalBracketsStart StrLenNoLocalBracketsEnd
  82. CALL :MeasureTime StrLenLocalTime StrLenLocalStart StrLenLocalEnd
  83. CALL :MeasureTime StrLenLocalBracketsTime StrLenLocalBracketsStart StrLenLocalBracketsEnd
  84. ECHO Time StrLenNoLocal B : !StrLenNoLocalTime!
  85. ECHO Time StrLenNoLocalBrackets B : !StrLenNoLocalBracketsTime!
  86. ECHO Time StrLenLocal B : !StrLenLocalTime!
  87. ECHO Time StrLenLocalBrackets B : !StrLenLocalBracketsTime!
  88. ECHO StrLen !LenDummyStrLenNoLocalB! / !LenDummyStrLenNoLocalBracketsB! / !LenDummyStrLenLocalB! / !LenDummyStrLenLocalBracketsB!
  89. ECHO.
  90. ECHO "Empty" Timestamp Measure : !TimestampTime!
  91. ECHO Timeout /T 5 : !TimeoutTime!
  92. ECHO ping 1.2.3.4 -n 1 -w 5000 : !PingTime!
  93. ECHO PingOneHundredTimes : !PingOneHundredTimesTime!
  94. ECHO PingOneHundredTimesBrackets : !PingOneHundredTimesBracketsTime!
  95. ECHO.
  96. SET AREYOUSURE=n
  97. SET /P "AREYOUSURE=Do you like to start over again inside brackets (y/[n]) ? "
  98. IF /I "!AREYOUSURE!" EQU "y" CALL :DoItAgain
  99. REM Test if labels inside brackets still works...
  100. REM Label inside a Label with brackets
  101. ECHO.
  102. CALL :LabelBrackets
  103. CALL :LabelInsideLabelBrackets
  104. ECHO.
  105. REM Label inside a Label with brackets without Exit after LabelBracketsWOExit
  106. CALL :LabelBracketsWOExit
  107. CALL :LabelInsideLabelBracketsWOExit
  108. ECHO.
  109. GOTO :EndOfBatch
  110. REM https://stackoverflow.com/a/5841587/1378342
  111. REM The original "function" is missing the /A for a number twice, which is wrong in my opinion. It seems to speed up the output.
  112. REM I also added missing cosmetic double quotes for "set" to make it more accurate
  113. :StrLenNoLocal
  114. ECHO Loop %~3 / %Loops%
  115. (SET^ tmp=!%~2!)
  116. IF DEFINED tmp (
  117. SET /A "len=1"
  118. FOR %%P IN (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) DO (
  119. IF "!tmp:~%%P,1!" NEQ "" (
  120. SET /A "len+=%%P"
  121. SET "tmp=!tmp:~%%P!"
  122. )
  123. )
  124. ) ELSE (
  125. SET /A "len=0"
  126. )
  127. SET /A "%~1=!len!"
  128. EXIT /B
  129. :StrLenNoLocalBrackets
  130. (
  131. ECHO Loop %~3 / %Loops%
  132. (SET^ tmp=!%~2!)
  133. IF DEFINED tmp (
  134. SET /A "len=1"
  135. FOR %%P IN (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) DO (
  136. IF "!tmp:~%%P,1!" NEQ "" (
  137. SET /A "len+=%%P"
  138. SET "tmp=!tmp:~%%P!"
  139. )
  140. )
  141. ) ELSE (
  142. SET /A "len=0"
  143. )
  144. SET /A "%~1=!len!"
  145. EXIT /B
  146. )
  147. :StrLenLocal
  148. echo Loop %~3 / %Loops% & setlocal EnableDelayedExpansion & (set^ tmp=!%~2!)
  149. if defined tmp (
  150. set /a "len=1"
  151. for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  152. if "!tmp:~%%P,1!" NEQ "" (
  153. set /a "len+=%%P"
  154. set "tmp=!tmp:~%%P!"
  155. )
  156. )
  157. ) else (
  158. set /a "len=0"
  159. )
  160. endlocal & set /a "%~1=%len%" & exit /b
  161. :StrLenLocalBrackets
  162. (
  163. echo Loop %~3 / %Loops%
  164. )
  165. (
  166. setlocal EnableDelayedExpansion
  167. (set^ tmp=!%~2!)
  168. if defined tmp (
  169. set /a "len=1"
  170. for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  171. if "!tmp:~%%P,1!" NEQ "" (
  172. set /a "len+=%%P"
  173. set "tmp=!tmp:~%%P!"
  174. )
  175. )
  176. ) else (
  177. set /a "len=0"
  178. )
  179. )
  180. (
  181. endlocal
  182. set /a "%~1=%len%"
  183. exit /b
  184. )
  185. :TimeStamp
  186. SET /A %~1=1%time:~-5,-3%%time:~-2%
  187. EXIT /B
  188. :MeasureTime
  189. SET /A %~1=!%~3!-!%~2!
  190. IF !%~1! LSS 0 SET /A %~1=6000+!%~1!
  191. IF "!%~1:~-2,-1!" == "" SET %~1=0!%~1!
  192. IF "!%~1:~0,-2!" == "" SET %~1=0!%~1!
  193. SET %~1=!%~1:~0,-2!.!%~1:~-2!sec
  194. EXIT /B
  195. :EndOfBatch
  196. ENDLOCAL
  197. GOTO :EOF
  198. :LabelBrackets
  199. (
  200. ECHO I'm called "%~0" .
  201. EXIT /B
  202. :LabelInsideLabelBrackets
  203. ECHO I'm called "%~0" .
  204. EXIT /B
  205. )
  206. :LabelBracketsWOExit
  207. (
  208. ECHO I'm called "%~0" .
  209. :LabelInsideLabelBracketsWOExit
  210. ECHO I'm called "%~0" .
  211. EXIT /B
  212. )
  213. :PingOneHundredTimes
  214. ping 1.2.3.4 -n 1 -w 50 >NUL
  215. ping 1.2.3.4 -n 1 -w 50 >NUL
  216. ping 1.2.3.4 -n 1 -w 50 >NUL
  217. ping 1.2.3.4 -n 1 -w 50 >NUL
  218. ping 1.2.3.4 -n 1 -w 50 >NUL
  219. ping 1.2.3.4 -n 1 -w 50 >NUL
  220. ping 1.2.3.4 -n 1 -w 50 >NUL
  221. ping 1.2.3.4 -n 1 -w 50 >NUL
  222. ping 1.2.3.4 -n 1 -w 50 >NUL
  223. ping 1.2.3.4 -n 1 -w 50 >NUL
  224. ping 1.2.3.4 -n 1 -w 50 >NUL
  225. ping 1.2.3.4 -n 1 -w 50 >NUL
  226. ping 1.2.3.4 -n 1 -w 50 >NUL
  227. ping 1.2.3.4 -n 1 -w 50 >NUL
  228. ping 1.2.3.4 -n 1 -w 50 >NUL
  229. ping 1.2.3.4 -n 1 -w 50 >NUL
  230. ping 1.2.3.4 -n 1 -w 50 >NUL
  231. ping 1.2.3.4 -n 1 -w 50 >NUL
  232. ping 1.2.3.4 -n 1 -w 50 >NUL
  233. ping 1.2.3.4 -n 1 -w 50 >NUL
  234. ping 1.2.3.4 -n 1 -w 50 >NUL
  235. ping 1.2.3.4 -n 1 -w 50 >NUL
  236. ping 1.2.3.4 -n 1 -w 50 >NUL
  237. ping 1.2.3.4 -n 1 -w 50 >NUL
  238. ping 1.2.3.4 -n 1 -w 50 >NUL
  239. ping 1.2.3.4 -n 1 -w 50 >NUL
  240. ping 1.2.3.4 -n 1 -w 50 >NUL
  241. ping 1.2.3.4 -n 1 -w 50 >NUL
  242. ping 1.2.3.4 -n 1 -w 50 >NUL
  243. ping 1.2.3.4 -n 1 -w 50 >NUL
  244. ping 1.2.3.4 -n 1 -w 50 >NUL
  245. ping 1.2.3.4 -n 1 -w 50 >NUL
  246. ping 1.2.3.4 -n 1 -w 50 >NUL
  247. ping 1.2.3.4 -n 1 -w 50 >NUL
  248. ping 1.2.3.4 -n 1 -w 50 >NUL
  249. ping 1.2.3.4 -n 1 -w 50 >NUL
  250. ping 1.2.3.4 -n 1 -w 50 >NUL
  251. ping 1.2.3.4 -n 1 -w 50 >NUL
  252. ping 1.2.3.4 -n 1 -w 50 >NUL
  253. ping 1.2.3.4 -n 1 -w 50 >NUL
  254. ping 1.2.3.4 -n 1 -w 50 >NUL
  255. ping 1.2.3.4 -n 1 -w 50 >NUL
  256. ping 1.2.3.4 -n 1 -w 50 >NUL
  257. ping 1.2.3.4 -n 1 -w 50 >NUL
  258. ping 1.2.3.4 -n 1 -w 50 >NUL
  259. ping 1.2.3.4 -n 1 -w 50 >NUL
  260. ping 1.2.3.4 -n 1 -w 50 >NUL
  261. ping 1.2.3.4 -n 1 -w 50 >NUL
  262. ping 1.2.3.4 -n 1 -w 50 >NUL
  263. ping 1.2.3.4 -n 1 -w 50 >NUL
  264. ping 1.2.3.4 -n 1 -w 50 >NUL
  265. ping 1.2.3.4 -n 1 -w 50 >NUL
  266. ping 1.2.3.4 -n 1 -w 50 >NUL
  267. ping 1.2.3.4 -n 1 -w 50 >NUL
  268. ping 1.2.3.4 -n 1 -w 50 >NUL
  269. ping 1.2.3.4 -n 1 -w 50 >NUL
  270. ping 1.2.3.4 -n 1 -w 50 >NUL
  271. ping 1.2.3.4 -n 1 -w 50 >NUL
  272. ping 1.2.3.4 -n 1 -w 50 >NUL
  273. ping 1.2.3.4 -n 1 -w 50 >NUL
  274. ping 1.2.3.4 -n 1 -w 50 >NUL
  275. ping 1.2.3.4 -n 1 -w 50 >NUL
  276. ping 1.2.3.4 -n 1 -w 50 >NUL
  277. ping 1.2.3.4 -n 1 -w 50 >NUL
  278. ping 1.2.3.4 -n 1 -w 50 >NUL
  279. ping 1.2.3.4 -n 1 -w 50 >NUL
  280. ping 1.2.3.4 -n 1 -w 50 >NUL
  281. ping 1.2.3.4 -n 1 -w 50 >NUL
  282. ping 1.2.3.4 -n 1 -w 50 >NUL
  283. ping 1.2.3.4 -n 1 -w 50 >NUL
  284. ping 1.2.3.4 -n 1 -w 50 >NUL
  285. ping 1.2.3.4 -n 1 -w 50 >NUL
  286. ping 1.2.3.4 -n 1 -w 50 >NUL
  287. ping 1.2.3.4 -n 1 -w 50 >NUL
  288. ping 1.2.3.4 -n 1 -w 50 >NUL
  289. ping 1.2.3.4 -n 1 -w 50 >NUL
  290. ping 1.2.3.4 -n 1 -w 50 >NUL
  291. ping 1.2.3.4 -n 1 -w 50 >NUL
  292. ping 1.2.3.4 -n 1 -w 50 >NUL
  293. ping 1.2.3.4 -n 1 -w 50 >NUL
  294. ping 1.2.3.4 -n 1 -w 50 >NUL
  295. ping 1.2.3.4 -n 1 -w 50 >NUL
  296. ping 1.2.3.4 -n 1 -w 50 >NUL
  297. ping 1.2.3.4 -n 1 -w 50 >NUL
  298. ping 1.2.3.4 -n 1 -w 50 >NUL
  299. ping 1.2.3.4 -n 1 -w 50 >NUL
  300. ping 1.2.3.4 -n 1 -w 50 >NUL
  301. ping 1.2.3.4 -n 1 -w 50 >NUL
  302. ping 1.2.3.4 -n 1 -w 50 >NUL
  303. ping 1.2.3.4 -n 1 -w 50 >NUL
  304. ping 1.2.3.4 -n 1 -w 50 >NUL
  305. ping 1.2.3.4 -n 1 -w 50 >NUL
  306. ping 1.2.3.4 -n 1 -w 50 >NUL
  307. ping 1.2.3.4 -n 1 -w 50 >NUL
  308. ping 1.2.3.4 -n 1 -w 50 >NUL
  309. ping 1.2.3.4 -n 1 -w 50 >NUL
  310. ping 1.2.3.4 -n 1 -w 50 >NUL
  311. ping 1.2.3.4 -n 1 -w 50 >NUL
  312. ping 1.2.3.4 -n 1 -w 50 >NUL
  313. ping 1.2.3.4 -n 1 -w 50 >NUL
  314. ping 1.2.3.4 -n 1 -w 50 >NUL
  315. EXIT /B
  316. :PingOneHundredTimesBrackets
  317. (
  318. ping 1.2.3.4 -n 1 -w 50 >NUL
  319. ping 1.2.3.4 -n 1 -w 50 >NUL
  320. ping 1.2.3.4 -n 1 -w 50 >NUL
  321. ping 1.2.3.4 -n 1 -w 50 >NUL
  322. ping 1.2.3.4 -n 1 -w 50 >NUL
  323. ping 1.2.3.4 -n 1 -w 50 >NUL
  324. ping 1.2.3.4 -n 1 -w 50 >NUL
  325. ping 1.2.3.4 -n 1 -w 50 >NUL
  326. ping 1.2.3.4 -n 1 -w 50 >NUL
  327. ping 1.2.3.4 -n 1 -w 50 >NUL
  328. ping 1.2.3.4 -n 1 -w 50 >NUL
  329. ping 1.2.3.4 -n 1 -w 50 >NUL
  330. ping 1.2.3.4 -n 1 -w 50 >NUL
  331. ping 1.2.3.4 -n 1 -w 50 >NUL
  332. ping 1.2.3.4 -n 1 -w 50 >NUL
  333. ping 1.2.3.4 -n 1 -w 50 >NUL
  334. ping 1.2.3.4 -n 1 -w 50 >NUL
  335. ping 1.2.3.4 -n 1 -w 50 >NUL
  336. ping 1.2.3.4 -n 1 -w 50 >NUL
  337. ping 1.2.3.4 -n 1 -w 50 >NUL
  338. ping 1.2.3.4 -n 1 -w 50 >NUL
  339. ping 1.2.3.4 -n 1 -w 50 >NUL
  340. ping 1.2.3.4 -n 1 -w 50 >NUL
  341. ping 1.2.3.4 -n 1 -w 50 >NUL
  342. ping 1.2.3.4 -n 1 -w 50 >NUL
  343. ping 1.2.3.4 -n 1 -w 50 >NUL
  344. ping 1.2.3.4 -n 1 -w 50 >NUL
  345. ping 1.2.3.4 -n 1 -w 50 >NUL
  346. ping 1.2.3.4 -n 1 -w 50 >NUL
  347. ping 1.2.3.4 -n 1 -w 50 >NUL
  348. ping 1.2.3.4 -n 1 -w 50 >NUL
  349. ping 1.2.3.4 -n 1 -w 50 >NUL
  350. ping 1.2.3.4 -n 1 -w 50 >NUL
  351. ping 1.2.3.4 -n 1 -w 50 >NUL
  352. ping 1.2.3.4 -n 1 -w 50 >NUL
  353. ping 1.2.3.4 -n 1 -w 50 >NUL
  354. ping 1.2.3.4 -n 1 -w 50 >NUL
  355. ping 1.2.3.4 -n 1 -w 50 >NUL
  356. ping 1.2.3.4 -n 1 -w 50 >NUL
  357. ping 1.2.3.4 -n 1 -w 50 >NUL
  358. ping 1.2.3.4 -n 1 -w 50 >NUL
  359. ping 1.2.3.4 -n 1 -w 50 >NUL
  360. ping 1.2.3.4 -n 1 -w 50 >NUL
  361. ping 1.2.3.4 -n 1 -w 50 >NUL
  362. ping 1.2.3.4 -n 1 -w 50 >NUL
  363. ping 1.2.3.4 -n 1 -w 50 >NUL
  364. ping 1.2.3.4 -n 1 -w 50 >NUL
  365. ping 1.2.3.4 -n 1 -w 50 >NUL
  366. ping 1.2.3.4 -n 1 -w 50 >NUL
  367. ping 1.2.3.4 -n 1 -w 50 >NUL
  368. ping 1.2.3.4 -n 1 -w 50 >NUL
  369. ping 1.2.3.4 -n 1 -w 50 >NUL
  370. ping 1.2.3.4 -n 1 -w 50 >NUL
  371. ping 1.2.3.4 -n 1 -w 50 >NUL
  372. ping 1.2.3.4 -n 1 -w 50 >NUL
  373. ping 1.2.3.4 -n 1 -w 50 >NUL
  374. ping 1.2.3.4 -n 1 -w 50 >NUL
  375. ping 1.2.3.4 -n 1 -w 50 >NUL
  376. ping 1.2.3.4 -n 1 -w 50 >NUL
  377. ping 1.2.3.4 -n 1 -w 50 >NUL
  378. ping 1.2.3.4 -n 1 -w 50 >NUL
  379. ping 1.2.3.4 -n 1 -w 50 >NUL
  380. ping 1.2.3.4 -n 1 -w 50 >NUL
  381. ping 1.2.3.4 -n 1 -w 50 >NUL
  382. ping 1.2.3.4 -n 1 -w 50 >NUL
  383. ping 1.2.3.4 -n 1 -w 50 >NUL
  384. ping 1.2.3.4 -n 1 -w 50 >NUL
  385. ping 1.2.3.4 -n 1 -w 50 >NUL
  386. ping 1.2.3.4 -n 1 -w 50 >NUL
  387. ping 1.2.3.4 -n 1 -w 50 >NUL
  388. ping 1.2.3.4 -n 1 -w 50 >NUL
  389. ping 1.2.3.4 -n 1 -w 50 >NUL
  390. ping 1.2.3.4 -n 1 -w 50 >NUL
  391. ping 1.2.3.4 -n 1 -w 50 >NUL
  392. ping 1.2.3.4 -n 1 -w 50 >NUL
  393. ping 1.2.3.4 -n 1 -w 50 >NUL
  394. ping 1.2.3.4 -n 1 -w 50 >NUL
  395. ping 1.2.3.4 -n 1 -w 50 >NUL
  396. ping 1.2.3.4 -n 1 -w 50 >NUL
  397. ping 1.2.3.4 -n 1 -w 50 >NUL
  398. ping 1.2.3.4 -n 1 -w 50 >NUL
  399. ping 1.2.3.4 -n 1 -w 50 >NUL
  400. ping 1.2.3.4 -n 1 -w 50 >NUL
  401. ping 1.2.3.4 -n 1 -w 50 >NUL
  402. ping 1.2.3.4 -n 1 -w 50 >NUL
  403. ping 1.2.3.4 -n 1 -w 50 >NUL
  404. ping 1.2.3.4 -n 1 -w 50 >NUL
  405. ping 1.2.3.4 -n 1 -w 50 >NUL
  406. ping 1.2.3.4 -n 1 -w 50 >NUL
  407. ping 1.2.3.4 -n 1 -w 50 >NUL
  408. ping 1.2.3.4 -n 1 -w 50 >NUL
  409. ping 1.2.3.4 -n 1 -w 50 >NUL
  410. ping 1.2.3.4 -n 1 -w 50 >NUL
  411. ping 1.2.3.4 -n 1 -w 50 >NUL
  412. ping 1.2.3.4 -n 1 -w 50 >NUL
  413. ping 1.2.3.4 -n 1 -w 50 >NUL
  414. ping 1.2.3.4 -n 1 -w 50 >NUL
  415. ping 1.2.3.4 -n 1 -w 50 >NUL
  416. ping 1.2.3.4 -n 1 -w 50 >NUL
  417. ping 1.2.3.4 -n 1 -w 50 >NUL
  418. ping 1.2.3.4 -n 1 -w 50 >NUL
  419. EXIT /B
  420. )
  421. :DoItAgain
  422. (
  423. TITLE A - StrLenNoLocal
  424. CALL :TimeStamp StrLenNoLocalStart
  425. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenNoLocal LenDummyStrLenNoLocalA string %%a
  426. CALL :TimeStamp StrLenNoLocalEnd
  427. TITLE A - StrLenNoLocalBrackets
  428. CALL :TimeStamp StrLenNoLocalBracketsStart
  429. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenNoLocalBrackets LenDummyStrLenNoLocalBracketsA string %%a
  430. CALL :TimeStamp StrLenNoLocalBracketsEnd
  431. TITLE A - StrLenLocal
  432. CALL :TimeStamp StrLenLocalStart
  433. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenLocal LenDummyStrLenLocalA string %%a
  434. CALL :TimeStamp StrLenLocalEnd
  435. TITLE A - StrLenLocalBrackets
  436. CALL :TimeStamp StrLenLocalBracketsStart
  437. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenLocalBrackets LenDummyStrLenLocalBracketsA string %%a
  438. CALL :TimeStamp StrLenLocalBracketsEnd
  439. CALL :MeasureTime StrLenNoLocalTime StrLenNoLocalStart StrLenNoLocalEnd
  440. CALL :MeasureTime StrLenNoLocalBracketsTime StrLenNoLocalBracketsStart StrLenNoLocalBracketsEnd
  441. CALL :MeasureTime StrLenLocalTime StrLenLocalStart StrLenLocalEnd
  442. CALL :MeasureTime StrLenLocalBracketsTime StrLenLocalBracketsStart StrLenLocalBracketsEnd
  443. REM Messure Timeout 5sec
  444. TITLE Timeout 5sec
  445. CALL :TimeStamp TimeoutStart
  446. timeout /NOBREAK /T 5 >NUL
  447. CALL :TimeStamp TimeoutEnd
  448. CALL :MeasureTime TimeoutTime TimeoutStart TimeoutEnd
  449. REM Ping...
  450. TITLE Ping 5000
  451. CALL :TimeStamp PingStart
  452. ping 1.2.3.4 -n 1 -w 5000 >NUL
  453. CALL :TimeStamp PingEnd
  454. CALL :MeasureTime PingTime PingStart PingEnd
  455. REM Ping 50 * 100
  456. TITLE PingOneHundredTimes
  457. CALL :TimeStamp PingOneHundredTimesStart
  458. CALL :PingOneHundredTimes
  459. CALL :TimeStamp PingOneHundredTimesEnd
  460. TITLE PingOneHundredTimesBrackets
  461. CALL :TimeStamp PingOneHundredTimesBracketsStart
  462. CALL :PingOneHundredTimesBrackets
  463. CALL :TimeStamp PingOneHundredTimesBracketsEnd
  464. CALL :MeasureTime PingOneHundredTimesTime PingOneHundredTimesStart PingOneHundredTimesEnd
  465. CALL :MeasureTime PingOneHundredTimesBracketsTime PingOneHundredTimesBracketsStart PingOneHundredTimesBracketsEnd
  466. REM Invert order
  467. TITLE B - StrLenLocalBrackets
  468. CALL :TimeStamp StrLenLocalBracketsStart
  469. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenLocalBrackets LenDummyStrLenLocalBracketsB string %%a
  470. CALL :TimeStamp StrLenLocalBracketsEnd
  471. TITLE B - StrLenLocal
  472. CALL :TimeStamp StrLenLocalStart
  473. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenLocal LenDummyStrLenLocalB string %%a
  474. CALL :TimeStamp StrLenLocalEnd
  475. TITLE B - StrLenNoLocalBrackets
  476. CALL :TimeStamp StrLenNoLocalBracketsStart
  477. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenNoLocalBrackets LenDummyStrLenNoLocalBracketsB string %%a
  478. CALL :TimeStamp StrLenNoLocalBracketsEnd
  479. TITLE B - StrLenNoLocal
  480. CALL :TimeStamp StrLenNoLocalStart
  481. FOR /L %%a IN (1,1,%Loops%) DO CALL :StrLenNoLocal LenDummyStrLenNoLocalB string %%a
  482. CALL :TimeStamp StrLenNoLocalEnd
  483. TITLE Results
  484. ECHO.
  485. REM "Empty" Timestamp Measure
  486. CALL :TimeStamp TimestampStart
  487. CALL :TimeStamp TimestampEnd
  488. CALL :MeasureTime TimestampTime TimestampStart TimestampEnd
  489. ECHO Time StrLenNoLocal A : !StrLenNoLocalTime!
  490. ECHO Time StrLenNoLocalBrackets A : !StrLenNoLocalBracketsTime!
  491. ECHO Time StrLenLocal A : !StrLenLocalTime!
  492. ECHO Time StrLenLocalBrackets A : !StrLenLocalBracketsTime!
  493. ECHO StrLen !LenDummyStrLenNoLocalA! / !LenDummyStrLenNoLocalBracketsA! / !LenDummyStrLenLocalA! / !LenDummyStrLenLocalBracketsA!
  494. ECHO.
  495. CALL :MeasureTime StrLenNoLocalTime StrLenNoLocalStart StrLenNoLocalEnd
  496. CALL :MeasureTime StrLenNoLocalBracketsTime StrLenNoLocalBracketsStart StrLenNoLocalBracketsEnd
  497. CALL :MeasureTime StrLenLocalTime StrLenLocalStart StrLenLocalEnd
  498. CALL :MeasureTime StrLenLocalBracketsTime StrLenLocalBracketsStart StrLenLocalBracketsEnd
  499. ECHO Time StrLenNoLocal B : !StrLenNoLocalTime!
  500. ECHO Time StrLenNoLocalBrackets B : !StrLenNoLocalBracketsTime!
  501. ECHO Time StrLenLocal B : !StrLenLocalTime!
  502. ECHO Time StrLenLocalBrackets B : !StrLenLocalBracketsTime!
  503. ECHO StrLen !LenDummyStrLenNoLocalB! / !LenDummyStrLenNoLocalBracketsB! / !LenDummyStrLenLocalB! / !LenDummyStrLenLocalBracketsB!
  504. ECHO.
  505. ECHO "Empty" Timestamp Measure : !TimestampTime!
  506. ECHO Timeout /T 5 : !TimeoutTime!
  507. ECHO ping 1.2.3.4 -n 1 -w 5000 : !PingTime!
  508. ECHO PingOneHundredTimes : !PingOneHundredTimesTime!
  509. ECHO PingOneHundredTimesBrackets : !PingOneHundredTimesBracketsTime!
  510. ECHO.
  511. EXIT /B
  512. )

输出量:

  1. Time StrLenNoLocal A : 20.40sec
  2. Time StrLenNoLocalBrackets A : 16.82sec
  3. Time StrLenLocal A : 19.84sec
  4. Time StrLenLocalBrackets A : 19.17sec
  5. StrLen 8191 / 8191 / 8191 / 8191
  6. Time StrLenNoLocal B : 17.40sec
  7. Time StrLenNoLocalBrackets B : 14.93sec
  8. Time StrLenLocal B : 17.64sec
  9. Time StrLenLocalBrackets B : 18.52sec
  10. StrLen 8191 / 8191 / 8191 / 8191
  11. "Empty" Timestamp Measure : 0.00sec
  12. Timeout /T 5 : 5.16sec
  13. ping 1.2.3.4 -n 1 -w 5000 : 4.59sec
  14. PingOneHundredTimes : 50.50sec
  15. PingOneHundredTimesBrackets : 50.50sec
  16. ...
  17. Time StrLenNoLocal A : 18.76sec
  18. Time StrLenNoLocalBrackets A : 16.76sec
  19. Time StrLenLocal A : 19.09sec
  20. Time StrLenLocalBrackets A : 19.67sec
  21. StrLen 8191 / 8191 / 8191 / 8191
  22. Time StrLenNoLocal B : 18.24sec
  23. Time StrLenNoLocalBrackets B : 15.97sec
  24. Time StrLenLocal B : 18.63sec
  25. Time StrLenLocalBrackets B : 19.60sec
  26. StrLen 8191 / 8191 / 8191 / 8191
  27. "Empty" Timestamp Measure : 0.00sec
  28. Timeout /T 5 : 4.52sec
  29. ping 1.2.3.4 -n 1 -w 5000 : 4.56sec
  30. PingOneHundredTimes : 50.49sec
  31. PingOneHundredTimesBrackets : 50.49sec
  32. I'm called ":LabelBrackets" .
  33. I'm called ":LabelInsideLabelBrackets" .
  34. I'm called ":LabelBracketsWOExit" .
  35. I'm called ":LabelBracketsWOExit" .
  36. I'm called ":LabelInsideLabelBracketsWOExit" .

我得出以下结论:

  1. ECHO %time%
  2. timeout /T 5
  3. ECHO %time%
  • 不是5秒。;)
  • 我每次都在“StrLenNoLocalBrackets”中得到最低点。
  • 我还没有发现一个命令链,括号内的任何东西都会导致问题。*
  1. :LongLabel
  2. (
  3. ECHO I'm called "%~0" , because I have two extra lines.
  4. EXIT /B
  5. )

*LongLabel仍然是 * 赢家(只要你知道你在做什么)。;)

  • 只是最后的修订**(我想我已经走得太远了):

我还是发现了一个美中不足:

  1. @ECHO OFF
  2. SET "S="
  3. CALL :A
  4. SET "S="
  5. CALL :B
  6. SET "S="
  7. CALL :C
  8. SET "S="
  9. CALL :D
  10. SET "S="
  11. CALL :E
  12. SET "S="
  13. CALL :F
  14. GOTO :EOF
  15. :A
  16. (
  17. SETLOCAL
  18. SET S=LOCALC
  19. ENDLOCAL
  20. ECHO %~0: %S% --^> Empty
  21. EXIT /B
  22. )
  23. :B
  24. SETLOCAL
  25. SET S=LOCALC
  26. (
  27. ENDLOCAL
  28. ECHO %~0: %S% ^<-- Set
  29. EXIT /B
  30. )
  31. :C
  32. (
  33. SETLOCAL
  34. SET S=LOCALC
  35. (
  36. ENDLOCAL
  37. ECHO %~0: %S% --^> Empty
  38. EXIT /B
  39. )
  40. )
  41. :D
  42. (
  43. SETLOCAL
  44. SET S=LOCALC
  45. )
  46. (
  47. ENDLOCAL
  48. ECHO %~0: %S% ^<-- Set
  49. EXIT /B
  50. )
  51. :E
  52. (
  53. SETLOCAL
  54. SET S=LOCALC
  55. ENDLOCAL & ECHO %~0: %S% --^> Empty & EXIT /B
  56. )
  57. :F
  58. SETLOCAL
  59. SET S=LOCALC
  60. ENDLOCAL & ECHO %~0: %S% ^<-- Set & EXIT /B
  61. ECHO End of batch (should not be echoed)

注意D、EF之间的区别

  1. :A: --> Empty
  2. :B: LOCALC <-- Set
  3. :C: --> Empty
  4. :D: LOCALC <-- Set
  5. :E: --> Empty
  6. :F: LOCALC <-- Set

这意味着你不能把所有的东西都放在一起,期待同样的结果。

展开查看全部

相关问题