Batch file 写入文件时回显输出

Batch file 写入文件时回显输出,batch-file,random,echo,Batch File,Random,Echo,当我使用此代码从列表中选择一个字符时,它工作正常,但当我使用以下命令将其写入文件时: echo %pwd%>>pwd.gen 有时会在生成的字符串中间随机放置“ECHO”一词。以下是一个例子: jUrkunjcxC ecRECHOsI5w0T DmJfat13fT UWXOysW7Gb pPmS7138Ve nFkh32ECHOJd1 您可以看到它出现在第2行和第6行中。这只发生在大约20%的时间里 代码如下: @echo off title Password Generator

当我使用此代码从列表中选择一个字符时,它工作正常,但当我使用以下命令将其写入文件时:

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

这是两件事的结合。虽然我不完全清楚整个事情的内部运作,但我知道是什么导致了它,以及如何修复它

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

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

SET /A rnd_num=!RANDOM! * 62 / 32768
  • alfanum的长度为26+26+10=62个字符
  • RANDOM给出0-32767之间的随机数
  • 当RANDOM高于32240时,
    rnd_num
    设置为62
    • 字符串索引从0开始,而不是从1开始
    • for
      /F%%c
      命令索引
      alfanum:~62,1~
      ,这是一个空字符串
    • 它调用
      echo
      ,不带任何参数,该参数打印
      echo处于启用状态。
      而不是返回单个字符
    • for/F
      默认使用空格分隔符分割字符串,分隔出第一个单词
    • %%c
      变成
      ECHO
    • 您将
      ECHO
      添加到密码中

看看这个:我很感谢您对解决方案的解释!代码现在可以正常工作了!谢谢@tessellingheckler的解释非常全面,但你的解释更容易理解!谢谢你的轻松修复!
: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
)