我有一个正在扫描文件的批处理文件URLs.txt
对于每个 url 运行它并下载文件。我遇到的问题是 FOR 循环中的环境变量。我在用cat, sed and awk获取 url 的最后两部分,以便我可以提供文件名。问题是环境变量在第一次运行后永远不会更新。我理解了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 循环内更新?
echo !outfile!
在块语句内(a parenthesised series of statements)
, the entire块被解析并且then被执行。任何%var%
块内的内容将被该变量的值替换在解析块时- 在块执行之前 - 同样的事情适用于FOR ... DO (block)
.
Hence, IF (something) else (somethingelse)
将使用以下值执行%variables%
当时的IF
遇到。
克服这个问题的两种常见方法是 1) 使用setlocal enabledelayedexpansion
并使用!var!
代替%var%
访问更改后的值var
或 2) 调用子程序以使用更改后的值执行进一步处理。
因此请注意使用CALL ECHO %%var%%
显示更改后的值var
. CALL ECHO %%errorlevel%%
显示,但遗憾的是重置错误级别。
In your case, since outfile
is assigned the value %%A
, you can replace %outfile%
with %%A
- and it would be an idea to "quote the string"
anyway since "quoting a string"
makes it a single token rather than a series - just in case your filenames contain separators like Space
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)