创建批处理/可视化基本脚本以将随机引用放入html文件中

时间:2012-06-07 19:47:27

标签: html vbscript batch-file jscript

在工作中,我们的最终用户使用的是Windows XP并使用Outlook Express。每当用户撰写电子邮件或回复邮件时,Outlook Express会“读取”位于c:\上的静态html文件,并将该内容用作签名。这完全没问题。

现在,我的同事给了我一个包含100多行的简单文本(.txt)文件,每行包含一个“动机报价”。

我的目标是以某种方式从该文本文件中提取随机引用,并插入到静态html签名文件中。

由于我受限于XP原生支持并且无法安装任何其他软件(如python),我认为批处理或vbscript将是正确的选择(如果不是)。我想象一个通过执行的脚本。 Windows任务计划程序每15分钟左右,从.txt文件中随机读取一行,并将其更新为静态html签名文件。

这是否可能,或者既不是批处理也不是vbscript能够做到这样的事情?

任何帮助或建议都将非常感激:)

3 个答案:

答案 0 :(得分:2)

您可以创建一个签名模板,其中包含由延迟扩展替换的嵌入变量。任何感叹号!或插入符^文字也必须编码为变量:

!QUOTE! =随机引用
!X! =感叹号字面值 !C! = caret literal(可能不需要)

可以根据需要将其他变量添加到模板中。

这是一个简单的HTML模板作为示例

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

以下批处理文件将从引用文件中选择一个随机引用,并在替换模板中的变量后写出签名文件。

编辑 - 我通过使用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
)

编写的脚本有一些限制:

  • 将跳过空白或以;开头的模板行
  • 引号文件不得包含任何以;
  • 开头的空行或行

答案 1 :(得分:1)

这是一个批处理脚本,它将在一次传递中从文件中获取一个随机行,然后将其打印到控制台并将其写入文件。

所以我在echo !LINE!的位置就是你编写HTML文件的地方。批量实际上有点痛苦,因为><%^!和其他字符都很特殊,需要使用{转义} {1}}在前面。

^

或者,可能更好,而不是将HTML放在批处理文件中,您可以将它保存在两个单独的文件中。连接两个部分并制作完整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 的文件,其中包含:

sig_file_header.txt

然后我可以创建一个名为<!doctype html> <html> <head> <title>Random Quote</title> </head> <body> <p><strong> 的文件:

sig_file_footer.txt

请注意,当我将这些文件放在一起时,标题后跟页脚,我会得到一个完整的HTML文档。因此,当我将它们组合在一起时,我可以填写脚本在那里选取的行,并获得一个完整的HTML文档,其中包含该行。

这样做很容易。将上面脚本中以 </strong></p> </body> </html> 开头的4行替换为以下3:

echo !LINE!

答案 2 :(得分:0)

你需要

  1. 获取文件中的行数。
  2. 获取1到行数之间的随机数n。
  3. 从文件中获取第n行。
  4. 使用批处理脚本完成这一点应该相当简单。不幸的是,我不知道任何Windows批处理脚本,因此我无法提供更多建议。