我有一些(坏)代码用于加密文本,但是为了能够解密它需要在数字之间有一些东西。我想在数字之间插入随机字母,这样看起来不那么明显,这就是我所要做的:
@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语句。谢谢你的帮助
答案 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
之后跳过最后一次操作。