Создание пакетного/визуального базового скрипта для помещения случайной цитаты в html-файл

На работе наши конечные пользователи используют Windows XP и Outlook Express. Всякий раз, когда пользователь составляет электронное письмо или отвечает на него, Outlook Express «читает» статический HTML-файл, расположенный на c:\, и использует содержимое в качестве подписи. Это прекрасно работает.

Теперь мой коллега дал мне простой текстовый (.txt) файл с более чем 100 строками, каждая из которых содержала «мотивационную цитату».

Моя цель состоит в том, чтобы каким-то образом извлечь случайную цитату из этого текстового файла и вставить ее в статический файл html-подписи.

Поскольку я ограничен тем, что изначально поддерживает XP, и не могу установить какое-либо дополнительное программное обеспечение, такое как python, я предполагаю, что правильным выбором будет либо пакетный режим, либо vbscript (если не единственный). Я представляю скрипт, который выполняется через. планировщик заданий Windows примерно каждые 15 минут, который случайным образом считывает строку из .txt-файла и обновляет ее в файле статической html-подписи.

Возможно ли это каким-либо образом, или ни пакет, ни vbscript не способны сделать что-то подобное?

Любая помощь или совет будут БОЛЬШИМ образом оценены :)


person Amivit    schedule 07.06.2012    source источник
comment
Вот некоторый jscript, который решает аналогичную проблему и не требует особых усилий для адаптации к описанной вами проблеме: stackoverflow.com/questions/ 8422231/   -  person indiv    schedule 08.06.2012


Ответы (3)


Вы можете создать шаблон подписи со встроенными переменными, которые заменяются отложенным расширением. Любые восклицательные знаки ! или символы вставки ^ также должны быть закодированы как переменные:

!QUOTE! = случайная кавычка
!X! = литерал восклицательного знака
!C! = литерал знака вставки (вероятно, не требуется)

При необходимости в шаблон можно добавить дополнительные переменные.

Вот тривиальный HTML-шаблон в качестве примера

<!X!doctype html>
<html>
  <head>
    <title>Random Quote</title>
  </head>
  <body>
    <p><strong>!QUOTE!</strong></p>
  </body>
</html>

Следующий пакетный файл выберет случайную цитату из файла цитаты и запишет файл подписи после замены переменных в шаблоне.

EDIT. Я улучшил производительность и немного изменил ограничения, используя FOR /F для чтения строки цитаты вместо SET /P.

@echo off
setlocal disableDelayedExpansion

::Define the files
set quoteFile="quotes.txt"
set signatureTemplate="template.txt"
set signatureFile="signature.html"

::Define constants for ! and ^ substitutions in template
set "X=!"
set "C=^"

::Count the number of quotes
for /f %%N in ('find /c /v "" ^<%quoteFile%') do set quoteCount=%%N

::Pick a random number of quotes to skip
set /a "skip=%random% %% %quoteCount%"

::Load the selected quote into a variable
if %skip% gtr 0 (set skip=skip=%skip%) else (set skip=)
for /f "usebackq %skip% delims=" %%A in (%quoteFile%) do (
  set quote=%%A
  goto :break
)
:break

::Read the signature template and write the signature file
::Delayed expansion will automatically replace !quote!, !X! and !C!
setlocal enableDelayedExpansion
>%signatureFile% (
  for /f "usebackq delims=" %%A in (%signatureTemplate%) do echo %%A
)

В написанном сценарии есть несколько ограничений:

  • Строки шаблона, которые пусты или начинаются с ;, будут пропущены.
  • В файле котировок не должно быть пустых строк или строк, начинающихся с ;.
person dbenham    schedule 08.06.2012
comment
Умная! Шаблонный подход был моей первой мыслью, но я никогда не знал, как это сделать с пакетным файлом. Спасибо за идеи. - person indiv; 08.06.2012

