【问题标题】:SET Variable in a for /f loop not working outside the loopfor / f 循环中的 SET 变量在循环外不起作用
【发布时间】:2017-11-12 13:19:28
【问题描述】:

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.

变量在循环中被设置,但在循环外它不是。

【问题讨论】:

  • 回声 %VAR01% 和回声 !VAR01! 的结果是“”/空白,/什么都没有。
  • 是的,不幸的是,为什么你认为不是?

标签: batch-file


【解决方案1】:

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

看下面两种方法的输出(我用的是标准的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%

【讨论】:

    【解决方案2】:

    试试

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

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

    我相信for 执行了不止一次——第一次它可能设置变量,第二次清除它们。同样,这应该显示在您的跟踪中。

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

    传统的做法是

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

    ^ 转义管道以使其重定向 引用的命令。

    【讨论】:

    • @Maggo:也是我的第一个想法,但输出确实是正确的(由for外的管道引起)。
    • 我已经改成:SETLOCAL ENABLEDELAYEDEXPANSION curl -s 192.168.1.68/cgi-bin/home | for /f "tokens=1" %%a in ('Grep -o -P "[0-9].{0,8}kWh.{0,0}"') 做 ( SET VAR01=%%a SET VAR02=%%a SET VAR03=%%a goto :done ) :done echo %VAR01% echo %VAR02% echo %VAR03% ENDLOCAL 但结果还是一样,VAR0x 是由循环内的 %%a 的值设置的,但是外面还是空的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多