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,但在循环之外则不是。
答案 0 :(得分:2)
你的问题是管道问题。管道的两端都在自己的环境中执行,因此您的变量在完成后就会消失。
观察以下两种方法的输出(我使用标准cmd
命令,因为我没有curl
和grep
,但结果应该相同。
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(
^
转义管道,使其在引用的命令中重定向。