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)
这是因为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)