首页 > 解决方案 > 从存储在变量中的多行输出中获取第 m 行的第 n 列

问题描述

CMD.exe : Get second column output to variable显示了如何将第二列输出到变量。我有一个类似的问题,我需要从已经存储在某个变量中的多行输出中获取第 m 行的第 n 列,并具有预定义的列分隔符(比如说一个 TAB 字符)。 !x!


举个例子:

@echo off

setlocal EnableExtensions EnableDelayedExpansion
set "x="
set "STDERR="
(set LF=^
%=empty line=%
)
for /F "delims=" %%E in ('
    2^>^&1 ^(^
        for /F "delims=" %%O in ^('^
            reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Artifex\GPL Ghostscript\9.26" /ve ^^^^^^^| findstr /N /R "^"^
        '^) do @^(^
            echo ^^^^^^^|%%O^
        ^)^
    ^) ^| findstr /N /R "^"
') do (
    set "LINE=%%E"
    set "LINE=!LINE:*:=!"
    if "!LINE:~,1!"=="|" (
        set "x=!x!!LINE:*:=!!LF!"
    ) else (
        set "STDERR=!STDERR!!LINE!!LF!"
    )
)

echo !x!

打印以下行

 

HKEY_LOCAL_MACHINE\SOFTWARE\Artifex\GPL Ghostscript\9.26

       (默认) REG_SZ C:\Program Files\gs\gs9.26

 

 

标签: batch-filecmd

解决方案


如果您真的有一个带有嵌入式换行符的多行变量,那么它很简单:

FOR /F "tokens=1,2,*" %%1 in ("!x!") DO (
    echo Column1: %%1 --- Column2: %%2 --- Column3: %%3
)

FOR /F 循环总是逐行进行(由换行符分隔)。
这些行被分隔符 ( option: delims=) 分成标记,生成多少标记由 控制option: tokens=,在这种情况下,前三个标记映射到%%1和。 有关更多信息,请阅读帮助%%2%%3
FOR /?

如果要拆分标记,则delims必须使用该选项(默认为空格和 TAB)。

For /F "tokens=1,2,3 delims=<a TAB CHARACTER>" ...

完整示例:

@echo off

setlocal EnableDelayedExpansion
(set LF=^
%==%
)

set "multiline=Line1 col2!LF!Line2 colB!LF!Line3 col-two"
echo multiline - contains:!LF!!multiline!!LF!-------

FOR /F "tokens=1,2,*" %%1 in ("!multiline!") DO (
    echo Column1: %%1 --- Column2: %%2 --- Column3: %%3
)

推荐阅读