【问题标题】:Creating a batch/visual basic script to put a random quote into an html file创建批处理/视觉基本脚本以将随机引用放入 html 文件
【发布时间】:2012-06-07 19:47:26
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: html vbscript batch-file jscript


【解决方案1】:

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

!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
)

编写的脚本有一些限制:

  • 将跳过空白或以; 开头的模板行
  • 报价文件不能有任何空行或以; 开头的行

【讨论】:

  • 聪明!模板方法是我的第一个想法,但我从来不知道如何使用批处理文件来做到这一点。感谢您的想法。
【解决方案2】:

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

所以我有echo !LINE! 的地方就是你编写 HTML 文件的地方。因为&gt;&lt;%^!等字符比较特殊,需要在前面加上^进行转义。

@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

【讨论】:

  • 这似乎正是我所需要的!惊人的!虽然我有点不确定重写我的签名文件是什么意思。签名文件是一个静态 html 文件,它不能包含任何花哨的东西,如 php 或 Outlook Express 将忽略它。您如何建议我将 random_lines.txt 的内容注入到我的 signature.html 文件中?
  • 我更新了我的代码以编写一个 HTML 文件。批处理并不有趣,因为您必须使用^ 乱扔标记,以便批处理文件不会尝试评估后面的字符。我不确定是否有一个简单的解决方案可以将该行批量写入 HTML 文件。简单的搜索和替换在批处理文件中并不是那么简单...
  • 好的,更简单的 HTML 处理方法是将 HTML 文件手动拆分为 2 部分,然后将它们与批处理文件一起放回原处。将文件重新组合在一起时,批处理文件可以方便地插入它选择的行。我更新了答案以说明我的意思。
  • @Paul:“重写”是指“覆盖”。用批处理文件创建的新签名文件覆盖旧签名文件。
【解决方案3】:

你需要

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

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

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2015-11-16
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多