我有一个批处理文件,它正在扫描文件URLs.txt
,并为每个url运行它并下载该文件。我遇到的问题是FOR循环中的环境变量。我使用cat, sed和awk来获取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