Вот пакетный скрипт, который будет получать случайную строку из файла за один проход, а затем выводить ее на консоль и записывать в файл.

Итак, где у меня есть echo !LINE!, вы бы написали свой HTML-файл. На самом деле это довольно болезненно в пакетном режиме, потому что >, <, %, ^, ! и другие символы являются специальными, и их нужно экранировать с помощью ^ впереди.

@echo off
SET /A LINE_NUM=0
SET LINE=

setlocal EnableDelayedExpansion

for /F "delims=" %%l in (random_lines.txt) do (
        call:rand 0 !LINE_NUM!
        IF !RAND_NUM! LSS 1 (
                SET LINE=%%l
        )
        SET /A LINE_NUM=!LINE_NUM! + 1
)

echo !LINE!
echo ^<^^!doctype html^>^<html^>^<head^>^<title^>Random Quote^</title^>^</head^>
 > %OUT_FILE%
echo ^<body^>^<p^>^<strong^>!LINE!^</strong^>^</p^> >> %OUT_FILE%
echo ^</body^>^</html^> >> %OUT_FILE%

goto :EOF

REM rand()
REM Input: %1 is min, %2 is max
REM Output: RAND_NUM is set to a random number from min through max.
:rand
SET /A RAND_NUM=%RANDOM% * (%2 - %1 + 1) / 32768 + %1
goto :EOF

В качестве альтернативы и, вероятно, лучше, вместо того, чтобы помещать HTML в пакетный файл, вы можете сохранить его в отдельном файле в виде двух частей. Клей, который соединяет две части и создает полный HTML-файл, — это выбранная вами строка. Например, я могу создать файл с именем sig_file_header.txt, содержащий следующее:

<!doctype html>
<html>
    <head>
    <title>Random Quote</title>
    </head>

    <body>
    <p><strong>

Затем я могу создать файл с именем sig_file_footer.txt следующим образом:

    </strong></p>
    </body>
</html>

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

Сделать это легко. Замените 4 строки, начинающиеся с echo !LINE! в приведенном выше сценарии, на следующие 3:

type sig_file_header.txt > new_signature_file.html
echo !LINE! >> new_signature_file.html
type sig_file_footer.txt >> new_signature_file.html
person indiv    schedule 07.06.2012
comment
Кажется, это может быть ИМЕННО то, что мне нужно! Потрясающий! Хотя я немного не уверен, что вы подразумеваете под переписыванием моего файла подписи. Файл подписи представляет собой статический файл html, который не может включать ничего необычного, такого как php или Outlook Express, просто проигнорирует его. Как вы предлагаете мне вставить содержимое random_lines.txt в мой файл signal.html? - person Amivit; 08.06.2012
comment
Я обновил свой код, чтобы написать файл HTML. Пакетная обработка не подходит для этого, потому что вам нужно засорить разметку ^, чтобы пакетный файл не пытался оценить следующий за ним символ. Я не уверен, что существует простое решение для пакетной записи строки в HTML-файл. Простой поиск и замена не так просты в пакетном файле... - person indiv; 08.06.2012
comment
Хорошо, более простой способ сделать HTML — просто разделить файл HTML на 2 части вручную и собрать их вместе с пакетным файлом. При объединении файлов пакетный файл удобно вставляет выбранную строку. Я обновил ответ, чтобы показать, что я имею в виду. - person indiv; 08.06.2012
comment
@Paul: И под перезаписи я имею в виду перезапись. Перезапишите старый файл подписи новым, созданным вашим пакетным файлом. - person indiv; 08.06.2012

Вам нужно будет

  1. Получить количество строк в файле.
  2. Получите случайное число n от 1 до количества строк.
  3. Получить n-ю строку из файла.

Это должно быть достаточно просто сделать с помощью пакетного сценария. К сожалению, я не знаю ни одного пакетного скрипта для Windows, поэтому больше ничего не могу посоветовать.

person Thom Smith    schedule 07.06.2012