3

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

现在我的同事给了我一个包含 100 多行的简单文本(.txt)文件,每行包含一个“励志名言”。

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

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

这是否有可能,或者批处理和 vbscript 都不能做这样的事情?

任何帮助或建议将不胜感激:)

4

3 回答 3

2

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

!QUOTE!= 随机引用
!X!= 感叹号文字
!C!= 插入符号文字(可能不需要)

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

这是一个简单的 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
)

编写的脚本有一些限制:

  • 空白或以开头的模板;行将被跳过
  • 引号文件不能有任何空行或以;
于 2012-06-08T04:21:13.843 回答
1

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

因此,我所拥有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 文档。

这样做很容易。echo !LINE!将上面脚本中以开头的 4 行替换为以下 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
于 2012-06-07T20:14:11.287 回答
0

你需要

  1. 获取文件中的行数。
  2. 获取一个介于 1 和行数之间的随机数 n。
  3. 从文件中获取第 n 行。

使用批处理脚本完成这应该相当简单。不幸的是,我不知道任何 Windows 批处理脚本,所以我无法提供更多建议。

于 2012-06-07T19:59:25.990 回答