3

職場では、エンドユーザーはWindows XPを使用しており、OutlookExpressを使用しています。ユーザーが電子メールを作成したり、電子メールに返信したりするたびに、Outlook Expressはc:\にある静的なhtmlファイルを「読み取り」、その内容を署名として使用します。これは完全に正常に機能します。

今、私の同僚は、100行以上の単純なtext(.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>

次のバッチ ファイルは、見積もりファイルからランダムに見積もりを選択し、テンプレート内の変数を置き換えた後に署名ファイルを書き出します。

編集 - SET /P の代わりに FOR /F を使用して見積もり行を読み取ることで、パフォーマンスを改善し、制限をわずかに変更しました。

@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

これは、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をバッチファイル内に配置する代わりに、2つの部分に分けて別のファイルに保存することができます。2つの部分を結合して完全な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
于 2012-06-07T20:14:11.287 に答える
0

あなたがする必要があります

  1. ファイル内の行数を取得します。
  2. 1 から行数までの乱数 n を取得します。
  3. ファイルから n 行目を取得します。

これは、バッチ スクリプトを使用して達成するのはかなり簡単です。残念ながら、私は Windows バッチ スクリプトをまったく知らないので、これ以上のアドバイスはできません。

于 2012-06-07T19:59:25.990 に答える