在工作中,我们的最终用户使用的是Windows XP并使用Outlook Express。每当用户撰写电子邮件或回复邮件时,Outlook Express会“读取”位于c:\上的静态html文件,并将该内容用作签名。这完全没问题。
现在,我的同事给了我一个包含100多行的简单文本(.txt)文件,每行包含一个“动机报价”。
我的目标是以某种方式从该文本文件中提取随机引用,并插入到静态html签名文件中。
由于我受限于XP原生支持并且无法安装任何其他软件(如python),我认为批处理或vbscript将是正确的选择(如果不是)。我想象一个通过执行的脚本。 Windows任务计划程序每15分钟左右,从.txt文件中随机读取一行,并将其更新为静态html签名文件。
这是否可能,或者既不是批处理也不是vbscript能够做到这样的事情?
任何帮助或建议都将非常感激:)
答案 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)
你需要
使用批处理脚本完成这一点应该相当简单。不幸的是,我不知道任何Windows批处理脚本,因此我无法提供更多建议。