Файл .bat, который добавляет текст в каждую строку в .txt, включая часть самой строки - PullRequest
0 голосов
/ 25 января 2019

Мне нужно создать несколько .cbc файлов для использования с Caliber. Они в основном переименовываются в .zip файлы, содержащие каждую главу в другой .zip и текстовый файл с именем comics.txt, который указывает на каждое имя файла и дает ему имя главы для оглавления.

Я уже автоматизировал большую часть процесса с помощью набора файлов .bat. Однако есть раздражение, я не знаю, как начать исправление.

Текстовый файл должен иметь следующий формат для каждой строки:

[Filename of zip containing chapter].zip:Chapter xxx

Например:

Serie name c015 v03.zip:Chapter 15
Serie name c016 v03.zip:Chapter 16
Serie name c016.1 v03.zip:Chapter 16.1

Для этой специфической части процесса я использую следующий .bat:

dir /b *.zip > comic.txt
(for /f "delims=" %%i in (comic.txt) do @echo %%i:Chapter )>comics.txt
del comic.txt
start comics.txt

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

Есть ли какой-нибудь способ для .bat "взять" текст из каждого имени файла и добавить его после ": Chapter", чтобы вместо получения

Serie name c015 v03.zip:Chapter 
Serie name c016 v03.zip:Chapter 
Serie name c016.1 v03.zip:Chapter  

Я сразу получаю:

Serie name c015 v03.zip:Chapter 15 
Serie name c016 v03.zip:Chapter 16 
Serie name c016.1 v03.zip:Chapter 16.1 

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Я бы, вероятно, выполнил вашу задачу с помощью следующего скрипта (назовем его extract-chapter-numbers.bat).Это предполагает, что часть главы (c, за которой следует что-то числовое) как последний или следующий за последним разделенный пробелами токен в именах файлов .zip;если это предпоследний, последним будет v, за которым следует что-то числовое (если эта часть может быть чем угодно, просто замените строку set "_FILTER_V=v[0-9\.][0-9\.]*" в скрипте на set "_FILTER_V=.*").

Итак, вот код:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ROOT=."                    & rem // (directory containing the files to process)
set "_FILTER_C=c[0-9\.][0-9\.]*" & rem // (`findstr` expression for the chapter part)
set "_FILTER_V=v[0-9\.][0-9\.]*" & rem // (`findstr` expression for the version part)
set "_FILTER_E=zip"              & rem // (`findstr` expression for the file extension)
set "_PREFIX=Chapter"            & rem // (string to precede the chapter number with)

rem /* Loop through all matching files that contain a chapter number (preceded by `c`)
rem    and an optional version code preceded by `v`): */
for /F delims^=^ eol^= %%J in ('
    dir /B /A:-D "%_ROOT%\* c*.%_FILTER_E%" ^| findstr /I /R /E ^
        /C:"..*  *%_FILTER_C%  *%_FILTER_V%\.%_FILTER_E%" ^
        /C:"..*  *%_FILTER_C%\.%_FILTER_E%" ^
') do (
    rem // Store current file name, reset some variables:
    set "LINE=%%J" & set "LAST=" & set "NEXT="
    rem /* Loop through all space-separated parts of the base file name
    rem    (note that `,`, `;`, `=` are also treated as separators): */
    for %%I in (%%~nJ) do (
        rem // Store the last and the next-to-last parts:
        call set "NEXT=%%LAST%%" & set "LAST=%%I"
    )
    setlocal EnableDelayedExpansion
    rem /* Check whether the last or the next-to-last part begins with `c`, and if so,
    rem    extract the following numeric part: */
    if /I "!LAST:~,1!"=="c" (
        set "CHPT=!LAST:~1!"
    ) else if /I "!NEXT:~,1!"=="c" (
        set "CHPT=!NEXT:~1!"
    ) else (
        set "CHPT="
    )
    rem // Return the original file name, together with a prefix and chapter number:
    if defined CHPT echo(!LINE!:!_PREFIX! !CHPT!
    endlocal
)

endlocal
exit /B

Если вы запустите его из каталога, содержащего ваши файлы примеров:

Serie name c015 v03.zip
Serie name c016 v03.zip
Serie name c016.1 v03.zip

Выводбудет:

Serie name c015 v03.zip:Chapter 015
Serie name c016 v03.zip:Chapter 016
Serie name c016.1 v03.zip:Chapter 016.1

Чтобы сохранить это в текстовом файле (скажем, comics.txt), запустите скрипт следующим образом:

extract-chapter-numbers.bat > comics.txt
0 голосов
/ 25 января 2019

Единственная задача - найти номер главы.Помогает, что он всегда начинается с <space>c

@echo off
setlocal enabledelayedexpansion

REM following two lines to create test environment:
for /l %%a in (14,1,20) do break>"The Hulk The Beginning c0%%a v03.zip"
break>"The Hulk The Beginning c016.1 v03.zip"
(
REM for every .zip file:
for %%a in (*.zip) do (
  for %%b in (%%~na) do ( 
   REM find a token which starts with 'c' and at least one number:
   echo %%b|findstr /b "c[0-9][0-9]*" >nul && set chapter=%%b
  )
  echo %%~nxa:Chapter !chapter:~1!
))>comics.txt
...