Как прочитать строку из текстового файла и использовать в пакетном файле Windows для извлечения подстроки
У нас есть текстовый файл, который нам нужен, содержащий следующий образец. Одна постоянная строка "D80", за которой следует другая строка:
D80KAAAAAA
D80KBBBBBB
D80KCCCCCC
Мы хотим извлечь его с помощью файла пакетного сценария Windows (не PowerShell) и цикла FOR, чтобы получить этот вывод:
AAAAAA
BBBBBB
CCCCCC
Пока мы дошли до этого момента. Для иллюстрации я показал различные попытки извлечения подстроки:
setlocal EnableDelayedExpansion
for /F "tokens=1 delims=" %%a in (TPLIST.txt) do (
echo %%a
echo %%(a:~4,6)
set substr1=%%(a:~4,6)%
set substr2=%(a:~4,6)%
set substr3=!(a:~4,6)!
set substr4=%!(a:~4,6)!%
echo %substr1%
echo %substr2%
echo %substr3%
echo %substr4%
)
Однако извлечь подстроку не удается:
C:\User>setlocal EnableDelayedExpansion
C:\User>for /F "tokens=1 delims=" %a in (TPLIST.txt) do (
echo %a
echo %(a:~4,6
)
C:\User>(
echo D80KAAAAAA
echo %(a:~4,6
)
D80KAAAAAA
%(a:~4,6
C:\User>(
echo D80KBBBBBB
echo %(a:~4,6
)
D80KBBBBBB
%(a:~4,6
C:\User>(
echo D80KCCCCCC
echo %(a:~4,6
)
D80KCCCCCC
%(a:~4,6
C:\User>set substr1=%(a:~4,6)
C:\User>set substr2=~4,6)
C:\User>set substr3=!(a:~4,6)!
C:\User>set substr4=~4,6)!
C:\User>echo %(a:~4,6)
%(a:~4,6)
C:\User>echo ~4,6)
~4,6)
C:\User>echo ~4,6)
~4,6)
C:\User>echo ~4,6)
~4,6)
Любая помощь будет принята с благодарностью.
Ответы
Как мне извлечь подстроку?
Ваш сценарий ужасно сломан, поэтому я его переписал:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3" %%a in (test.txt) do (
set _s1=%%a
set _s2=%%b
set _s3=%%c
echo !_s1:~4!
echo !_s2:~4!
echo !_s3:~4!
)
endlocal
Пример использования:
F:\test>type test.txt
D80KAAAAAA D80KBBBBBB D80KCCCCCC
F:\test>test
AAAAAA
BBBBBB
CCCCCC
F:\test>
Дальнейшее чтение
- Индекс А-Я командной строки Windows CMD | SS64.com
- Команды Windows CMD (по категориям) - Windows CMD - SS64.com
- For / f - Прохождение текста - Windows CMD - SS64.com
- переменная подстрока - Windows CMD - SS64.com
В пакетном файле Pure вы можете сделать что-то вроде этого:
@echo off
Set "InputFile=TPLIST.txt"
Set "OutPutFile=%~dp0Out-Extract.txt"
setlocal enabledelayedexpansion
> "%OutPutFile%" (
@for /f "delims=" %%a in ('Type "%InputFile%"') do (
set "_MyString=%%a"
echo !_MyString:~4!
)
)
endlocal
If Exist "%OutPutFile%" Start "" "%OutPutFile%"
В Powershell, если другой участник хочет протестировать с помощью RegEx:
cls
$MyString = @' D80KAAAAAA D80KBBBBBB D80KCCCCCC D80KDDDDDD D80KEEEEEE D80KFFFFFF D80KXXXXXX D80KYYYYYY D80KZZZZZZ '@ -split [System.Environment]::NewLine $pattern = '(?![D80K]).+'
$MyString | %{ [regex]::matches($_,$pattern) } | %{ $_.Groups[0].Value }
Вы получите результат как для пакета решений, так и для PowerShell:
AAAAAA BBBBBB CCCCCC DDDDDD EEEEEE FFFFFF XXXXXX YYYYYY ZZZZZZ