Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows &引用;“回声”;由于某种原因出现在产生随机字符的中间?_Windows_Batch File_Cmd - Fatal编程技术网

Windows &引用;“回声”;由于某种原因出现在产生随机字符的中间?

Windows &引用;“回声”;由于某种原因出现在产生随机字符的中间?,windows,batch-file,cmd,Windows,Batch File,Cmd,我的代码是: @echo off pause setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION set alfanum=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 :a timeout /t 1 set generator= FOR /L %%b IN (0, 1, 5) DO ( SET /A rnd_num=!RANDOM! * 62 / 32768 + 1 fo

我的代码是:

@echo off
pause
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set alfanum=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
:a
timeout /t 1
set generator=
FOR /L %%b IN (0, 1, 5) DO (
SET /A rnd_num=!RANDOM! * 62 / 32768 + 1
for /F %%c in ('echo %%alfanum:~!rnd_num!^,1%%') do set generator=!generator!%%c
)

echo %generator%
goto generator

稍有破损,因为有时在生成过程中出现“回音”。例如:

vMECHO8ECHOE <<
DQTGv0
aECx5i
lLECHOO3H <<
cOd4ECHOg <<
6950pC

vmecho8echoo子字符串修改为0索引。确保使用的索引等于字符数-1

FOR/L%%n IN(0,1,5)Do FOR/F“delims=“%%c IN”(“SET/A”\u r=!RANDOM!%%62”)Do(
设置“generator=!generator!!alfanum:~%%c,1!”
)

集合/A
命令行中删除
+1
,您就可以:

set/A“rnd_num=!RANDOM!*62/32768”
可简化为:

set/A“rnd_num=!RANDOM!%%62”
实际上,您可以指向
中的字符串!阿尔法纳姆
,因为子字符串扩展的位置索引是从零开始的,这意味着
0
指向62个字符字符串中的第一个字符,
61
指向最后一个字符。当前代码将
62
作为可能的最大随机数返回,因此子字符串扩展将返回一个空字符串,这使得
for/F
循环输出
echo中的
echo命令为{on | off},由于
for/F
的默认令牌字符串
tokens=1
,导致结果
ECHO

无论如何,
for/F
循环是不必要的,只需将其替换为以下行:

rem/*标准的`for`循环确保了`!rnd_num!`扩大
延迟子字符串扩展`之前的rem!阿尔法纳姆:~…!`发生:*/
对于(!rnd_num!)中的%%a,请设置“generator=!generator!!alfanum:~%a,1!”
或(较慢):

rem/*call命令确保`%alfanum:~…%的子字符串`
rem在延迟扩展`后扩展!rnd_num!`发生:*/
调用集“生成器=!生成器!%%alfanum:~!rnd_num!,1%%”

集合/A
命令行中删除
+1
,您会没事的(在
!alfanum!
中指向字符串)。无论如何,
for/F
循环是不必要的,只需将其替换为(!rnd_num!)中%%a的行
,并设置“generator=!generator!!alfanum:~%a,1!”
,或
调用集“generator=!generator!%%alfanum:~!rnd_num!,1%%”
(较慢)…您甚至不需要分配到
\u r
,只需保留表达式
!随机!%%62
,然后将结果输出到控制台。值得一提的是,这是因为
set/A
for/F
在命令提示上下文中执行,而批处理上下文中
set/A
不返回任何内容。由于每个
for/L
循环迭代调用新的命令提示符实例,因此此方法比避免
for/F
慢。但我还是喜欢这种方法!