
У меня есть папка с PDF-файлами с именами типа
page_1_excercise_2.pdf
page_23_excercise_3_4_and_5.pdf
page_456_excercise_16_and_17.pdf
Числа могут содержать 1, 2 или 3 цифры. Мне нужно сгенерировать HTML-код типа:
<a href="pdfs/page_1_excercise_2.pdf">Page 1, Excercise 2</a>
<a href="pdfs/page_23_excercise_3_4_and_5.pdf">Page 23, Excercise 3, 4 and 5</a>
<a href="pdfs/page_456_excercise_16_and_17.pdf">Page 456, Excercise 16 and 17</a>
Есть ли способ сделать это с помощью пакетного файла в Windows?
Вот что мне удалось найти на данный момент:
@echo off
Setlocal EnableDelayedExpansion
for /f "tokens=*" %%i in ('dir /b /a:-d *.pdf') do (
set filename=%%i
set filename=!filename:.pdf=!
set filename=!filename:_= !
echo ^<a href="pdfs/%%i"^>!filename!^</a^> >> files.html)
Все работает нормально, но мне бы хотелось добавить запятую после каждого номера упражнения и преобразовать первую букву (например, «P» в «Page 456...») в заглавную.
решение1
@echo off && setlocal enableextensions enabledelayedexpansion
cd /d "%~dp0" && for %%i in ("%cd%")do set "_dir=%%~nxi"
set "_alf=A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"
>.\Output.html (
findstr /be ^<.*^> "%~f0"
for /f tokens^=1-7*delims^=_ %%i in ('where .:*.pdf')do (
call %:^) "%%~ni" "%%~k" _str_1 _str_2 "%_alf%" && if "%%~xl" == ".pdf" (
echo;^<a href="%_dir%/%%~ni_%%~j_%%~k_%%~nxl"^>!_str_1! %%~j, !_str_2! %%~nl^</a^>
)else if "%%~xn" == ".pdf" (
echo;^<a href="%_dir%/%%~ni_%%~j_%%~k_%%~l_%%~m_%%~nxn"^>!_str_1! %%~j, !_str_2! %%~l %%~m %%~nn^</a^>
)else if "%%~xo" == ".pdf" (
echo;^<a href="%_dir%/%%~ni_%%~j_%%~k_%%~l_%%~m_%%~n_%%~nxo"^>!_str_1! %%~j, !_str_2! %%~l, %%~m %%~n %%~no^</a^>
)
)
echo\^</body^>&echo\^</html^>) & endlocal & goto :eof
%:^)
set "_str#1=%~1" && set "_str#2=%~2" && for %%i in (%~5)do (
if /i "!_str#1:~0,1!" == "%%~i" set "%~3=%%~i!_str#1:~1!"
if /i "!_str#2:~0,1!" == "%%~i" set "%~4=%%~i!_str#2:~1!"
)
exit /b
<!doctype html>
<html>
<head>
<title>Our Funky HTML Page</title>
<meta name="description" content="Our first page">
<meta name="keywords" content="html tutorial template">
</head>
<body>
- Вывод HTML-файла:
<!doctype html>
<html>
<head>
<title>Our Funky HTML Page</title>
<meta name="description" content="Our first page">
<meta name="keywords" content="html tutorial template">
</head>
<body>
<a href="Q1728787/page_1_excercise_2.pdf">Page 1, Excercise 2</a>
<a href="Q1728787/page_23_excercise_3_4_and_5.pdf">Page 23, Excercise 3, 4 and 5</a>
<a href="Q1728787/page_456_excercise_16_and_17.pdf">Page 456, Excercise 16 and 17</a>
</body>
</html>
1.Войдите в папку, в которой находятся файлы PDF, или запустите bat в той же папке:
cd /d "%~dp0"
:: or
cd /d "D:\Full\Path\To\Your\PDFs\Folder"
2.Получить только текущее имя папки и сохранить в переменной:
for %%i in ("%cd%")do set "_dir=%%~nxi"
3.Определяет переменную с заглавными буквами для использования в for
цикле, разделенном запятой:
set "_alf=A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"
4.Перенаправление блока обработки строки в html-файле:
>.\Output.html (
...
...
)
5.Добавьте необходимые HTML-теги в начале каждой строки и после последней строки вашего bat-файла и используйте , findstr /Begin /End <one or more characters>
чтобы отфильтровать их в вашем HTML-файле:
...
findstr /be ^<.*^> "%~f0"
...
<!doctype html>
<html>
<head>
<title>Our Funky HTML Page</title>
<meta name="description" content="Our first page">
<meta name="keywords" content="html tutorial template">
</head>
<body>
6.Используйте for /f
цикл как команду, которая перечисляет только ваши файлы в вашей папке, и предположите в качестве разделителя _
число tokens
от 1 до 8 1-7*
:
for /f tokens^=1-7*delims^=_ %%i in ('where .:*.pdf')do ...
7.Используйте , if
чтобы сравнить действия для каждого возможного токена, если у вас есть его расширение файла, которое будет соответствовать составу строки с запятой или без нее:
....)do ... && if "%%~xl" == ".pdf" (
echo ...
)else if "%%~xn" == ".pdf" (
echo ...
)else if "%%~xo" == ".pdf" (
echo ...
)
8.Для всех случаев, когда расширение равно .pdf
, обработайте строки внутри функции, чтобы заменить первый символ на заглавную букву и уже брать ваши токены и их имена для каждой переменной, в которой вы будете сохранять строки, чтобы составить желаемый вывод:
...)do call %:^) "%%~ni" "%%~k" _str_1 _str_2 "%_alf%" && if ... (
echo;^<a href="%_dir%/%%~ni_%%~j_%%~k_%%~nxl"^>!_str_1! %%~j, !_str_2! %%~nl^</a^>
)else if ... (
echo;^<a href="%_dir%/%%~ni_%%~j_%%~k_%%~l_%%~m_%%~nxn"^>!_str_1! %%~j, !_str_2! %%~l %%~m %%~nn^</a^>
)else if ... (
echo;^<a href="%_dir%/%%~ni_%%~j_%%~k_%%~l_%%~m_%%~n_%%~nxo"^>!_str_1! %%~j, !_str_2! %%~l, %%~m %%~n %%~no^</a^>
)
9.Возьмите строку page
и excercise
преобразуйте ее в функцию вместе с переменной алфавита _alf
в заглавных буквах, где в цикле замена первого символа, который соответствует true в ненасыщенном регистре при использовании, if /i
выполнит подстроку с заменой:
...)do call %:^) "%%~ni" "%%~k" _str_1 _str_2 "%_alf%" ... (
....
)
%:^)
set "_str#1=%~1" && set "_str#2=%~2" && for %%i in (%~5)do (
if /i "!_str#1:~0,1!" == "%%~i" set "%~3=%%~i!_str#1:~1!"
if /i "!_str#2:~0,1!" == "%%~i" set "%~4=%%~i!_str#2:~1!"
)
...
Дополнительные ресурсы:
If /?
Where /?
FindSTR /?
For /?
For /F /?
- Условное исполнение
- Перенаправление команд
|
,<
,>
,2>
, и т. д.
Goto :Label
|Call :Label
If Condition() Else If Condition() Else()
- ЗадержкаРасширения (Ссылка:
!Expand_RunTime_Variable!
) Set variable=variable:substrings
| DOS - Манипуляции со строками- Как интерпретатор команд Windows [
cmd.exe
] анализирует скрипты