在执行" call:loop"之后退出批处理文件

时间:2018-02-15 13:10:07

标签: batch-file cmd

我有一些(坏)代码用于加密文本,但是为了能够解密它需要在数字之间有一些东西。我想在数字之间插入随机字母,这样看起来不那么明显,这就是我所要做的:

@echo off
setlocal enableDelayedExpansion


set /p code=Text:
set chars=0123456789abcdefghijklmnopqrstuvwxyz


for /L %%N in (10 1 36) do (

for /F %%C in ("!chars:~%%N,1!") do (
Set _Alphanumeric=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Set _count=0
set _RNDLen=%random%
Set /A _RNDLen=_RNDLen%%4
If !_count! leq %_RNDLen% call :loop


set "code=!code:%%C=-%%N!"

)

)

echo !code!
echo !_str!
pause

:loop
Set /a _count+=1
set _RND=%random%
Set /A _RND=_RND%%51
SET _str=!_str!!_Alphanumeric:~%_RND%,1!
EXIT /B %ERRORLEVEL%

问题是程序在给出任何输出之前就退出了,即使我删除了exit / b语句。谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

我不知道您为算法使用的原则是什么,但从根本上说,您需要了解delayed expansion

当解析外部循环for %%N时,每个%var%都会被当时变量的内容替换,因此

set _RNDLen=%random%

If !_count! leq %_RNDLen% call :loop

重播
set _RNDLen=a specific random number

If !_count! leq call :loop

此处的第一行每次都会将_rndlen设置为相同的编号(对于ny运行),并且由于_rndlen在循环开始时未定义,因此它将会由 nothing 替换,因此if语句的语法错误,因此cmd对象会显示消息。

您可以使用调用了!random!的{​​{1}}每次选择一个重新随机数,并且您需要delayed expansion来访问已更改 !_rndlen!的值(从 nothing 的原始值更改为某个随机值,然后是mod-4' d)

就个人而言,我在(外部)循环外部分配_rndlen ,因为它的值不会因循环操作而改变。

当然,你知道当你在_alphanumeric之后点击 Return 时,pause代码将在例程终止之前执行(通过流程)并且你应该包括

loop

goto :eof 之后跳过最后一次操作。