提问人:mqnycrptnn 提问时间:1/5/2023 更新时间:1/9/2023 访问量:80
调用变量不起作用,该怎么办?
Calling variables do not work, what to do?
问:
嘿 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
答:
为什么你应该使用“choice”,而不是“set /p”来接受用户输入。
When you use then 设置为从键盘输入的字符串。set /p "var=Some user prompt"
var
- 但请注意,如果用户的响应是简单的,那么将保持不变Enter
var
理论上一切正常,如果你能确定你的用户永远不会输入一个意外的字符串。
假设用户输入您的第一个提示2
该声明将被解释为if
if "2" equ 2 (
由于 和 不同,因此该语句将被评估为 false。你需要"2"
2
if
if "%choosecountry%" equ "2" (
所以代码现在变成了if "%choosecountry%" equ "2" (
假设用户输入您的第一个提示,而不是预期的 .United Kingdom
2
该语句将被解释为 - 好吧,可以用更多的代码来修复。if
if "United Kingdom" equ "2" (
但假设用户输入 -yes。更多代码...UK
假设条目是 。这将导致语法错误 - 并且有大量其他示例,例如用户可以输入但批处理会反对。x"y
%hello
好吧 - 大多数(但可能不是所有)这些意外的输入字符串都可以被处理,以使处理器能够顺利地处理它们,但这是很多不必要的工作和代码。cmd
更好的解决方案是稍后在代码中使用(但对不起,不正确)。choice
如果从提示符输入,则会获得 的完整说明。总之,您可以使用命令 where 可以是任何唯一 α--z 或数字字符串。choice /?
choice
choice /C:YN
YN
choice
等待单个字符,如果未使用 设置的选项之一,则会发出哔哔声。/c:
如果使用其中一个允许的选项,则它将魔术变量设置为一个值,该值取决于字符在允许的字符串中的位置,因此按响应将设置为 2;for to ;对于 .errorlevel
N
choice /C:YN
errorlevel
choice /C:NY
1
choice /C:ORANGES
4
魔术变量是自动设置的变量,如 、 等。不应将这些变量设置为程序的一部分,因为变量中的值会覆盖系统设置的值。DATE
TIME
RANDOM
set
否则,magic 变量的工作方式与普通用户变量相同,并且 ALL VARIABLES 都是字符串。如果字符串是纯数字,则该命令可用于执行一些数学运算。(-numeric string 要求有一些深奥的例外 - 有关详细信息,请参阅提示)set /a
pure
set /?
因此,要构建一个以从菜单中使用,您可能有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 xyz
goto abc
goto hyg
这应该使您能够解决您的问题。
Batch 对普通字符串语句中的空格敏感。 将名为“FLAG”的变量设置为值“N”。从 .SET
SET FLAG = N
SpaceSpaceSpace=
用于设置字符串值 - 这避免了尾随空格引起的问题。不要分配或终端反斜杠或空格。从元素构建路径名 - 与直觉相反,它可能会使过程更容易。如果使用语法,则引号将成为赋值的一部分。set "var=value"
"
set var="value"
评论
set
set
评论
set/p
choice
echo-align
echo-align