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