3 votes

Création d'un script basique batch/visuel script pour mettre une citation aléatoire dans un fichier html

Au travail, nos utilisateurs finaux utilisent Windows XP et Outlook Express. Chaque fois qu'un utilisateur compose un courriel ou y répond, Outlook Express "lit" un fichier html statique situé dans c:\ et utilise le contenu comme signature. Cela fonctionne parfaitement.

Mon collègue m'a donné un simple fichier texte (.txt) de plus de 100 lignes, chaque ligne contenant une "citation motivante".

Mon objectif est d'extraire une citation aléatoire de ce fichier texte et de l'insérer dans le fichier de signature html statique.

Comme je suis limité à ce que XP supporte nativement et que je ne peux pas installer de logiciel supplémentaire tel que python, je suppose que batch ou vbscript serait le bon choix (si ce n'est le seul). J'imagine un script qui est exécuté via le planificateur de tâches Windows toutes les 15 minutes environ, qui lit aléatoirement une ligne du fichier .txt et la met à jour dans le fichier de signature html statique.

Est-ce possible d'une manière ou d'une autre, ou est-ce que ni batch ni vbscript ne sont capables de faire quelque chose comme ça ?

Toute aide ou conseil sera grandement apprécié :)

2voto

dbenham Points 46458

Vous pouvez créer un modèle de signature contenant des variables intégrées qui sont remplacées par une expansion retardée. Tout point d'exclamation ! ou caret ^ doivent également être encodés comme des variables :

!QUOTE! = La citation aléatoire
!X! = point d'exclamation littéral
!C! = caret littéral (probablement inutile)

Des variables supplémentaires peuvent être ajoutées au modèle si nécessaire.

Voici un modèle HTML trivial à titre d'exemple

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

Le fichier batch suivant sélectionnera une citation aléatoire dans le fichier de citation et écrira le fichier de signature après avoir remplacé les variables dans le modèle.

EDIT - J'ai amélioré les performances et légèrement modifié les limitations en utilisant FOR /F pour lire la ligne de citation au lieu de 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
)

Le script tel qu'il est écrit comporte quelques limitations :

  • Les lignes du modèle qui sont vides ou qui commencent par ; sera ignoré
  • Le fichier de citations ne doit pas comporter de lignes vides ou de lignes commençant par ;

1voto

indiv Points 7403

Voici un script batch script qui récupère une ligne aléatoire d'un fichier en une seule fois, l'imprime sur la console et l'écrit dans un fichier.

Ainsi, là où j'ai echo !LINE! est l'endroit où vous écrivez votre fichier HTML. C'est en fait assez pénible en batch parce que > , < , % , ^ , ! et d'autres caractères sont spéciaux et doivent être échappés à l'aide de la touche ^ devant.

@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

Sinon, et c'est probablement mieux, au lieu de mettre le HTML dans le fichier batch, vous pouvez le garder dans un fichier séparé en deux parties. La colle qui relie les deux morceaux et fait un fichier HTML complet est la ligne que vous avez choisie. Par exemple, je peux créer un fichier appelé sig_file_header.txt qui contient ceci :

<!doctype html>
<html>
    <head>
    <title>Random Quote</title>
    </head>

    <body>
    <p><strong>

Je peux alors créer un fichier appelé sig_file_footer.txt avec ceci :

    </strong></p>
    </body>
</html>

Remarquez que lorsque j'assemble ces fichiers, l'en-tête suivi du pied de page, j'obtiens un document HTML complet. Ainsi, lorsque je les rassemble, je peux y insérer la ligne que le script a choisie et obtenir un document HTML complet avec cette ligne.

C'est facile à faire. Remplacez les 4 lignes commençant par echo !LINE! dans le script ci-dessus avec les 3 suivants :

type sig_file_header.txt > new_signature_file.html
echo !LINE! >> new_signature_file.html
type sig_file_footer.txt >> new_signature_file.html

0voto

Thom Smith Points 8204

Vous devez

  1. Obtenir le nombre de lignes dans le fichier.
  2. Obtenir un nombre aléatoire n entre 1 et le nombre de lignes.
  3. Récupère la nième ligne du fichier.

Cela devrait être relativement simple à réaliser avec un script par lot. Malheureusement, je ne connais pas de script batch pour Windows, je ne peux donc pas vous donner plus de conseils.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X