Batch file 此时转到批处理文件是意外的

Batch file 此时转到批处理文件是意外的,batch-file,Batch File,请使用下面的脚本作为参考。 嗯,我正在尝试进入编程,我正在创建我的批处理rpg,看看我是否能做到。。。不管怎么说,有点撞到墙了:我一直收到“goto在这个时候出人意料”的错误。错误如下:最初,在标签游戏(:game)之后,输入系统工作,但不正确(即,输入4并获得8的操作,输入8并没有获得任何结果,等等)。我改变了一些东西,但我不确定我改变了什么。。。在到达标签游戏时,导致“错误:此时goto是意外的”。我意识到我在错误的位置添加了括号,所以我再次更改了它(在%location%==1之后),所以

请使用下面的脚本作为参考。 嗯,我正在尝试进入编程,我正在创建我的批处理rpg,看看我是否能做到。。。不管怎么说,有点撞到墙了:我一直收到“goto在这个时候出人意料”的错误。错误如下:最初,在标签游戏(:game)之后,输入系统工作,但不正确(即,输入4并获得8的操作,输入8并没有获得任何结果,等等)。我改变了一些东西,但我不确定我改变了什么。。。在到达标签游戏时,导致“错误:此时goto是意外的”。我意识到我在错误的位置添加了括号,所以我再次更改了它(在%location%==1之后),所以我更正了它-现在,在接受输入“items”(set/p items=“>”)后,它显示了相同的错误,而不显示后台故事。有趣的是,如果我删除'set/p towna=“>”'之后的所有“if”参数,程序将结束(没有错误,只是结束),而不会在“items”之后显示后台故事、镇上可能的操作,或者允许用户输入变量%towna%

下面是脚本:

