Пакет: поиск строки для прокрутки строк выше и записи результатов в новый файл

Я успешно написал script, который берет строку для поиска в определенном файле, а затем выводит строку, в которой он сначала встречается, и затем я принимаю это значение в цикле for и пропускает синтаксический анализ этого числа строк и записать его содержимое в новый файл. Однако я не получаю пустые строки, которые я нахожу довольно проблематичными для решения.

Строка, которую я ищу, это "/" ", кэширует номер строки, где она встречается, затем накапливает ее в переменной с запятой. Затем я снова беру эту переменную в цикл for и снова беру первое значение в качестве моего последнего" пропустить это число строк" ​​- переменную, которую затем я использую в нижнем цикле for, который снова считывает этот файл и записывает его значения в новые файлы и пропускает это количество строк в начале файла.

Таким образом, это часть script, которая делает то, что я описываю выше:

setlocal enabledelayedexpansion
setlocal enableextensions
set live_svn_access_file=c:\csvn\data\conf\svn_access_file
set of=c:\test.txt

for /f "Tokens=1 Delims=:" %%i in ('findstr /n /c:"/]" %live_svn_access_file%') do (
    rem cache value in a variable
    set line=%%i
    rem accumulate data to one variable
    if defined line set skip=!skip!, !line!
)
rem strip first two characters in variable ", "
set skip=!skip:~2!
rem strip everything except first value in array
for /f "Tokens=1 Delims=," %%i in ('echo !skip!') do (
    rem store value in a variable
    set skip=%%i
)
rem calculate lines - 1 (arithmetic)
set /a skip=!skip!-1
set skip=!skip!

if not defined skip set error=Could not automatically find which parts to skip from live svn_access_file && goto error-handler

for /f "Tokens=* Delims= Skip=%skip%" %%i in (%live_svn_access_file%) do (
    rem cache value in a variable
    set read-input=%%i
    rem write and append content of variable to output-file
    echo !read-input! >> %of%
)

Я переписал script, чтобы соответствовать рабочему, это измененный script:

setlocal enabledelayedexpansion
setlocal enableextensions
set live_svn_access_file=c:\csvn\data\conf\svn_access_file
set of=c:\test.txt

for /f "Tokens=1 Delims=:" %%i in ('findstr /n /r /c:"\[..*\]" %live_svn_access_file%') do (
    rem cache value in a variable
    set line=%%i
    rem accumulate data to one variable
    if defined line set skip=!skip!, !line!
)
rem take the 2nd sections linenumber into a variable, skipping the first [*foo*]
for /f "Tokens=2 Delims=," %%i in ('"echo !skip!"') do (
    rem store value in a variable
    set skip=%%i
)
rem add 1 line to skip from retrieved value
set /a skip=!skip!-1

rem verify that number of lines to skip has been successfully retrieved, if not go to error-handler
if not defined skip set error=Could not automatically find which parts to skip from live svn_access_file && goto error-handler
if ["%skip%"] LSS ["1"] set error=Number of lines to skip was less than 1, this will most likely fail && goto error-handler

rem read live svn_access_file, but skip X-lines and write to output-file
setlocal DisableDelayedExpansion
for /f "usebackq Delims= Skip=%skip%" %%i in (`"findstr /n ^^ %live_svn_access_file%"`) do (
    rem cache value in a variable
    set read-input=%%i
    rem write and append content of variable to output-file
    setlocal EnableDelayedExpansion
    rem strip line number prefix
    set read-input=!read-input:*:=!
    rem write read lines to output-file
    echo(!read-input!>>%of%
    endlocal
)

Ответ 1

У вас есть две основные проблемы: FOR/F не может читать пустые строки (как вы обнаружите), и если вы используете задержанное расширение, у вас возникли проблемы с восклицательными знаками и каретами в строке set read-input=%%i.

Вы можете решить обе, пустые строки с префиксом каждой строки с номером строки с помощью findstr. Второй - с отложенной техникой переключения.

SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!" This removes the prefix
    echo(!var!
    ENDLOCAL
)