我试图从文件中读取并打印值,但它不起作用,变量似乎是用上次运行的值设置的。
读取.bat:
@echo off
for /f "tokens=*" %%a in (data.bat) do (
echo %%a
set server=%%a
echo %server%
)
pause
数据.bat:
1
2
3
4
输出:
1
4
2
4
3
4
4
4
预期输出:
1
1
2
2
3
3
4
4
答案1
该变量似乎是用上次运行的值设置的。
cmd
这是因为批处理文件的解析方式。默认情况下,变量在解析时展开不是在运行时。这意味着循环中的变量会被错误地评估,除非你启用延迟扩张:
setlocal enabledelayedexpansion
延迟扩张将导致变量在执行时而不是在解析时扩展,此选项通过命令打开
SETLOCAL
。当延迟扩展生效时,可以使用以下方式引用变量
!variable_name!
(除了正常的%variable_name%
)
来源延迟扩张
使用以下批处理文件。
测试.cmd:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (data.bat) do (
echo %%a
set server=%%a
echo !server!
)
pause
endlocal
示例输出:
F:\test>test
1
1
2
2
3
3
4
4
Press any key to continue . . .
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 启用延迟扩展- 延迟扩展将导致变量在执行时而不是在解析时扩展。
- 设置本地- 设置选项来控制批处理文件中环境变量的可见性。
答案2
尝试一下这个方法,使用 CALL 来将 FOR 循环值从 data.bat 文件传递给子例程,作为 ECHO 等的参数:
@echo off
for /f "tokens=*" %%a in (data.bat) do (
CALL :Routine "%%~a"
)
PAUSE
GOTO EOF
:Routine
echo %~1
set server=%~1
echo %server%
GOTO EOF