我有一个正在扫描文件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循环中更新?
答案 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