写入文件时的回显输出

时间:2015-10-21 19:26:33

标签: batch-file random echo

当我使用此代码从我的列表中选择一个字符时,它工作得很好但是当我使用以下代码将其写入文件时:

echo %pwd%>>pwd.gen

有时会在生成的字符串中间随机放置“ECHO”这个词。这是一个例子:

  

jUrkunjcxC

     

ecRECHOsI5w0T

     

DmJfat13fT

     

UWXOysW7Gb

     

pPmS7138Ve

     

nFkh32ECHOJd1

你可以看到它出现在第2行和第6行。这只发生在大约20%的时间。

以下是代码:

@echo off
title Password Generator
color f0
:firstRun
set /a cnt=0
cls
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set /p Len=What length should the password be?
set /a Len=%Len%-1
cls
set /p Amt=How many would you like to generate?
cls
goto start

:start
set alfanum=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
set pwd=
FOR /L %%b IN (0, 1, %Len%) DO (
SET /A rnd_num=!RANDOM! * 62 / 32768 + 1
for /F %%c in ('echo %%alfanum:~!rnd_num!^,1%%') do set pwd=!pwd!%%c
)

echo %pwd%>> pwd.gen

set /a cnt=%cnt%+1
if %cnt%==%Amt% goto end
goto start

:end
cls
echo Done!
echo Results have been saved to "pwd.gen"
echo.
choice /c YN /m "Restart?"
if %errorlevel%==1 goto firstRun

2 个答案:

答案 0 :(得分:1)

这是几件事的组合。虽然我并不完全清楚整个事情的内部运作,但我知道是什么导致它以及如何解决它。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789长度为62个字符。 但是,批处理中的子串从0开始,因此有效数字从0到61.无论出于何种原因,索引超出范围与^ 'echo %%alfanum:~!rnd_num!^,1%%'相结合导致显示单词ECHO

要解决这个问题,在计算rnd_num时,不要添加1。

SET /A rnd_num=!RANDOM! * 62 / 32768

答案 1 :(得分:1)

:start
set alfanum=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
set pwd=
FOR /L %%b IN (0, 1, %Len%) DO (
SET /A rnd_num=!RANDOM! * 62 / 32768 + 1
for /F %%c in ('echo %%alfanum:~!rnd_num!^,1%%') do set pwd=!pwd!%%c
)
  • alfanum是26 + 26 + 10 = 62个字符。
  • RANDOM给出0-32,767
  • 的随机数
  • 当RANDOM高于32240时,rnd_num设置为62
    • 字符串索引从0开始,而不是1
    • for /F %%c命令索引alfanum:~62,1~,这是一个空字符串
    • 它调用echo没有参数,打印ECHO is on.而不是返回单个字符
    • for /F默认使用空格分隔符拆分字符串,用于分隔第一个单词
    • %%c变为ECHO
    • 您将ECHO添加到密码中。