如何定义何时停止和开始 for /f 批量循环

Posted

技术标签:

【中文标题】如何定义何时停止和开始 for /f 批量循环【英文标题】:How to define when to stop and start for /f loop in batch 【发布时间】:2021-09-02 05:54:02 【问题描述】:

所以我想弄清楚是否有办法定义何时停止和启动for /f loop 例如,让它只读 37 行然后停止。但同时我可以设置它何时开始阅读。所以不一定是前 37 行。但以文档中间的一些 37 行为例。 我正在使用以下代码

for /f "tokens=1,* delims==" %%G in ('%SystemRoot%\System32\find.exe "="
0^<"decryption_key.txt"') do set "%%G=%%H"

读取文档并将文本拆分为“=”符号两侧的变量和值。 文本文档如下所示:

Date encrypted: 16/06/2021 Time: 23.51.19,70
key_a='
key_b=..:.
key_c=''::
key_d=*:::
key_e='''
key_f=::''
key_g=:***
key_h=**
key_i=....
key_j=':::
key_k=..
key_l=.
key_m=''''
key_n=**::
key_o=:::.
key_p=:::'
key_q=*
key_r=.::.
key_s='':'
key_t=***:
key_u=:..:
key_v=::..
key_w=:'''
key_x=::**
key_y=:::*
key_z=...
key_zero=...:
key_one=''
key_two=..::
key_three=.:::
key_four=''':
key_five=.:..
key_six=::::
key_seven=:...
key_eight=****
key_nine=***
Date encrypted: 17/06/2021 Time:  0.14.31,56
key_a=....
key_b=***:
key_c=::''
key_d=..:.
key_e=**::
key_f=...:
key_g=':::
key_h=:...
key_i=***
key_j=''::
key_k='''
key_l=.::.
key_m=*:::
key_n=:::*
key_o=**
key_p=::::
key_q=...
key_r=:::'
key_s=*
key_t=:::.
key_u='
key_v='':'
key_w=''
key_x=..::
key_y=::..
key_z=****
key_zero=:***
key_one=..
key_two=''''
key_three=:'''
key_four=.:::
key_five=.:..
key_six=''':
key_seven=:..:
key_eight=.
key_nine=::**

但是我需要能够定义它何时停止读取文档,这样如果在该文档中为同一变量定义了更多值,它就不会覆盖以前的值。同时我需要能够定义它何时开始读取,以防我只希望它使用较低的值。所以基本上。如何让它只读取 37 行然后停止,并在该文档中的“X”行之后开始?

【问题讨论】:

您的文件与我提供该代码的文件的布局不匹配,该文件使用格式KeyName==KeyValue。对于您现在提供的布局,只有一个 = 字符,该示例代码过于复杂!当你写一个问题对那些试图帮助你的人完全诚实时会容易得多,这样他们不仅可以提供解决方案,而且可以使用健壮和高效的代码来做到这一点。对于这个特定的问题,我想更多地了解您的输入文本文件,为什么要这样格式化/创建它,因为更改内容可以完全解决您的问题。 文本文件是由另一个批处理文件创建的,每次我打开另一个批处理文件时,它都会为该文档中的 36 个字母和数字添加新的加密。所以我试图在另一个批处理文件中定义它应该使用哪个特定和唯一的频率来解密文本 也可以修改那个批处理文件来改变输出!您实际上是在试图让我们解决您因设计不佳而导致的问题,而不是修复设计。虽然我确信我们可以尝试解决您创建的问题,但如果您退后一步并尝试创建更简单的东西会更好,而不是不断解决不需要存在的相对复杂的情况首先。顺便说一句,您向该文件写入了多少组不同的密钥对,我的意思是您显示的这两个密钥对之间只有 23 分钟。 这是整个脚本的链接。我不完全确定你的意思 tbh link 那有什么办法可以给你看剧本吗?它超过 6800 行,包含大约 170000 个字符(哈哈)。所以我不能在这里发送它 【参考方案1】:

我找到了解决问题的方法,这里有一小部分代码向您展示我是如何解决问题的

:sdeckeya
title Koral Coder mega menu (Scanning key frequencies...)
for /f "tokens=1,* delims==" %%G in ('%SystemRoot%\System32\find.exe "="
0^<"decryption_key.txt"') do set "%%G=%%H" & set /a break=%loopcount%+35 & goto read_decryption_key
:sdec
title Koral Coder mega menu (Awaiting input...)
color 7
set loopcount=0
set "ukey="
set "key_a="
set "break="
cls
echo Please insert the decryption key file to the following directory:
echo %~dp0
echo Make sure that the name of the decryption key is "decryption_key.txt"
echo.
echo Which decryption key within the "decryption_key.txt" file would you like to use?
echo Each new key is defined by a date and time of creation. The first key is "1" the next is "2" and so on.
echo.
echo Example:
echo (THIS IS THE BEGINNING OF THE DOCUMENT)
echo Date encrypted: 17/06/2021 Time: 16.55.53,20 ^<^<^<^<^<^<^<^<^< This is key 1 (for each time a new "Date ecnrypted:" occurs, is a new key 1 number higher than the previous)
echo key_a=xxxx
echo key_b=xxxx
echo ...
echo Date encrypted: 17/06/2021 Time: 16.55.53,20 ^<^<^<^<^<^<^<^<^< This is key 2 (for each time a new "Date ecnrypted:" occurs, is a new key 1 number higher than the previous)
echo key_a=xxxx
echo key_b=xxxx
echo ...
echo and so on
echo.
echo Type "exit" to go back to the main menu
echo.
set /p ukey= KeyNumber: 
if not defined ukey goto sdec
if "%ukey%"==" " goto sdec
if %ukey%==exit goto unlock
if %ukey%==1 (
set /a loopcount=%loopcount%+%ukey%
goto sdeckeya
)
if %ukey% NEQ 1 set /a loopcount=%loopcount%+36
if %ukey% NEQ 1 set /a loopcount=%loopcount%*%ukey%
if %ukey% NEQ 1 set /a loopcount=%loopcount%-36
if %ukey% NEQ 1 set /a break=%ukey%*36
if %loopcount%==-36 goto sdecfail 
goto read_decryption_key
:sdecfail
title Koral Coder mega menu (ERROR - no letters)
cls
color 4
echo ERROR!
echo Please only use numbers to define which decryption key you want to use
echo.
pause
goto sdec
:read_decryption_key
title Koral Coder mega menu (Scanning key frequencies...)
cls
color 7
if %loopcount% NEQ %break% (
for /f "tokens=1,* skip=%loopcount% delims==" %%G in ('%SystemRoot%\System32\find.exe "="
0^<"decryption_key.txt"') do set "%%G=%%H" & goto breakcheck
) else goto filecheck
:breakcheck
set /a loopcount=%loopcount%+1
echo Loading key frequencies please wait...
echo %loopcount%
goto read_decryption_key
:filecheck

【讨论】:

以上是关于如何定义何时停止和开始 for /f 批量循环的主要内容,如果未能解决你的问题,请参考以下文章

什么是并行 for 循环,应该如何/何时使用它?

JavaScript 中的反向 while 循环如何知道何时停止?

JAVA中的for循环运行一次后如何停止,但是还可以在输入数字后继续运行?

Python中如何实现点击按键A开始循环,点击按键B停止循环?

如何强制结束 for 循环的迭代(不停止 for 循环)?

为什么当我开始输入更改服务类型或'4'时,循环会停止????以及其他一些问题