SET for / f循环中的SET变量不在循环外工作

时间:2017-11-12 13:19:29

标签: batch-file

enter image description here我试图在for / f循环中设置一个或两个变量并在循环外使用它们,但到目前为止我没有这样做,经过几个小时的尝试后我终于给了起来并要求有人帮助我。我知道在批处理文件中使用SETLOCAL ENABLEDELAYEDEXPANSION但是使用或不使用它仍然无法正常工作。 到目前为止的代码是:

    @echo off
SETLOCAL ENABLEDELAYEDEXPANSION

curl -s 192.168.1.68/cgi-bin/home | for /f "tokens=1,2,3" %%a in ('Grep -o -P "[0-9].{0,8}kWh.{0,0}"') do (

    set VAR01=%%a
    set VAR02=%%a
)

echo %VAR01%
echo !VAR01!
ENDLOCAL

控制台上的结果是:

(set VAR01=2.14   & set VAR02=2.14  )

ECHO is off.

ECHO is off.

变量在循环中是SET,但在循环之外则不是。

2 个答案:

答案 0 :(得分:2)

你的问题是管道问题。管道的两端都在自己的环境中执行,因此您的变量在完成后就会消失。

观察以下两种方法的输出(我使用标准cmd命令,因为我没有curlgrep,但结果应该相同。

echo ON
setlocal enabledelayedexpansion

echo hello world|for /f "tokens=1,2" %%a in ('findstr "e o"') do (
  set a=%%a
  set b=%%b
)
echo %a% %b%
echo ---------
for /f "tokens=1,2" %%a in ('echo hello world^|findstr "e o"') do (
  set a=%%a
  set b=%%b
)
echo %a% %b%

答案 1 :(得分:0)

 set VAR01=%%a
 set VAR02=%%a
 goto done
)
:done
echo %VAR01%

很难相信您的结果实际上与您声明的一样,因为代码中的一行上没有&

我相信for不止一次执行 - 第一次设置变量,第二次清除它们。同样,显示在您的跟踪上。

通过goto离开循环,变量应该在第一次设置后直接显示。

执行此操作的传统方法是

for ... in(`curl ... ^ | grep ...')do(

^转义管道,使其在引用的命令中重定向