从批处理文件读取值并打印时出错

从批处理文件读取值并打印时出错

我试图从文件中读取并打印值,但它不起作用,变量似乎是用上次运行的值设置的。

读取.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 . . .

进一步阅读

答案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

更多资源

相关内容