在bat文件或批处理脚本中拆分字符串

时间:2014-06-04 12:59:20

标签: batch-file

我想拆分从文件中读取的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语句成功,但新变量的SETEcho正在返回""空白。

实际输出:

    Begin for
    x1
    y1
    *key=
    value=*
    End for
    Begin for
    x2
    y2
    *key=
    value=*
    End for

1 个答案:

答案 0 :(得分:2)

当到达代码行或代码块(代码括在forif,...中的括号中)时,解析器将删除所有变量读取,并将其替换为值在行/块开始执行之前的变量内部。因此,如果在行/块内更改变量的值,则在同一行/块内不会显示此更改的值,因为对变量内容的所有访问都已替换为其值。

因此,如果在行/块内更改变量的值,并且需要在同一行/块内读取/访问变量的变化值,则需要延迟扩展。

启用延迟扩展后,对变量中值的访问可以将通常的语法%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%