我想拆分从文件中读取的key=value
对,并将它们分配给两个相应的值。但是,当我尝试这样做时,我无法将值设置为变量,则将值设置为空白而不是值。
该文件包含:
x1=y1
x2=y2
x3=y3
以下是我的示例代码:
FOR /f "tokens=1,2* delims==" %%a IN (%%~nxi) DO (
ECHO "Begin for"
ECHO %%a
ECHO %%b
set key=%%a
ECHO key=%key%
set val=%%b
ECHO val=%val%
ECHO "End for"
)
预期产出:
Begin for
x1
y1
key=x1
value=y1
End for
Begin for
x2
y2
key=x2
value=y1
End for
初始ECHO
语句成功,但新变量的SET
和Echo
正在返回""空白。
实际输出:
Begin for
x1
y1
*key=
value=*
End for
Begin for
x2
y2
*key=
value=*
End for
答案 0 :(得分:2)
当到达代码行或代码块(代码括在for
,if
,...中的括号中)时,解析器将删除所有变量读取,并将其替换为值在行/块开始执行之前的变量内部。因此,如果在行/块内更改变量的值,则在同一行/块内不会显示此更改的值,因为对变量内容的所有访问都已替换为其值。
因此,如果在行/块内更改变量的值,并且需要在同一行/块内读取/访问变量的变化值,则需要延迟扩展。
启用延迟扩展后,对变量中值的访问可以将通常的语法%var%
更改为!var!
,要求解析器在执行代码之前不要删除带有值的读取。没有必要替换所有变量读取,只需读取在同一块中更改的值。
@echo off
setlocal enableextensions
FOR /f "tokens=1,2* delims==" %%a IN (%%~nxi) DO (
ECHO "Begin for"
ECHO %%a
ECHO %%b
set "key=%%a"
set "val=%%b"
setlocal enabledelayedexpansion
ECHO key=!key!
ECHO val=!val!
endlocal
ECHO "End for"
)
ECHO key=%key%
ECHO val=%val%