Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows批处理变量_Windows_Batch File_Cmd - Fatal编程技术网

Windows批处理变量

Windows批处理变量,windows,batch-file,cmd,Windows,Batch File,Cmd,我无法从变量trought和另外两个变量中获取值。可能听起来很复杂,因为我的英语不是最好的 我使用变量rXY来制作xy网格,其中X是X位置,Y是Y位置。我用随机字符填充网格,但现在我想得到一个点的值 echo%r23%可以工作,但如果我向用户询问坐标(set/p p_x=),那么 回显%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

我无法从变量trought和另外两个变量中获取值。可能听起来很复杂,因为我的英语不是最好的

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

echo%r23%可以工作,但如果我向用户询问坐标(set/p p_x=),那么 回显%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
使用(可怕的)延迟扩展

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

%variables%
在解析行时展开,
!变数–在实际执行时。

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

CALL ECHO %%r%p_x%%p_y%%%
几乎没有比这更可怕的了,但至少你不用再发出特别命令了(老实说,这是一个值得怀疑的优势)

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

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


正如您所猜测的,当调用
CALL
命令时,将进行第二次解析,而这次
%r21%
将严格地计算为其各自的值。

通常,我会对如何简单地使用数组发表长篇大论。但考虑到你正在批量编程。。。你不能使用数组,但我同情你。是的,我知道如何使用数组,但我在这里没有什么挑战,这次我必须使用批处理。不相关的提示:
@echo off
而不是使用
cls
别忘了
endlocal
。此外,您还可以调用sub(以
goto:eof
结束sub)并在那里执行变量魔术,而无需担心延迟扩展;)@状态:好的,在不延迟扩展的情况下,您将如何完成?(另外,
endlocal
在到达脚本末尾时是自动的。)当进程退出时,操作系统也会释放内存,但我们会尝试在这之前释放所有资源;)。。。编辑了答案,见上面(好吧,当它被批准时)。两种方法都有效,但我不确定哪一种更好。因为这次节省资源并不重要,所以我更喜欢这一行,因为它只有一行长。大家好!
调用
版本非常慢,对特殊字符不安全,延迟扩展对特殊字符是安全的content@jeb:这两种情况似乎都不是OP案例的问题。不过,要记住这是一件好事,谢谢。我发现
call
不是一个好的选择,因为你不能用它来比较价值。@Timo:很公平。毫无疑问,格拉维蒂的建议比这个更具普遍性。