【问题标题】:Windows batch variablesWindows 批处理变量
【发布时间】:2011-07-07 13:41:41
【问题描述】:

我在通过其他两个变量从变量中获取值时遇到问题。可能听起来很复杂,因为我的英语不是最好的。

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

echo %r23% 会起作用,但如果我向用户询问坐标(设置 /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

【问题讨论】:

  • 通常情况下,我会发布一个关于如何简单地使用数组的长篇大论。但是考虑到你是批量编程的……你不能有数组,但你有我的同情。
  • 是的,我知道如何使用数组,但我在这里没有什么挑战,这次我必须使用批处理
  • 不相关提示:@echo off 而不是使用cls

标签: windows batch-file cmd


【解决方案1】:

使用(可怕的)延迟扩张

setlocal enabledelayedexpansion
echo !r%p_x%%p_y%!

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

【讨论】:

  • 别忘了endlocal。此外,您可以调用一个子(以goto :eof 结束子)并在那里执行您的变量魔法,而不必担心延迟扩展;)
  • @STATUS:好的,如果没有延迟扩展,你会怎么做? (另外,endlocal 在到达脚本末尾时是自动的。)
  • 操作系统也会在进程退出时释放内存,但我们会尝试在此之前释放所有资源;)...编辑了答案,见上文(好吧,当它获得批准时)。跨度>
【解决方案2】:

你可以通过不同的方式实现延迟扩展:

CALL ECHO %%r%p_x%%p_y%%%

几乎没有那么可怕,但至少让您无需发出特殊命令(老实说,这仍然是值得怀疑的优势)。

它是如何工作的。双精度 % 计算为文字 %,然后将两个变量计算为它们的值,最后你还有一个双精度 % 进行相应处理。

这是在执行该行之前发生的第一个解析。到执行时,该行采用(例如)CALL ECHO %r21% 的形式。

您可以猜到,当调用 CALL 命令时,会进行第二次解析,这一次 %r21% 被严格地评估为其各自的值。

【讨论】:

  • 两种方式都可以,但我不确定哪一种更好。由于这次节省资源并不重要,因此我更喜欢这一行,因为它只有一行长。大家好!
  • call 版本很慢,对特殊字符不安全,延迟扩展对特殊字符内容是安全的
  • @jeb:OP 的情况似乎都不是问题。不过,请记住这一点,谢谢。
  • 我发现call 不是好选择,因为您不能在比较值时使用它。
  • @Timo:很公平。毫无疑问,grawity的建议比这个更普遍。
猜你喜欢
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2011-09-10
相关资源
最近更新 更多