调用变量不起作用,该怎么办?

Calling variables do not work, what to do?

提问人:mqnycrptnn 提问时间:1/5/2023 更新时间:1/9/2023 访问量:80

问:

嘿 StackOverflow 社区,

我目前正在编写自己的生活模拟器,名为“XinsLife”。目前,我想调用之前设置的变量。但它就是行不通。我在 YouTube 和 SS64 上尝试了所有内容,但找不到错误是什么。所以我想我会在 StackOverflow 上问。我知道这个问题是基本的,可能每个人都可以做到这一点,但我对 Batch 很陌生。

任何帮助将不胜感激。

我目前正在选择国家/地区,因此当我选择国家/地区时,它必须执行我选择的变量,然后转到:savesettings,并显示我选择的国家/地区。但它不起作用。

C o d e :

:countrychoosing
cls
title New Life -- Country choosing
echo.
echo Choose your country:
call :echo-align center "United States"
call :echo-align center "United Kingdom"
call :echo-align center "China"
call :echo-align center "India"
call :echo-align center "More countries to come soon!"
set /p choosecountry=
if "%choosecountry%" equ 1 (
    set chosecountry = United States
    goto savesettings
)

if "%choosecountry%" equ 2 (
    set chosecountry = United Kingdom
    goto savesettings
)   

if "%choosecountry%" equ 3 (
    set chosecountry = China
    goto savesettings
)

if "%choosecountry%" equ 4 (
    set chosecountry = India
    goto savesettings
)

:savesettings
call %chosecountry%
echo You chose the country "%chosecountry%". Do you want to create a save file?
choice /C:YN
if "%errorlevel%" equ 255 goto savesettings
if "%errorlevel%" equ N goto continuetest
if "%errorlevel%" equ Y goto createsavefiletest
if "%errorlevel%" equ 0 goto savesettings
变量 批处理文件 调用

评论

0赞 Magoo 1/5/2023
stackoverflow.com/a/18046623/2128947(从这个每周问题的回答中随机选择)——但是当你也在使用(首选选项)来做同样的事情时,为什么要使用呢?set/pchoice
0赞 mqnycrptnn 1/5/2023
不起作用。我按了 1,应该是美国,但它说:“印度”不被识别为命令。您选择了国家:“印度”
0赞 mqnycrptnn 1/5/2023
你看不到标签,因为我没有向你展示其余的代码。 完美工作。它只是将文本对齐到中心。echo-alignecho-align
0赞 mqnycrptnn 1/5/2023
哦,还有,“为什么在命令行上使用'set var = text'后没有'echo %var%'的字符串输出?没有帮助。它仍然说“印度”不被认为是命令。你选择了国家:“印度”。
2赞 SomethingDark 1/5/2023
我知道你有很多链接,但你实际上需要重新阅读 stackoverflow.com/a/26388460/3074564 因为你的变量设置不正确。

答:

0赞 Magoo 1/5/2023 #1

为什么你应该使用“choice”,而不是“set /p”来接受用户输入。

When you use then 设置为从键盘输入的字符串。set /p "var=Some user prompt"var

  • 但请注意,如果用户的响应是简单的,那么将保持不变Entervar

理论上一切正常,如果你能确定你的用户永远不会输入一个意外的字符串。

假设用户输入您的第一个提示2

该声明将被解释为ifif "2" equ 2 (

由于 和 不同,因此该语句将被评估为 false。你需要"2"2ifif "%choosecountry%" equ "2" (

所以代码现在变成了if "%choosecountry%" equ "2" (

假设用户输入您的第一个提示,而不是预期的 .United Kingdom2

该语句将被解释为 - 好吧,可以用更多的代码来修复。ifif "United Kingdom" equ "2" (

但假设用户输入 -yes。更多代码...UK

假设条目是 。这将导致语法错误 - 并且有大量其他示例,例如用户可以输入但批处理会反对。x"y%hello

好吧 - 大多数(但可能不是所有)这些意外的输入字符串都可以被处理,以使处理器能够顺利地处理它们,但这是很多不必要的工作和代码。cmd

更好的解决方案是稍后在代码中使用(但对不起,不正确)。choice

如果从提示符输入,则会获得 的完整说明。总之,您可以使用命令 where 可以是任何唯一 α--z 或数字字符串。choice /?choicechoice /C:YNYN

choice等待单个字符,如果未使用 设置的选项之一,则会发出哔哔声/c:

如果使用其中一个允许的选项,则它将魔术变量设置为一个值,该值取决于字符在允许的字符串中的位置,因此按响应将设置为 2;for to ;对于 .errorlevelNchoice /C:YNerrorlevelchoice /C:NY1choice /C:ORANGES4

魔术变量是自动设置的变量,如 、 等。不应将这些变量设置为程序的一部分,因为变量中的值会覆盖系统设置的值。DATETIMERANDOMset

否则,magic 变量的工作方式与普通用户变量相同,并且 ALL VARIABLES 都是字符串。如果字符串是纯数字,则该命令可用于执行一些数学运算。(-numeric string 要求有一些深奥的例外 - 有关详细信息,请参阅提示)set /apureset /?

因此,要构建一个以从菜单中使用,您可能有choice

choice /C:YN
if "%errorlevel%" equ "255" goto savesettings
if "%errorlevel%" equ "2"   goto continuetest
if "%errorlevel%" equ "1"   goto createsavefiletest

请注意,运算符的每一边(“equ”)都必须用引号引起来。if

或者 - 您可能有

choice /C:YN
if errorlevel 255 goto savesettings
if errorlevel 2   goto continuetest
if errorlevel 1   goto createsavefiletest

请注意,这些测试必须以相反的数字顺序执行,因为 的含义是“如果错误级别为 n 或大于 nif errorlevel n"

您甚至可以使用

choice /C:YN
goto point%errorlevel%

其中位于 、 和 。:point1:createsavefiletest:point2:continuetest:point255:savesettings

请注意,标签只是文件中的一个位置,因此

some code...
:xyz
:abc
:hyg
some more code...

意味着 ,并且都做同样的事情。goto xyzgoto abcgoto hyg

这应该使您能够解决您的问题。

Batch 对普通字符串语句中的空格敏感。 将名为“FLAG”的变量设置为值“N”。从 .SETSET FLAG = NSpaceSpaceSpace=

用于设置字符串值 - 这避免了尾随空格引起的问题。不要分配或终端反斜杠或空格。从元素构建路径名 - 与直觉相反,它可能会使过程更容易。如果使用语法,则引号将成为赋值的一部分。set "var=value""set var="value"

评论

0赞 mqnycrptnn 1/8/2023
嘿,谢谢你的回答,虽然它没有用。“印度”不是由您的评论修复的可识别命令,但它仍然显示您选择了“”。@Magoo
1赞 Magoo 1/9/2023
很可能是因为你还没有修复你的语法。我添加了讲道。setset
0赞 mqnycrptnn 1/9/2023
谢谢,现在它起作用了,但它再次说“印度”不是一个公认的命令。编辑:现在我知道了,为什么它不起作用。我使用了命令调用%chosecountry%,这与我在命令提示符中输入“India”的结果相同,我只是删除了它,现在它可以工作了。非常感谢Magoo。