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
Batch file {BATCH}随机字符串选择器始终拾取最后一个字符串_Batch File - Fatal编程技术网

Batch file {BATCH}随机字符串选择器始终拾取最后一个字符串

Batch file {BATCH}随机字符串选择器始终拾取最后一个字符串,batch-file,Batch File,我正在创建一个批处理文件,该文件将从姓名列表中生成一个虚假的个人资料,并生成随机的出生日期。我记下了出生日期,但当我尝试运行此代码时,%FName%的输出总是(Zachary)我文本文件的最后一行,%LName%总是等于另一个文件的最后一行Dora。我不知道为什么会这样。我看了这个,但似乎找不到问题所在。姓名列表是一个简单的列表: Bob Billy Jacob Andrew Vince 代码如下: @echo off setlocal ENABLEEXTENSIONS ENABLEDELAY

我正在创建一个批处理文件,该文件将从姓名列表中生成一个虚假的个人资料,并生成随机的出生日期。我记下了出生日期,但当我尝试运行此代码时,%FName%的输出总是(Zachary)我文本文件的最后一行,%LName%总是等于另一个文件的最后一行Dora。我不知道为什么会这样。我看了这个,但似乎找不到问题所在。姓名列表是一个简单的列表:

Bob
Billy
Jacob
Andrew
Vince
代码如下:

@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
:start
:FName
cls
set "lines=0" 
for /f "tokens=*" %%a in (GivenNames.txt) do set /a "lines+=1" 
set /a "skip=%random% %% lines" 
if %skip% lss 1 (set "skip=") else (set "skip=skip=%skip%") 
for /f "%skip% tokens=*" %%a in (GivenNames.txt) do set "FName=%%a"
goto LName

:LName
cls
set "lines=0" 
for /f "tokens=*" %%a in (Surnames.txt) do set /a "lines+=1" 
set /a "skip=%random% %% lines" 
if %skip% lss 1 (set "skip=") else (set "skip=skip=%skip%") 
for /f "%skip% tokens=*" %%a in (Surnames.txt) do set "LName=%%a"
goto MName

:MNAme
cls
set alfanum=ABCDEFGHIJKLMNOPQRSTUVWXYZ
set middle=
FOR /L %%b IN (0, 1, 16) DO (
SET /A rnd_num=!RANDOM! * 26 / 32768 + 1
for /F %%c in ('echo %%alfanum:~!rnd_num!^,1%%') do set MName=!pwd!%%c
)

goto compilename

:compilename
cls
set fullname=%FName% %MName%. %LName%
cls
echo %fullname%
pause>nul
goto start
示例输出:

Zachary I. Dora
我需要的是:

"Random First Name From List" "Random Letter". "Random Last Name From List"
提前感谢,, -扎卡里

%%在跳过第一行(skipvalue)后,将依次为文件中的每行值分配

因此,变量将依次从
%%a
中分配每个值,因此将以分配的最后一个值(文件中的最后一个)结束

&分隔了两个单独的命令,因此分配到第一行(跳过数字后),分配完成后,执行传递到标签,因此在循环终止时不再进行分配

%%在跳过第一行(skipvalue)后,将依次为文件中的每行值分配

因此,变量将依次从
%%a
中分配每个值,因此将以分配的最后一个值(文件中的最后一个)结束


&分隔了两个单独的命令,因此分配到第一行(跳过数字后),分配完成后,执行传递到标签,因此在循环终止时不会再进行分配。

for
始终在文件中读取时,它总是从某个地方开始,一直读到最后。这就是为什么FName和LName总是文本文件的最后一行

通过读取前几行并将其存储在虚拟变量中,可以操纵
set/p
来读取文本文件的特定行

:FName
cls
set "lines=0" 
for /f "tokens=*" %%a in (GivenNames.txt) do set /a "lines+=1" 
set /a "skip=!random! %% lines"
(
    for /l %%B in (0,1,!skip!) do set /p ".="
    set /p "FName="
)<GivenNames.txt
goto LName

