<!--
  canonical-url: https://www.avonture.be/fr/blog/vbs-auto-update
  published:     2024-03-19
  This is a static plain-Markdown mirror generated at build time.
  Visit the canonical URL above for the fully rendered page, with images and interactive components.
-->

# VBS - Script d'auto-mise à jour

> Automatisez les mises à jour de vos scripts console VBS (Visual Basic Script) ! Découvrez comment créer un fichier VBS qui se met à jour lui-même, se connecte à GitHub, vérifie les nouvelles versions et s'écrase.

---
![VBS - Script d'auto-mise à jour](/img/v2/vbs.webp)

**TL;DR**

Cet article montre comment donner à un fichier VBScript (VBS) la capacité de se mettre à jour lui-même : à chaque exécution, le script télécharge son propre code source depuis une URL GitHub publique, la compare à la copie locale et s'écrase si une version plus récente est trouvée — ce qui permet aux utilitaires `.vbs` distribués de rester à jour sans redistribution manuelle.

Avant de passer à [WSL2](/blog/tags/wsl) et à la console Linux, j'écrivais des scripts VBS de temps en temps. Ça ressemble à du VBA, mais pour la console DOS.

Un script VBS pour DOS est un fichier texte écrit dans le langage de programmation Visual Basic Scripting Edition (VBScript), exécutable directement depuis la ligne de commande DOS. Il permet d'automatiser des tâches et d'effectuer des opérations répétitives sur votre ordinateur.

C'est exactement comme les scripts [Linux Bash](/blog/tags/bash), mais pour DOS.

*Trois de mes utilitaires VBS qui bénéficieraient précisément de ce mécanisme d'auto-mise à jour : [VBS - Retrieve the list of fields in a MS Access Database](/blog/vbs-msaccess-get-fields), [Export MS Access objects](/blog/vba-access-export) et [VBS - Get list of files and generate a CSV](/blog/vbs-files-csv).*

Pensez-vous qu'il serait possible de proposer une fonction d'auto-mise à jour dans de tels scripts ? La réponse est oui.

Imaginez un script appelé `get_folder_size.vbs` que vous avez publié publiquement sur GitHub (source <https://github.com/cavo789/vbs_utilities/blob/master/src/folders/get_folder_size/get_folder_size.vbs>).

Quelqu'un le télécharge sur son ordinateur et prend plaisir à l'utiliser.

En y ajoutant une nouvelle fonction d'*auto-mise à jour*, à chaque démarrage du script, une connexion à GitHub est d'abord établie, le script est téléchargé depuis là, et une vérification est faite pour voir si la version téléchargée est différente ; si c'est le cas, le script s'écrase lui-même.

Voici le contenu d'une telle fonction :

**get\_folder\_size.vbs**

```vbs
' -----------------------------------------------------------------
'
' Connect to GitHub, get the raw version of a file and download it
'
' The script will check for newer version on GitHub and if
' there is one, the script will overwrite himself with
' that newer version.
'
' Based on a script of
' @author Michi Lehenauer §https://github.com/michiil)
' then modified by Christophe Avonture
'
' @src https://github.com/michiil/vbs_scrips/blob/master/WZV-Excel.vbs
' -----------------------------------------------------------------

' The content to download
url = "https://raw.githubusercontent.com/cavo789/vbs_utilities/master/src/folders/get_folder_size/get_folder_size.vbs"

Set req = CreateObject("Msxml2.ServerXMLHttp.6.0")

req.setTimeouts 500, 500, 500, 500

' If you're behind a firewall, uncomment the following line
' and mention the proxy address and port
'req.setProxy 2, "your.proxy.net:8080", ""

req.open "GET", url, False
req.send

If Err.Number = 0 Then
  If req.Status = 200 Then
    ' Get the content, just downloaded
    downloadedContent = req.responseText

    ' Get the original content, this script

    scriptName = wScript.ScriptFullName
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set textFile = objFSO.OpenTextFile(scriptName, 1)
    originalContent = textFile.ReadAll
    textFile.Close

    ' Compare if the two contents are different
    If (originalContent <> downloadedContent) Then
      ' If yes, for instance, rewrite this script by
      ' the new content ==> auto-update
      Set textFile = objFSO.OpenTextFile(scriptName, 2)

      textFile.Write (downloadedContent)
      textFile.Close

      'wScript.echo scriptName & " has been updated"
    End If

    Set textFile = Nothing
    Set objFSO = Nothing

  End If
Else
    ' Ok, in case of error, don't panic, just do nothing
    Err.Clear
End If
```