@echo off
title=Role Playing Game
cls
echo/
echo   #####     #####     ####     
echo   #    #    #    #   #
echo   #####     #####    #  ###
echo   #    #    #        #    #
echo   #     #   #         ####
echo/
echo/
pause
:menu
cls
echo MENU
echo Options:
echo Start New Game-------------1
echo Continue Previous Game-----2
echo About----------------------3
echo Quit-----------------------4
set /p a="> "
if %a%==1 goto new
if %a%==2 goto continue
if %a%==3 goto about
if %a%==4 exit
:new
cls
echo What is your name?
set /p name="> "
echo/
echo What is your race?
echo Human-----1
echo Dwarf-----2
echo Elf-------3
set /p race="> "
if %race%==1 (
set /a location=1
set /a agility=3
set /a strength=3
set /a magic=2
set /a stamina=0
)
if %race%==2 (
set /a location=2
set /a agility=0
set /a strength=6
set /a stamina=0
set /a magic=0
)
if %race%==3 (
set /a location=3
set /a strength=0
set /a agility=6
set /a magic=0
set /a stamina=0
)
echo/
echo What is your class?
echo Warrior------1
echo Assassin-----2
echo Wizard-------3
set /p class="> "
if %class%==1 (
set /a strength=%strength%+10
set /a stamina=10
set /a agility=%agility%+7
set /a magic=%magic%+0
)
if %class%==2 (
set /a strength=%strength%+7
set /a stamina=7
set /a agility=%agility%+10
set /a magic=%magic%+0
)
if %class%==3 (
set /a strength=%strength%+4
set /a stamina=5
set /a agility=%agility%+5
set /a magic=%magic%+10
)
echo/
echo What are your assets?
echo Monetary Wealth----------1
echo Arms and Armor-----------2
echo Potions and Trinkets-----3
set /p items="> "
set /a gold=100
set /a sword=1
set /a armor=1
set /a healthp=1
set /a focusp=0
set /a ragep=0
set /a trinket=0
if %items%==1 (
set /a gold=300
)
if %items%==2 (
set /a sword=3
set /a armor=3
)
if %items%==3 (
set /a healthp=5
set /a focusp=5
set /a ragep=5
set /a trinket=1
)
echo/
pause
cls
if %race%==1 (
if %class%==1 (
if %items%==1 (
echo For all of your life, you have been raised among humans on the WesterHam
echo plains. An aristocrat by birth, you longed for the thrill of combat and
echo apprenticed your-self to the service of an officer in the military, where you
echo became an excellent warrior. Now of age, you have decided to take your
echo inheritance and explore the world. Good luck, %name%.
)
if %items%==2 (
echo You come from a long line of noble warriors, descending of a race of pure
echo humans out of the WesterHam plains. While you were not always able to put
echo bread on the table, your family has an abundance of arms and armor. Now fully
echo grown, you set out, well equiped with family heirlooms in order to make a
echo better life for yourself. Good luck, %name%.
)
if %items%==3 (
echo Your family of humans comes out of the WesterHam plains, and has never
echo ventured out of this area. As a child, you were fascinated with the art of
echo magic, but were never able to grasp spellcasting and the like, and instead
echo took training as a warrior. But the fascination never died, and every bit of
echo money you earned as a child was spent buying potions and enchanted items. Now
echo grown, you have saved a small sum of money, in addition to several potions
echo you collected as a child. You set out to explore the world in search of a
echo magic art simple enough for you to grasp. Good luck, %name%.
)
)
if %class%==2 (
if %items%==1 (
echo In your early childhood, you were raised with the honor of your wealthy
echo human family of WesterHam. As you met adolescence, you rebeled and cast your 
echo lot with the assassins, allowing them to teach you their ways. Now of legal
echo age, you demand your inheritance so that you may set off and prove your loyalty
echo to the assassins guild. Good luck, %name%.
)
if %items%==2 (
echo As a child, you grew up in the human-populated plains of WesterHam. You were
echo orphaned at a young age, but the assassins guild took you in and taught you
echo their ways. From them, you have recieved a set of arms with which to do the
echo work of an assassin. Now completely trained, you begin to search the world,
echo offering your services to those that pay. Good luck, %name%.
)
if %items%==3 (
echo As a child, your upbringing was among humans in the plains of WesterHam. You
echo had a natural skill in alchemy, and began to produce potions of sorts, which
echo you would sell on the black market in hopes of bringing some income for your
echo poor family. In this style of trade, you were introduced to assassins from
echo time to time. In order to help sustain your family, you joined the assassins
echo guild in hopes of increasing income. Now armed with a collection of potions,
echo you set off to make a new life. Good luck, %name%.
)
)
if %class%==3 (
if %items%==1 (
echo As a child, you were brought up as a wealthy human inhabitant of the WesterHam
echo plains. You proved to be very intelligent as a child, so your parents sent you
echo off to school to learn the magic arts. You learned quickly, and advanced much
echo faster than any of the other students. You are now of age, and have taken your
echo inheritance to set off and see how you may use your skills. Good luck,
echo %name%.
)
if %items%==2 (
echo Ever since you were young, you displayed a strong curiosity and sense of
echo intelligence. However, you came from a family of warriors, proud humans of the
echo WesterHam plains. Weapons you had, but the money to learn magic you had not.
echo instead, you were "self taught" in the arts of magic, aquiring what you know
echo by close, constant observation of those that had mastered the art. Now of age,
echo you have inherited your set of arms, and been sent off to make your own way in
echo the world. Good luck, %name%.
)
if %items%==3 (
echo Since your days of young, you have been entirely enthrolled with wizardry.
echo Having been raised as an honorable human wizard on the plains of WesterHam, you
echo learned to produce potions that would complement your magical talents. Now that
echo you are of age, you set off into the world, determined to rely on use of your
echo magic talents and the aid of potions. Good luck, %name%.
)
)
)
if %race%==2 (
if %class%==1 (
if %items%==1 (
echo For all of your life, you have been raised among dwarves in the Morrowvale
echo mines. Wealthy by birth, you longed for the honors of battle and enlisted in
echo defensive forces of Morrowvale, where you soon proved your talents. Now of age,
echo you have taken your inheritance to explore the world beyond Marrowvale. Good
echo luck, %name%.
)
if %items%==2 (
echo You come from a long line of noble warriors, descending of a race of dwarvish
echo folk out of the Morrowvale mines. While you were not always able to put bread 
echo on the table, your family has an abundance of arms and armor. Now fully grown,
echo you set out, well equiped with family heirlooms in order to make a better life
echo for yourself. Good luck, %name%.
)
if %items%==3 (
echo Your family of dwarves comes out of the Morrowvale mines, and has never
echo ventured out of this area. As a child, you were fascinated with the art of
echo magic, but were never able to grasp spellcasting and the like, and instead
echo took training as a warrior. But the fascination never died, and every bit of
echo money you earned as a child was spent buying potions and enchanted items. Now
echo grown, you have saved a small sum of money, in addition to several potions
echo you collected as a child. You set out to explore the world in search of a
echo magic art simple enough for you to grasp. Good luck, %name%.
)
)
if %class%==2 (
if %items%==1 (
echo In your early childhood, you were raised with the honor of your wealthy
echo family of dwarves in Morrowvale. As you met adolescence, youre good natured 
echo sense of adventure led you mistakenly to the assassins guild, where you learned
echo their ways. Now of age, you recieve your inheritance so that you may set off to
echo explore the world. Good luck, %name%.
)
if %items%==2 (
echo As a child, you grew up in the dwarf-populated mines of Morrowvale. You were
echo orphaned at a young age, but the assassins guild took you in and taught you
echo their ways. From them, you have recieved a set of arms with which to do the
echo work of your training. Now completely trained, you begin to search the world,
echo offering your services in the name of justice. Good luck, %name%.
)
if %items%==3 (
echo As a child, your upbringing was among dwarves in the mines of Morrowvale. You
echo "tinkered" some in alchemy, and began to produce potions of sorts, which you
echo would sell on the black market in hopes of bringing some income for your poor
echo family. In this style of trade, you were introduced to assassins from time to
echo time. In curiosity you joined the assassins guild. Now armed with a collection
echo of potions, you set off to explore the world. Good luck, %name%.
)
)
if %class%==3 (
if %items%==1 (
echo As a child, you were brought up as a well off dwarf of the Morrowvale mines.
echo You proved to be very intelligent as a child, so your parents sent you off to
echo school to learn the magic arts. You learned quickly, and advanced much faster
echo faster than any of the other dwarves. You are now of age, and have taken your
echo inheritance to set off and see how you may use your skills. Good luck,
echo %name%.
)
if %items%==2 (
echo Ever since you were young, you displayed a strong curiosity and sense of
echo intelligence. However, you came from a family of warriors, proud dwarves of
echo the Morrowvale mines. Arms you had, but the money to learn magic you had not.
echo instead, you were "self taught" in the arts of magic, aquiring what you know
echo by close, constant observation of elders who had mastered the art. Now of age,
echo you have inherited your set of arms, and been sent off to make your own way in
echo the world. Good luck, %name%.
)
if %items%==3 (
echo Since your days of young, you have been consumed with wizardry. Having been
echo raised as a witty dwarfish wizard on the mines of Morrowvale, you learned to
echo produce potions that would complement your magical talents. Now that you are of
echo age, you set off into the world, determined to rely on use of your magic talent
echo and the aid of potions. Good luck, %name%.
)
)
)
if %race%==3 (
if %class%==1 (
if %items%==1 (
echo For all of your life, you have been raised among elves in the Dalewood forests.
echo An aristocrat by birth, you wished to serve your people in the armed forces,
echo and quickly proved yourself among peers and superiors. Now of age, you have
echo a generous inheritance and skills in combat. You set off in conquest for the 
echo elvish people. Good luck, %name%.
)
if %items%==2 (
echo You come from a long line of noble warriors, descending of a race of pure
echo elves out of the Dalewood forests. While you were not always able to put bread
echo on the table, your family has an abundance of arms and armor. Now fully grown,
echo you set out, well equiped with family heirlooms in order to make a better life
echo for yourself. Good luck, %name%.
)
if %items%==3 (
echo Your family of elves comes out of the Dalewood forests, and has never ventured
echo out of this area. As a child, you were fascinated with the art of magic, but
echo were never able to grasp spellcasting and the like, and instead took training
echo as a warrior. But the fascination never died, and every bit of coin you earned
echo as a child was spent buying potions and enchanted items. Now grown, you have
echo saved a small sum of money, in addition to several potions you collected as a
echo child. You set out to explore the world in search of a magic art simple enough
echo for you to grasp. Good luck, %name%.
)
)
if %class%==2 (
if %items%==1 (
echo In your early childhood, you were raised with the honor of your wealthy elvish
echo family of Dalewood. As you met adolescence, you chose the honorable path of a 
echo royal assassin, being taught the ways of a fearless shadow on the battlefield.
echo As you are now of age, you aquire your inheritance so that you may set off and
echo prove your loyalty to elf-kind. Good luck, %name%.
)
if %items%==2 (
echo As a child, you grew up in the elf-populated forests of Dalewood. You were
echo chose your destiny at a young age, to be an elite assassin for the elvish army.
echo From them, you have recieved a set of arms with which to do the work of an
echo assassin. Now completely trained, you begin to search the world, using your
echo assets in the name of elf-kind. Good luck, %name%.
)
if %items%==3 (
echo As a child, your upbringing was among elves in the forests of Dalewood. You
echo had a natural skill in alchemy, producing fine elvish potions, which you would
echo sell for the commision of the elite elvish assassins. This introduction to the
echo assassins life intrigued you, and soon you began your training as an assassin.
echo Now having completed your training, you head off armed with a collection of
echo potions, to make a new life. Good luck, %name%.
)
)
if %class%==3 (
if %items%==1 (
echo As a child, you were brought up as a wealthy elvish inhabitant of the Dalewood
echo forests. You proved to be very intelligent as a child, so your parents sent you
echo off to the academy to learn the magic arts. You learned quickly, and advanced
echo faster than any of the other students. You are now of age, and have taken your
echo inheritance to set off and see how you may use your skills. Good luck,
echo %name%.
)
if %items%==2 (
echo Ever since you were young, you displayed a strong curiosity and sense of
echo intelligence. However, you came from a family of warriors, proud elves of the
echo Dalewood forests. Weapons you had, but the money to learn magic you had not.
echo instead, you were "self taught" in the arts of magic, aquiring what you know
echo by close, constant observation of those that had mastered the art. Now of age,
echo you have inherited your set of arms, and been sent off to make your own way in
echo the world. Good luck, %name%.
)
if %items%==3 (
echo Since your days of young, you have been entirely enthrolled with wizardry.
echo Having been raised as an honorable elvish wizard in the forests of Dalewood,
echo you learned to produce potions that would complement your magical talents. Now
echo that you are of age, you set off into the world, determined to rely on use of
echo your magic talents and the aid of potions. Good luck, %name%.
)
)
)
echo/
:game
cls
if %location%==1 (
echo Plains of WesterHam
echo/
echo You walk down the fading dirt road into the prarie town of WesterHam. The wind
echo blows the long, thin grass about in a ripple-type of pattern. As you enter the
echo town, you look about and note the busy market, characteristic of towns
echo inhabited by humans. You see a quaint looking inn directly to your left, and a
echo ways down the road you spot a bakery. On the right side or the street is a
echo blacksmith shop, as well as an apothecaries shop that advertises instruction in
echo magic as well. At the very end of the lane, you percieve a church of moderate
echo size.
echo/
echo/
echo What do you want to do?
echo Enter the inn---------------------1
echo Enter the bakery------------------2
echo Enter the blacksmith shop---------3
echo Enter the apothecaries------------4
echo Enter the church------------------5
echo Enter the market-place------------6
echo Loot some homes-------------------7
echo Turn around; travel elsewhere-----8
set /p towna="> "
if %towna%==1 goto inn
if %towna%==2 (
cls
echo Seems to be closed today. Maybe the owner is at the market-place.
pause
goto town1i
)
if %towna%==3 goto smith
if %towna%==4 goto apoth
if %towna%==5 goto church
if %towna%==6 (
cls
echo You don't have time for such things. Maybe in the Beta version you will.
pause
goto town1i
)
if %towna%==7 (
cls
echo No, youre too good for that. Maybe in the Beta version you won't be.
goto town1i
)
if %towna%==8 goto travel
)
if %location%==2 (
echo Mines of Morrowvale
)
if %location%==3 (
echo Forests of Dalewood
)