:LName
cls
set "lines=0" 
for /f "tokens=*" %%a in (Surnames.txt) do set /a "lines+=1" 
set /a "skip=!random! %% lines"
(
    for /l %%B in (0,1,!skip!) do set /p ".="
    set /p "LName="
)<Surnames.txt
goto MName
:FName
cls
设置“行=0”
对于(GivenNames.txt)中的/f“tokens=*”%%a,请设置/a“行+=1”
设置/a“跳过=!随机!%%行”
(
对于(0,1,!skip!)中的/l%%B,请设置/p。“”
设置/p“FName=”

) 当
for
总是读取文件时,它总是从某个地方开始并一直读取,直到到达末尾。这就是为什么FName和LName总是文本文件的最后一行

通过读取前几行并将其存储在虚拟变量中,可以操纵
set/p
来读取文本文件的特定行

:FName
cls
set "lines=0" 
for /f "tokens=*" %%a in (GivenNames.txt) do set /a "lines+=1" 
set /a "skip=!random! %% lines"
(
    for /l %%B in (0,1,!skip!) do set /p ".="
    set /p "FName="
)<GivenNames.txt
goto LName

:LName
cls
set "lines=0" 
for /f "tokens=*" %%a in (Surnames.txt) do set /a "lines+=1" 
set /a "skip=!random! %% lines"
(
    for /l %%B in (0,1,!skip!) do set /p ".="
    set /p "LName="
)<Surnames.txt
goto MName
:FName
cls
设置“行=0”
对于(GivenNames.txt)中的/f“tokens=*”%%a,请设置/a“行+=1”
设置/a“跳过=!随机!%%行”
(
对于(0,1,!skip!)中的/l%%B,请设置/p。“”
设置/p“FName=”

) 我可以给你建议一个不同的方法吗?您可以使用数组在第一个循环中的变量中加载文件的行,因此随机名称的选择不需要再次读取文件。在这个问题中,这两种方法的工作原理基本相同,但是如果需要生成大量随机名称,那么处理数组元素的速度将比重复读取文件快得多

@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
:start

:FName
cls
set "lines=0" 
for /f "tokens=*" %%a in (GivenNames.txt) do (
   set "name[!lines!]=%%a"
   set /a "lines+=1"
)
set /a "skip=!random! %% lines"
set "FName=!name[%skip%]!

:LName
set "lines=0" 
for /f "tokens=*" %%a in (Surnames.txt) do (
   set "name[!lines!]=%%a"
   set /a "lines+=1" 
)
set /a "skip=!random! %% lines"
set "LName=!name[%skip%]!

:MNAme
set alfanum=ABCDEFGHIJKLMNOPQRSTUVWXYZ
set /A rnd_num=%RANDOM% * 26 / 32768
set "MName=!alfanum:~%rnd_num%,1!"

:compilename
set fullname=%FName% %MName%. %LName%
echo %fullname%

有关批处理文件中阵列管理的更多详细信息,请参阅。

我可以为您推荐一种不同的方法吗?您可以使用数组在第一个循环中的变量中加载文件的行,因此随机名称的选择不需要再次读取文件。在这个问题中,这两种方法的工作原理基本相同,但是如果需要生成大量随机名称,那么处理数组元素的速度将比重复读取文件快得多

@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
:start

:FName
cls
set "lines=0" 
for /f "tokens=*" %%a in (GivenNames.txt) do (
   set "name[!lines!]=%%a"
   set /a "lines+=1"
)
set /a "skip=!random! %% lines"
set "FName=!name[%skip%]!

:LName
set "lines=0" 
for /f "tokens=*" %%a in (Surnames.txt) do (
   set "name[!lines!]=%%a"
   set /a "lines+=1" 
)
set /a "skip=!random! %% lines"
set "LName=!name[%skip%]!

:MNAme
set alfanum=ABCDEFGHIJKLMNOPQRSTUVWXYZ
set /A rnd_num=%RANDOM% * 26 / 32768
set "MName=!alfanum:~%rnd_num%,1!"

:compilename
set fullname=%FName% %MName%. %LName%
echo %fullname%
有关批处理文件中阵列管理的更多详细信息,请参阅