Windows批处理变量

3

我有一个问题,需要通过两个其他变量获取变量值。由于我的英语不是很好,可能听起来比较复杂。

我使用变量rXY来创建xy网格,其中X是x位置,Y是y位置。我用随机字符填充了网格,但现在我想获取一个点的值。

echo %r23%可以工作,但如果我要求用户输入坐标(set /P p_x=),那么echo %r%p_x%%p_y%就无法工作。

这种方式是否可行?

代码示例:

echo off
cls
FOR /L %%Y IN (1,1,4) DO (FOR /L %%X IN (1,1,4) DO set r%%X%%Y=.)

echo Y
echo 4 %r14% %r24% %r34% %r44%
echo 3 %r13% %r23% %r33% %r43%
echo 2 %r12% %r22% %r32% %r42%
echo 1 %r11% %r21% %r31% %r41%
echo 0 1 2 3 4 X

set /P input=Please enter X and Y pos:
set p_x=%input:~0,1%
set p_y=%input:~1,2%
echo X=%p_x%
echo Y=%p_y%
echo [2,3]=%r23%

echo %r%p_x%%p_y%
pause

1
通常情况下,我会发一篇长篇大论,告诉你应该简单地使用数组。但是考虑到你正在批处理中编程...你不能使用数组,但我很同情你。 - user395760
是的,我知道如何使用数组,但这里有一点挑战,这次我必须使用批处理。 - Timo
无关提示:使用@echo off而不是使用cls - user1686
2个回答

3
使用(可怕的)延迟扩展。
setlocal enabledelayedexpansion
echo !r%p_x%%p_y%!

%variables% 在解析行时被扩展,!variables! 在实际执行时才被扩展。


不要忘记 endlocal。此外,您可以调用子程序(使用 goto :eof 结束子程序),并在其中进行变量操作,而无需担心延迟扩展的问题 ;) - 0xC0000022L
@状态:好的,如果不使用延迟扩展,你会怎么做呢?(另外,在脚本结束时,endlocal 是自动执行的。) - user1686
操作系统在进程退出时也会释放内存,但我们尝试在此之前释放所有资源 ;) …已编辑答案,请见上方(审核通过后)。 - 0xC0000022L

2
您可以通过不同的方式实现延迟扩展:
CALL ECHO %%r%p_x%%p_y%%%

虽然仍然很可怕,但至少可以避免您发出特殊命令的需要(但老实说,这是一个有争议的优点)。

它是如何工作的。双倍的%将被解释为文字上的%,接着两个变量被解释为它们的值,最后还有一个双倍的%,会得到相应的处理。

这是在执行该行之前立即发生的第一次解析。执行时,该行的形式为(例如)CALL ECHO %r21%

当调用CALL命令时,第二次解析将发生,这时%r21%将被正确地评估为其各自的值。


两种方法都可以工作,但我不确定哪一种更好。由于这次不需要节省资源,我更喜欢这个,因为它只有一行代码。谢谢大家! - Timo
1
call 版本非常慢,并且不安全,存在特殊字符问题。延迟扩展对于包含 特殊字符 的内容是安全的。 - jeb
@jeb:在OP的情况下似乎都不是问题。不过,这是值得记住的好事情,谢谢。 - Andriy M
我发现 call 不是一个好的选择,因为你不能在比较值时使用它。 - Timo
@Timo:好的,毫无疑问,grawity的建议比这个更通用。 - Andriy M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接