批处理IF语句变量在另一个变量中

恩德雷加

我要创建的批处理游戏的框架存在问题。我想检查变量是否是空格以外的东西。但是,我要检查的变量本身是由两个变量定义的。例如:

if not %px%xplayerlocation%y%yplayerlocation%%==%blank% goto wherever

如您所见,要检查的变量由%xplayerlocation%和%yplayerlocation%的值确定。据我所知,只有最外面的%%符号被读为变量,而最里面的%%符号被读为文字百分号。有谁知道解决这个问题的方法吗?如果有人需要,我会提供任何其他信息。谢谢。

德本纳姆

您已经识别出问题的根源,但是您对行为的描述不正确。解析器将尝试扩展名为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
   )
   ...
)

如果您热衷于使用批处理开发高质量的游戏,那么您可能会对研究我在开发SNAKE.BAT(仅使用本地批处理命令的街机风格游戏)中使用技术感兴趣文章的开头是一堆代码,但是之后我描述了我用来提高性能的许多技术。它是高级的东西,所以不要试图一次吸收所有东西。吸收您所能提供的知识,然后在获得更多经验后重新访问该帖子。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

获取另一个变量中的批处理文件变量的值

批处理:通过一个变量的值访问另一个变量

批处理:设置变量并将其与另一个变量进行比较

如何获得批处理变量以影响另一个变量?

如何使用批处理制作另一个带有变量的批处理文件?

在另一个块中的 IF 语句的前一个块中调用变量

批处理文件变量的另一个变量的一部分

在Windows批处理中的循环中使用变量替换另一个变量中的子字符串

PHP - 在另一个变量中为以后的 If 语句更改变量的值

如何使用变量值作为另一个变量(批处理文件)的名称?

如何将变量从一个批处理文件传递到另一个批处理文件?

从 thymeleaf 中的另一个变量声明变量

php变量中另一个变量的值

将变量存储在另一个变量中

Python在另一个变量中检查变量

另一个变量中的变量

从另一个变量调用类中的变量

另一个变量中的模板变量 - Grafana

处理来自另一个模块的模块变量

在一个事件处理程序中引用变量,在另一个事件处理程序中

如何通过引用另一个批处理文件将环境变量作为参数传递?

文件系统的批处理脚本:在另一个嵌套的for循环中使用for循环变量

有没有办法从.ahk文件中读取变量并在另一个批处理脚本文件中使用它

如何从另一个批处理脚本中杀死正在执行的批处理脚本?

在另一个请求中无法使用Beanshell Pre处理器变量

从另一个批处理文件调用一个批处理,并从外部批处理中设置内部批处理文件参数

一个 IF 语句,用于检查和执行 Windows 批处理文件中每个设置变量的命令

如何在另一个批处理文件中调用一个批处理文件?

一个变量中的PHP,另一个变量中包含HTML