Ниже приведен довольно надежный сценарий, который извлекает информацию о цвете из текстового файла, который предоставляется в качестве аргумента командной строки. Текстовый файл может содержать даже несколько строк. Скрипт обрабатывает только строки, которые начинаются с литеральной строки FILE:
, а затем строка, которая не содержит :
, \
, ПРОСТРАНСТВО (например, 71.jpg
в вашем примере). Так вот код, в том числе некоторых пояснительных rem
комментариев:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_FILE=%~1" & rem // (`%~1`: specify input file by command line argument)
rem // Read the input file line by line, split off prefix (`FILE:`):
for /F "tokens=2,* eol=: delims=: " %%K in ('
rem/ Filter for lines with matching prefix: ^&^
findstr /R /C:"^FILE:[^:\\ ][^:\\ ]* *[0-9][0-9]*: *" "%_FILE%"
') do (
rem // Return prefixed file name at `STDERR` stream:
>&2 echo **** %%K ****
rem // Process current line without prefix in sub-routine:
call :EXTRACT "%%L"
)
endlocal
exit /B
:EXTRACT val_string
setlocal DisableDelayedExpansion
rem // Store string argument in variable:
set "LINE=%~1"
setlocal EnableDelayedExpansion
:EXTRACT_LOOP
rem // Check whether beginning of string matches a colour block:
cmd /V /C echo(^^!LINE^^! | (> nul^
findstr /R /I /C:"^[0-9][0-9]*: *(*[0-9][0-9]* *, *[0-9][0-9]* *, *[0-9][0-9]* *) *#[0-9A-F][0-9A-F]* *[a-z][a-z]* *"
) && (
rem // String matches, so continue; extract first number and word:
for /F "tokens=1,6,* delims=:(,)# " %%A in ("!LINE!") do (
endlocal
rem // Return number and word extracted from colour block:
echo(%%A: %%B
rem // Assign remainder to variable:
set "LINE=%%C"
setlocal EnableDelayedExpansion
)
rem // Jump back to beginning of loop:
goto :EXTRACT_LOOP
)
endlocal
endlocal
exit /B
Предположив пакетного файл сохраняются как extract-colours.bat
и текстовый файл называется sample.txt
запустить скрипт так:
extract-colours.bat "sample.txt"
Если текстовый файл содержит ваш пример данных, вывод будет таким:
**** 71.jpg ****
88557: black
535: blue
3617: lime
315: cyan
9674: red
214: magenta
5552: yellow
11536: white
Чтобы сохранить результат в другой текстовый файл, используйте эту COMAND строку:
extract-colours.bat "sample.txt" > "result.txt"
Поскольку строки заголовка части между парой ****
(71.jpg
здесь) возвращается в STDERR потока, в отличие от другие строки, которые выводятся в STDOUT, этот заголовок не включен в файл; чтобы включить его, добавьте 2>&1
в вышеупомянутую командную строку; если нет, чтобы подавить заголовок в окне консоли, вместо этого добавьте 2> nul
. Прочтите эту статью, чтобы узнать, что все это значит: Redirection.
Это все на одной линии? Откуда вы знаете, когда выполняется цветовая секция? – SomethingDark
Обратите внимание, что StackOverflow не является бесплатной службой записи кода!Поделитесь своими усилиями и четко опишите, с чем вы столкнулись! Пожалуйста, прочитайте [тур] и узнайте, как использовать этот сайт! – aschipfl