为什么环境变量没有在FOR循环中更新?

时间:2016-10-31 01:19:33

标签: batch-file for-loop

我有一个正在扫描文件URLs.txt的批处理文件,每个网址运行它并下载文件。我遇到的问题是FOR循环中的环境变量。我正在使用 cat sed awk 来获取网址的最后两部分,以便我可以提供文件名。问题是环境变量在第一次运行后永远不会更新。我可以看到tmp2.txt只是为每个网址正确更新,但批处理文件没有更新outfile因此我会覆盖第一个文件。

我尝试简化测试的批处理文件,for循环中的任何变量似乎都不会更新。

@echo off
setlocal enabledelayedexpansion

for /F "tokens=*" %%A in (URLs.txt) do (
    echo %%A > tmp.txt
    cat tmp.txt | sed "s/\(.*\)\//\1_/" | awk -F "/" "{print $NF}" > tmp2.txt
    set /p outfile=<tmp2.txt
    echo Varible A
    echo %%A
    echo.
    echo Varible outfile
    echo %outfile%
    call curl.exe -o %outfile% -u username:password --insecure %%A
    pause
)

为什么环境变量outfile未在FOR循环中更新?

1 个答案:

答案 0 :(得分:4)

echo !outfile!

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于{{1 }}

因此,FOR ... DO (block)将在遇到IF (something) else (somethingelse)时使用%variables%的值执行。

解决此问题的两种常见方法是1)使用IF并使用setlocal enabledelayedexpansion代替!var!来访问已更改的%var%或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

请注意使用显示var更改值的CALL ECHO %%var%%var显示,但遗憾的是RESETS错误级别。

在您的情况下,由于为CALL ECHO %%errorlevel%%分配了值outfile,因此您可以将%%A替换为%outfile% - 这样就可以%%A无论如何,因为"quote the string"使它成为单个标记而不是系列 - 以防你的文件名包含像 Space

这样的分隔符