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



我有一个批处理文件,它正在扫描文件URLs.txt,并为每个url运行它并下载该文件。我遇到的问题是FOR循环中的环境变量。我使用catsedawk来获取url的最后两个部分,以便我可以提供文件名。问题是环境变量在第一次运行后永远不会更新。我可以看到tmp2.txt刚刚为每个url正确更新,但批处理文件没有更新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循环中更新?

echo !outfile!

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

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

克服这个问题的两种常见方法是:1)使用setlocal enabledelayedexpansion!var!代替%var%来访问var的更改值;2)调用子程序使用更改的值执行进一步的处理。

因此请注意使用CALL ECHO %%var%%,它显示var的更改值。CALL ECHO %%errorlevel%%显示,但遗憾的是然后重置errorlevel。

在您的情况下,由于outfile被赋值为%%A,您可以将%outfile%替换为%%A -并且"quote the string"无论如何都是一个想法,因为"quoting a string"使其成为单个令牌而不是一个系列-以防您的文件名包含分隔符,如Space

最新更新