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

utk*_*agi 7 windows-7 batch command-line cmd.exe

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

读取.bat:

@echo off
for /f "tokens=*" %%a in (data.bat) do (
echo %%a
set server=%%a
echo %server%
)
pause
Run Code Online (Sandbox Code Playgroud)

数据.bat:

 1
 2
 3
 4
Run Code Online (Sandbox Code Playgroud)

输出:

 1
 4
 2
 4
 3
 4
 4
 4 
Run Code Online (Sandbox Code Playgroud)

预期输出:

1
1
2
2
3
3
4
4
Run Code Online (Sandbox Code Playgroud)

Dav*_*ill 8

该变量似乎是用上次运行的值设置的。

这是因为cmd解析批处理文件的方式。默认情况下,变量在解析时而不是在运行时扩展。这意味着循环中的变量评估不正确,除非您启用延迟扩展

setlocal enabledelayedexpansion
Run Code Online (Sandbox Code Playgroud)

延迟扩展将导致变量在执行时而不是在解析时扩展,此选项随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
Run Code Online (Sandbox Code Playgroud)

示例输出:

F:\test>test
1
1
2
2
3
3
4
4
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

进一步阅读