Получить n-й столбец m-й строки из многострочного вывода, хранящегося в переменной - PullRequest
1 голос
/ 24 февраля 2020

Файл CMD.exe: получить вывод второго столбца в переменную показывает, как получить вывод второго столбца в переменную . У меня есть аналогичный вопрос, где мне нужно получить n-й столбец m-й строки , имеющий предопределенный разделитель столбцов (скажем, один символ табуляции) из многострочного вывода , который уже хранится в некоторых переменных !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

1 Ответ

0 голосов
/ 24 февраля 2020

Если у вас действительно есть многострочная переменная со встроенными переводами строк, это просто:

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

FOR / F l oop всегда принимает строку за строкой (разделенные переводом строки).
Эти строки делятся на токены разделителями (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
)
...