如何在批处理脚本中循环内打印变量?

3
@ECHO OFF
set /A q=0

for /F "tokens=*"  %%E IN ('findstr /n /r "Finshed With Errors" D:\DataUploadUtil\UploadStatus\TariffUploadLog.txt') do (

set array[!q!]=%%E

set /A q=q+1


echo %%E >>D:\DataUploadUtil\UploadStatus\AllTariffsUploadStatus.txt

set test=%%E

echo %test%              ::error 


)

在上面的脚本中,我尝试在循环中打印test变量,但它显示ECHO IS OFF。我想要打印test变量。
谢谢。

1
不是Bash脚本。Bash是*NIX shell而不是DOS/Windows。上面是DOS/Windows批处理文件。 - Leptonator
3个回答

5
@ECHO OFF
setlocal enabledelayedexpansion
set /A q=0
for /F "tokens=*"  %%E IN (
  'findstr /n /r "Finshed With Errors" D:\DataUploadUtil\UploadStatus\TariffUploadLog.txt'
 ) do (
  set array[!q!]=%%E
  set /A q=q+1
  echo %%E >>D:\DataUploadUtil\UploadStatus\AllTariffsUploadStatus.txt
  set test=%%E
  echo !test!
)

您需要使用setlocal enabledelayedexpansion来调用delayedexpansion模式,其中!var!var的运行时值。%var%始终是parse-time值-也就是在循环(或块)运行之前的值。

ECHO %%E在这种情况下也可以工作(如您在追加到all...txt中所使用的)。

echo is off报告是由于test在解析for命令时没有值,因此它被执行为没有参数的echo,从而生成错误状态报告。

如果要回显可能为空的变量,请利用ECHO的一个怪异之处:

ECHO(%potentiallyemptyvar%

请注意,在这里(被视为echo命令的一部分 - 它不参与圆括号的嵌套...

1
我认为你缺少SETLOCAL / ENDLOCAL语句。任何时候,如果变量中使用!,则需要使用SETLOCAL。%用于标准批处理。
@ECHO OFF
SETLOCAL enabledelayedexpansion
set /A q=0
for /F "tokens=*"  %%E IN ('findstr /n /r "Finshed With Errors" D:\DataUploadUtil\UploadStatus\TariffUploadLog.txt') do (
set array[!q!]=%%E
set /A q=q+1

echo %%E >>D:\DataUploadUtil\UploadStatus\AllTariffsUploadStatus.txt
set test=%%E
echo !test!              ::error 
ENDLOCAL
)

1
我再次收到的是!test!,而不是test的值。 - Suresh

-1
你所需要做的就是,在括号关闭后添加术语“ENDLOCAL”。

代码中没有 SETLOCAL。而且 endlocal 无法解决百分号扩展问题。 - jeb

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