我正在尝试创建一个批处理游戏的框架问题。我想检查一个变量是否是空格以外的东西。但是,我试图检查的变量本身是由两个变量定义的。例如:
if not %px%xplayerlocation%y%yplayerlocation%%==%blank% goto wherever
如您所见,要检查的变量由%xplayerlocation%和%yplayerlocation%的值确定。据我所知,只有最外面的%%符号被读作一个变量而内部符号被读作字面百分号。有没有人知道解决这个问题的方法?如果有人需要,我会提供任何其他信息。感谢。
答案 0 :(得分:1)
@ECHO OFF
SETLOCAL
SET "blank= "
SET xplayerlocation=3
SET yplayerlocation=4
ECHO test with blank================
SET px3y4=%blank%
CALL SET varval=%%px%xplayerlocation%y%yplayerlocation%%%
if not "%varval%"=="%blank%" ECHO goto wherever - NOT blank
ECHO test with "Q"================
SET px3y4=Q
CALL SET varval=%%px%xplayerlocation%y%yplayerlocation%%%
if not "%varval%"=="%blank%" ECHO goto wherever - NOT blank
GOTO :EOF
这可以让你摆脱困境。
答案 1 :(得分:0)
您已识别出问题的根源,但您对该行为的描述不正确。解析器将尝试扩展名为px
和y
的变量,并将最终的%%
转换为%
。
Magoo解决方案可行,但使用CALL非常慢。对于许多小脚本来说,这可能不是问题,但对于批量游戏,它可能会破坏性能。
您希望延迟扩展。在脚本开头附近添加setlocal enableDelayedExpansion
。然后使用以下内容:
if not !px%xplayerlocation%y%yplayerlocation%!==%blank% goto wherever
正常%var%
扩展发生在解析时间的早期,!var!
扩展在执行时间后期发生,因此您可以获得正确的结果。
如果%blank%
的值是空格,则上述操作无效。最简单的解决方案是使用!blank!
的延迟扩展。
您可能会发现自己处于需要在同一代码块中设置和扩展坐标值的情况,例如在FOR循环或IF语句中:
setlocal enableDelayedExpansion
...
REM This does not work
for ... in (...) do (
...
set /a "xPlayerLocation+=xChange, yPlayerLocation+=yChange"
if not !px%xplayerlocation%y%yplayerlocation%!==!blank! REM doSomething
...
)
上述操作无效,因为%var%
扩展在分析时发生,并且在执行任何代码之前解析整个带括号的代码块。因此扩展值是常量 - 它将扩展到循环开始之前存在的值。
解决方案是使用延迟扩展将坐标值传输到FOR变量:
setlocal enableDelayedExpansion
...
REM This works
for ... in (...) do (
...
set /a "xPlayerLocation+=xChange, yPlayerLocation+=yChange"
for %%X in (!xPlayerLocation!) do for %%Y in (!yPlayerLocation!) do (
if not !px%%X%y%%Y!==%blank% REM doSomething
)
...
)
或
setlocal enableDelayedExpansion
...
REM This also works
for ... in (...) do (
...
set /a "xPlayerLocation+=xChange, yPlayerLocation+=yChange"
for /f "tokens=1,2" %%X in ("!xPlayerLocation! !yPlayerLocation!") do (
if not !px%%X%y%%Y!==%blank% REM doSomething
)
...
)
如果您认真考虑使用批量开发高质量游戏,那么您可能有兴趣研究techniques I used in developing SNAKE.BAT - 仅使用本机批处理命令的街机风格游戏。帖子的开头是一堆代码,但之后我描述了一些用于提高性能的技术。这是先进的东西,所以不要试图一次吸收所有东西。吸收你所能做的,然后在你获得更多经验后重新访问帖子。