如何调试我的批处理脚本给出意外结果的原因?

时间:2017-12-15 02:06:29

标签: batch-file set

此代码无效。这应该生成一个包含随机特征和背景故事的名称。我不知道为什么它不起作用。

@echo off
:top
echo ----------------------------------------
echo   random  name genorator
echo ----------------------------------------
echo       1   genorate name
echo       2   add more info
echo       3   what is this
set /p rand=
if %rand% == 1 goto first
if %rand% == 2 goto 2
if %rand% == 3 goto 3
:first
if %random% == 0 set fname=tony
if %random% == 1 set fname=pamb
if %random% == 2 set fname=ape
if %random% == 3 set fname=bob
if %random% == 4 set fname=jonathan
if %random% == 5 set fname=dave
if %random% == 6 set fname=avery
if %random% == 7 set fname=felica
if %random% == 8 set fname=herman
if %random% == 9 set fname=elana
cls
echo your new name is %fname%
pause
:2
exit
:3
exit

当我按1时,它说“你的新名字是”。

1 个答案:

答案 0 :(得分:3)

输入:

echo %random%

看看它给你的东西。它很可能会给你一个高于9的数字。例如:

c:\pax> echo %random%
1644

现在想想在这种情况下你的名字会被设定为什么。因为if条件都不是真的,所以它根本不会被更改,因此在运行脚本之前它将保持为

如果您想获得0到9范围内的随机数并根据该名称设置名称,您可以使用:

set /a "num = %random% %% 10"
if %num% == 0 set fname=tony
rem ... and so on

另请注意,如果您的名单可能会变长,您可能希望使用cmd (a)等更高级的功能,例如"阵列&#34 ;.例如,以下脚本显示了如何执行此操作:

@echo off
setlocal enableextensions enabledelayedexpansion

rem This is the list of names to use.

set namelist=tony pam george bob john dave avery felica herman
set namelist=!namelist! elana pax guido henry fortescue

rem Construct the array, consisting of a base name with "_<index>" suffix.

set /a "count = 0"
for %%n in (!namelist!) do (
    set fname_!count!=%%n
    set /a "count = count + 1"
)

rem Use modulo to select random index.

set /a "idx = !random! %% count"

rem Use double indirection to get actual name.

for /f %%a in ('echo fname_!idx!') do echo !%%a!

endlocal

(a)是的,我知道很难想到cmdadvanced中使用的词语相同的句子,但它确实一些有用的,如果鲜为人知的特征: - )