Batch file 从存储在变量中的多行输出中获取第m行的第n列

Batch file 从存储在变量中的多行输出中获取第m行的第n列,batch-file,cmd,Batch File,Cmd,显示如何将第二列输出到变量。我有一个类似的问题,我需要获取第m行的第n列,从已经存储在某个变量中的多行输出获取预定义的列分隔符(比如单个制表符)!x 例如: @echo off setlocal EnableExtensions EnableDelayedExpansion set "x=" set "STDERR=" (set LF=^ %=empty line=% ) for /F "delims=" %%E in ('

显示如何将第二列输出到变量。我有一个类似的问题,我需要获取第m行的第n列,从已经存储在某个变量
中的多行输出获取预定义的列分隔符(比如单个制表符)!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\U LOCAL\U MACHINE\SOFTWARE\Artifex\GPL Ghostscript\9.26

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


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

FOR /F "tokens=1,2,*" %%1 in ("!x!") DO (
    echo Column1: %%1 --- Column2: %%2 --- Column3: %%3
)
FOR/F循环总是逐行进行(由换行符分隔)。
通过分隔符(
选项:delims=
)将这些行拆分为令牌。生成令牌的数量由
选项:令牌=
控制,在这种情况下,前三个令牌映射到
%%1
%%2
%%3

有关更多信息,请阅读/?的帮助。

如果要分割令牌,必须使用
delims
选项(默认为空格和制表符)


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

FOR /F "tokens=1,2,*" %%1 in ("!x!") DO (
    echo Column1: %%1 --- Column2: %%2 --- Column3: %%3
)
FOR/F循环总是逐行进行(由换行符分隔)。
通过分隔符(
选项:delims=
)将这些行拆分为令牌。生成令牌的数量由
选项:令牌=
控制,在这种情况下,前三个令牌映射到
%%1
%%2
%%3

有关更多信息,请阅读/?的帮助。

如果要分割令牌,必须使用
delims
选项(默认为空格和制表符)


使用
Skip=2
跳过前两行。使用
delims=
。使用
tokens=1,2,*
获取第三列中的所有剩余数据。并阅读帮助以获取/?,输出似乎不包含制表符,但包含空格作为分隔符。。。这给我带来了一个问题,因为我使用空格作为分隔符,然后我的路径(例如
C:\Program Files\gs\gs9.26
)也被分割。因为我不知道路径中会有多少空格,所以这个解决方案似乎是使用
skip=2
对前两行进行uslessSkip。使用
delims=
。使用
tokens=1,2,*
获取第三列中的所有剩余数据。并阅读帮助以获取/?,输出似乎不包含制表符,但包含空格作为分隔符。。。这给我带来了一个问题,因为我使用空格作为分隔符,然后我的路径(例如
C:\Program Files\gs\gs9.26
)也被分割。因为我不知道路径中会有多少空间,所以这个解决方案似乎没有用
@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
)