Batch file 嵌套时如何加快循环进程
1.如何在嵌套时加快循环处理。处理从(a)到(zzz)的1个字符需要30秒 2.如何使此代码能够设置范围,如起始2位和结束4位 3.为什么这个代码显示编码命令,这就是为什么我从命令中输入字符@at 蝙蝠样本Batch file 嵌套时如何加快循环进程,batch-file,Batch File,1.如何在嵌套时加快循环处理。处理从(a)到(zzz)的1个字符需要30秒 2.如何使此代码能够设置范围,如起始2位和结束4位 3.为什么这个代码显示编码命令,这就是为什么我从命令中输入字符@at 蝙蝠样本 @echo off setlocal EnableDelayedExpansion set "loop2=IN (0,1,36) DO @(" set "n0=" set "n1=a" set "n2=b" set
@echo off
setlocal EnableDelayedExpansion
set "loop2=IN (0,1,36) DO @("
set "n0="
set "n1=a"
set "n2=b"
set "n3=c"
set "n4=d"
set "n5=e"
set "n6=f"
set "n7=g"
set "n8=h"
set "n9=i"
set "n10=j"
set "n11=k"
set "n12=l"
set "n13=m"
set "n14=n"
set "n15=o"
set "n16=p"
set "n17=q"
set "n18=r"
set "n19=s"
set "n20=t"
set "n21=u"
set "n22=v"
set "n23=w"
set "n24=x"
set "n25=y"
set "n26=z"
set "n27=1"
set "n28=2"
set "n29=3"
set "n30=4"
set "n31=5"
set "n32=6"
set "n33=7"
set "n34=8"
set "n35=9"
set "n36=0"
@FOR /L %%a %loop2%
@call :prc %%a
@FOR /L %%b %loop2%
@call :prc %%a %%b
@FOR /L %%c %loop2%
@call :prc %%a %%b %%c
@FOR /L %%d %loop2%
@call :prc %%a %%b %%c %%d
@FOR /L %%e %loop2%
@call :prc %%a %%b %%c %%d %%e
)
)
)
)
)
)
@pause
:prc
::@cls
@title %1 %2 %3 = !n%1!!n%2!!n%3!
@set "data=!n%1!!n%2!!n%3!!n%4!!n%5!"
@if not defined data goto end
@echo.
@echo %data% >> data.txt
@echo.
@:end
@goto :eof
`
删除任何不必要的命令
采用不同的递归方法构建字符串,
看起来像是在不同的数字基础上工作。
顺便说一句,36幂5是60.466.176,通常从
数字0,后跟字母9,如十六进制0-9abcdef
使用
Echo off时不会在此处发生
@echo off & setlocal EnableDelayedExpansion
set "n= abcdefghijklmnopqrstuvwxyz1234567890"
for /l %%n in (1,1,36) do set "n%%n=!n:~%%n,1!"
set "n="
set "loop2=in (1,1,36) DO ("
FOR /L %%a %loop2%
call :prc %%a
FOR /L %%b %loop2%
call :prc %%a %%b
FOR /L %%c %loop2%
call :prc %%a %%b %%c
FOR /L %%d %loop2%
call :prc %%a %%b %%c %%d
FOR /L %%e %loop2%
call :prc %%a %%b %%c %%d %%e
)
Pause
)
)
)
)
pause
Goto :Eof
:prc
set "data=!n%1!!n%2!!n%3!!n%4!!n%5!"
echo %data% &Rem>> data.txt
goto :eof
删除任何不必要的命令
采用不同的递归方法构建字符串,
看起来像是在不同的数字基础上工作。
顺便说一句,36幂5是60.466.176,通常从
数字0,后跟字母9,如十六进制0-9abcdef
使用
Echo off时不会在此处发生
@echo off & setlocal EnableDelayedExpansion
set "n= abcdefghijklmnopqrstuvwxyz1234567890"
for /l %%n in (1,1,36) do set "n%%n=!n:~%%n,1!"
set "n="
set "loop2=in (1,1,36) DO ("
FOR /L %%a %loop2%
call :prc %%a
FOR /L %%b %loop2%
call :prc %%a %%b
FOR /L %%c %loop2%
call :prc %%a %%b %%c
FOR /L %%d %loop2%
call :prc %%a %%b %%c %%d
FOR /L %%e %loop2%
call :prc %%a %%b %%c %%d %%e
)
Pause
)
)
)
)
pause
Goto :Eof
:prc
set "data=!n%1!!n%2!!n%3!!n%4!!n%5!"
echo %data% &Rem>> data.txt
goto :eof
除了中给出的建议外,还有两种结构特别缓慢:
命令。如果您想要速度,请避免调用子例程。您可以改用宏(如原始的调用
变量,但带有完整的命令)loop2
重定向。此表单每次使用时都执行以下步骤:1-打开文件。2-查找文件的结尾。3-附加数据。4-关闭文件。使用唯一的>
重定向将文件一直保持打开状态,直到进程结束,这样做的速度要快得多>
@echo off
setlocal EnableDelayedExpansion
set "i=0"
for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 0) do (
set /A i+=1
set "n!i!=%%a"
)
set "range2=1,1,36"
(FOR /L %%a IN (%range2%) DO (
echo !n%%a!
FOR /L %%b IN (%range2%) DO (
echo !n%%a!!n%%b!
FOR /L %%c IN (%range2%) DO (
echo !n%%a!!n%%b!!n%%c!
FOR /L %%d IN (%range2%) DO (
echo !n%%a!!n%%b!!n%%c!!n%%d!
FOR /L %%e IN (%range2%) DO (
echo !n%%a!!n%%b!!n%%c!!n%%d!!n%%e!
)
)
)
)
)) > data.txt
除了中给出的建议外,还有两种结构特别缓慢:
命令。如果您想要速度,请避免调用子例程。您可以改用宏(如原始的调用
变量,但带有完整的命令)loop2
重定向。此表单每次使用时都执行以下步骤:1-打开文件。2-查找文件的结尾。3-附加数据。4-关闭文件。使用唯一的>
重定向将文件一直保持打开状态,直到进程结束,这样做的速度要快得多>
@echo off
setlocal EnableDelayedExpansion
set "i=0"
for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 0) do (
set /A i+=1
set "n!i!=%%a"
)
set "range2=1,1,36"
(FOR /L %%a IN (%range2%) DO (
echo !n%%a!
FOR /L %%b IN (%range2%) DO (
echo !n%%a!!n%%b!
FOR /L %%c IN (%range2%) DO (
echo !n%%a!!n%%b!!n%%c!
FOR /L %%d IN (%range2%) DO (
echo !n%%a!!n%%b!!n%%c!!n%%d!
FOR /L %%e IN (%range2%) DO (
echo !n%%a!!n%%b!!n%%c!!n%%d!!n%%e!
)
)
)
)
)) > data.txt
我明白了为什么“ECHO OFF”有时似乎不起作用——当你打印一个两位数的字符串时,你最终会达到“on”,这会产生
ECHO on
。这应该是显而易见的为什么这是一个问题
你应该使用一种安全的ECHO格式,最好的是ECHO(
)-它看起来很奇怪,但很有效
想到优化性能,Aacini的解决方案是第一个突然出现在我脑海中的想法。但是如果你真的想要最好的性能,你应该完全消除循环中的环境变量扩展。这可以通过切换到直接迭代符号(数字)的简单FOR来轻松实现
您声明希望控制每个字符串打印的最小和最大位数。这可以通过添加一些IF语句轻松完成。但IF需要时间来执行。最好将整个嵌套循环集动态构建为单个代码字符串。这样,主循环总是经过优化,以减少amo可能的工作量
这是我的优化版本。我任意将最大位数限制为5,正如您在原始代码中所做的那样。这可以很容易地进行扩展,尽管最终代码必须在8192个字符以内。理论上,它支持最多68个数字的字符串,但如果人类仍然存在于这个星球上,当这个程序m完成了!见鬼,那时地球可能早就消失了
:: %1 = min number of digits, between 1 and 5. Default = 1
:: %2 = max number of digits, between 1 and 5. Default = 5
::
@echo off
setlocal enableDelayedExpansion
:: Configuration
set /a "min=1, max=5"
if "%~1" neq "" set "min=%~1"
if "%~2" neq "" set "max=%~2"
if %min% lss 1 set min=1
if %max% lss 1 set min=1
if %min% gtr 5 set min=5
if %max% gtr 5 set max=5
:: Define symbols to be iterated by simple FOR
:: Use of simple FOR improves performance by eliminating environment variable
:: dereferencing within main loops.
set "chars=a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 0"
:: Dynamically build code as a "macro"
:: This enables configuration of number of digits printed, yet improves performance
:: by avoiding IF within main loops.
set "code="
set "digits="
for /l %%N in (1 1 %max%) do (
set "code=!code!for %%%%N in (%chars%) do "
set "digits=!digits!%%%%N"
if %%N geq %min% (
set "code=!code!echo(!digits!"
if %%N lss %max% set "code=!code!&"
)
)
:: Show the resultant code
echo !code!
:: Execute the code
>data.txt (%code%)
使用最小值1和最大值4,在我的计算机上完成需要35秒。将最大值增加到5至少需要21分钟。相比之下,从Aacini的代码中删除内部循环,修复问题上的回显,在我的计算机上生成长度为1到4的所有字符串需要85秒
下面是由min=2,max=3生成的代码,只需1秒即可完成。我特意使用引号块而不是代码块来避免过度的水平滚动
对于%1 in(a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 0)对于%2 in(a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 8 9 0)执行回显(%1%2)对于%3 in(a b c d e f h i j l m n o p q r s t u w y z 1 2 3 4 5 6 8 9 0)执行回显(%1%2%3
请注意,上面是展开
%code%
后的代码,因此%1
表示FOR变量,而不是第一个批处理脚本参数。我找到了ECHO OFF有时不起作用的原因-当您打印两位数字符串时,您最终会达到“开”,这会在上产生回声。很明显,这是一个问题
你应该使用一种安全的ECHO格式,最好的是ECHO(
)-它看起来很奇怪,但很有效
想到优化性能,Aacini的解决方案是第一个突然出现在我脑海中的想法。但是如果你真的想要最好的性能,你应该完全消除循环中的环境变量扩展。这可以通过切换到直接迭代符号(数字)的简单FOR来轻松实现
你说你想控制整个世界