我正致力于创建一个批处理文件,该文件将从名单列表中生成虚假的个人资料并生成随机的出生日期。我有出生日期,但是当我尝试运行此代码时,%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"
提前致谢, -Zackary
答案 0 :(得分:0)
for /f "%skip% tokens=*" %%a in (GivenNames.txt) do set "FName=%%a"&goto LName
在跳过第一行(跳过值)后, %%a
将依次从文件中分配每个行值。
因此,变量将依次从%%a
分配给每个值,因此最终将分配最后一个值(最后一个文件)
& 分隔两个单独的命令,因此分配到第一行(跳过数字后)并进行了赋值,执行被传递给标签,因此没有进一步的赋值是循环结束后制作。
答案 1 :(得分:0)
当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
答案 2 :(得分:0)
我可以建议你采用不同的方法吗?您可以使用数组在第一个循环中的变量中加载文件的行,因此选择随机名称不需要再次读取该文件。在这个问题中,这两种方法的工作原理基本相同,但如果需要生成大量的随机名称,则数组元素的处理速度将比重复读取文件快得多。
@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%
有关批处理文件中阵列管理的更多详细信息,请参阅this post。