就我所见,我的代码应该可以工作,我不知道是什么导致了错误消息。作为旁注,什么可能导致错误消息“goto是意外的”?是否有未定义的目标?是否可以通过添加目标标签来解决此问题(不太可能,因为这样会显示标签未定义的消息)。将来如何避免这种情况?

您的问题是批处理扩展得太早了

当程序到达行
if%location%==1
时,下面的整个
if
块将展开,包括嵌套的
if towna==*

若要修复,必须执行以下操作:

  • 您必须在启动时调用
    SETLOCAL ENABLEDELAYEDEXPANSION
    你的密码。此命令启用动态文件的延迟扩展 变量

  • 然后必须使用
    if!汤纳==*
    ,则使用代码>而不是
    。这
    这种变量不会在到达其块时立即展开。
    相反,如果调用了
    SETLOCAL ENABLEDELAYEDEXPANSION
    , 当用户实际接触到它时,它将被扩展 翻译


  • 请注意,每当您在任何语句块内设置和调用变量时,都必须执行这些步骤。

    主要问题是您没有告诉我们您在提示中输入了什么,因此跟踪未知输入的情况意味着您必须为我们的水晶球提供新电池

    一般来说,在处理输入时,您应该注意两个特征。首先,只需按Enter键,目标变量将保持不变。您可以使用

    set var=defaultvalue
    set /p var="> "
    
    这将在单独输入时保存
    var
    设置为默认值

    如果您不想要默认值

    第二个问题是批处理在执行之前用该变量的当前值替换
    %var%
    。因此
    如果没有设置
    var
    (或“设置”为空字符串),如果
    var
    设置为“带空格的某物”,则尝试执行
    ,如果带空格的某物==带空格的某物
    CMD
    出于历史原因,需要使用语法
    IF string操作符string dosomething with parameters
    ,因此通常需要使用
    IF“%var%”==“string”…
    来分析用户输入

    语法
    !瓦尔var
    的值在块内更改,并且您希望访问新的值,则需要在“块语句”(即括号中的语句序列)中使用code><代码>%var%
    将为您提供
    **OLD**
    值(即,在执行开始之前,在第一次遇到调用块的语句时变量具有的原始值。)以使用
    !瓦尔
    ,您需要处于delayedexpansion模式,也就是说,您需要执行一条
    setlocal enabledelayedexpansion
    语句


    此外,一个小的未改变的部分

    set /p towna="> "
    if %towna%==1 goto inn
    if %towna%==2 (
    cls
    echo Seems to be closed today. Maybe the owner is at the market-place.
    pause
    goto town1i
    )
    if %towna%==3 goto smith
    if %towna%==4 goto apoth
    if %towna%==5 goto church
    if %towna%==6 (
    cls
    echo You don't have time for such things. Maybe in the Beta version you will.
    pause
    goto town1i
    )
    if %towna%==7 (
    cls
    echo No, youre too good for that. Maybe in the Beta version you won't be.
    goto town1i
    )
    if %towna%==8 goto travel
    )        <<<<<<<<THIS STRAY ) can cause havoc!
    

    Windows批处理文件语言非常有限,如果您试图使用它编写程序,您会感到非常沮丧。除非有令人信服的理由,你需要学习这种特定的语言(protip:没有),否则我强烈建议你选择另一种语言。@Daskwuff我知道它是有限的,我只是想在进入更高级的领域之前精通批处理脚本。老实说,这不是一门很有用的语言。如果您现在真的想为Windows系统编写脚本,那么最好使用Powershell。批处理文件是80年代的一个遗物。我已经尝试过其他的脚本语言,如java和C++,但是我过去的编码经验是在TI BASIC和Z80汇编中,所以语法根本就不熟悉。我真的使用批处理作为从图形计算器到PC的过渡。与其他脚本语言相比,它是有限的,但我在这里使用TI-84。括号用于括起“if%location%==1”(“没有它,我得到的”<此时出乎意料”.Wow!-嗯,我当然不会检查那么长的例程。但是问题是,有问题的命令在一个块中-它似乎是一个很大的块。在一个块中,您需要调用
    enabledelayedexpansion
    ,并使用
    !var!
    来访问在该块中更改的变量的值。时间到l我相信是关于子程序的。好吧,这很有效。我在脚本开始时使用了enabledelayedexpansion,它需要在块中使用。所以只需要一些基本问题:enabledelayedexpansion(什么是解析)发生了什么?用!!和
    set /p towna="> "
    if %towna%==1 goto inn
    if %towna%==2 (
    cls
    echo Seems to be closed today. Maybe the owner is at the market-place.
    pause
    goto town1i
    )
    if %towna%==3 goto smith
    if %towna%==4 goto apoth
    if %towna%==5 goto church
    if %towna%==6 (
    cls
    echo You don't have time for such things. Maybe in the Beta version you will.
    pause
    goto town1i
    )
    if %towna%==7 (
    cls
    echo No, youre too good for that. Maybe in the Beta version you won't be.
    goto town1i
    )
    if %towna%==8 goto travel
    )        <<<<<<<<THIS STRAY ) can cause havoc!
    
    @ECHO OFF
    SETLOCAL
    set var=before
    if "%var%"=="before" (
     set var=after
     echo in-block results: %var% and !var!
    )
    echo after block results: %var% and !var!
    ENDLOCAL
    SETLOCAL ENABLEDELAYEDEXPANSION
    ECHO DELAYEDEXPANSION invoked
    set var=before
    if "%var%"=="before" (
     set var=after
     echo in-block results: %var% and !var!
    )
    echo after block results: %var% and !var!
    ENDLOCAL
    GOTO :EOF