Trucs et astuces

 

 

accueil | console | VBScript | PowerShell | php | MySQL | documentation | formation  | trucs et astuces | exemples | glossaire

 

 

 

 

Pièges à c... (<-- cliquer)

 

Ne pas utiliser la gestion des fenêtres de Windows avec WScript en mode console

Supprimer la bannière Microsoft (R) Windows Script Host

Afficher la date et l'heure

Changer le format de la date

Passer un ou plusieurs paramètres à une fonction dans un script

Récupérer la valeur renvoyée par une fonction

Remplacer une chaîne de caractères par une autre

Ecrire dans une feuille Excel

Récupérer le nom et la version du moteur de script utilisé dans un script

Trouver la position d'un substring dans un string

Exécuter une commande de la console à partir d'un script VBS

Lire la base d'indexation de Windows Desktop Search

Qu'est-ce que c'est que ce ",,48" trouvé dans des SELECT WMI ?

Afficher la liste des drivers

Connaître son système

Gérer les services

Lister les évenements du log système des applications de ce jour

Ecrire un message dans le journal des évènements

Liste des process

Gestion des journaux d'évènements

Liste de la file d'attente batch

Gestion des disques

Gestion du système de fichiers

Contrôler la bonne exécution de la demande de création d'un objet WMI

Avoir des accents dans et hors de ses scripts de console

Pour ajouter un programme au clic droit > Envoyer vers

Chronométrer un traitement

Connaître le nom de la procédure en cours d'exécution

Trier des données

Ecrire en couleurs dans une fenêtre de la console (débutants)

Ecrire en couleurs dans une fenêtre de la console (experts)

Rechercher des fichiers dans la base d'indexation de Windows Search

Dimensionner une matrice (array) de façon dynamique

Afficher les caractéristiques d'un écran

Connaître le nombre de fichiers indexés par Windows Search

WshShell.Run et WshShell.Exec

 

 


 

Pièges à c...

 

Le signe = réalise une comparaison BINAIRE, et non numérique, même si les deux variables contiennent des nombres et si la fonction IsNumeric le confirme !

 

Exemple :

 

equal_bug.vbs

if wscript.arguments.count = 1 then
  i = wscript.arguments(0)
  wscript.echo "i has been passed via command line" & vbcrlf
else
  i=1
  wscript.echo "i has been hardcoded" & vbcrlf
end if

j=1

if i=j then
  wscript.echo "i = " & i
  wscript.echo "IsNumeric(i): " & isNumeric(i)
  wscript.echo "j = " & j
  wscript.echo "IsNumeric(j): " & isNumeric(j)
  wscript.echo "i = j is true"
else
  wscript.echo "i = " & i
  wscript.echo "IsNumeric(i): " & isNumeric(i)
  wscript.echo "j = " & j
  wscript.echo "IsNumeric(j): " & isNumeric(j)
  wscript.echo "i = j is NOT true"
end if

if wscript.arguments.count = 1 then
  wscript.echo vbcrlf & "i, passed via command line, has now value i=0+i"
  i = 0+i
  if i=j then
    wscript.echo "i = " & i
    wscript.echo "IsNumeric(i): " & isNumeric(i)
    wscript.echo "j = " & j
    wscript.echo "IsNumeric(j): " & isNumeric(j)
    wscript.echo "i = j is true"
  else
    wscript.echo "i = " & i
    wscript.echo "IsNumeric(i): " & isNumeric(i)
    wscript.echo "j = " & j
    wscript.echo "IsNumeric(j): " & isNumeric(j)
    wscript.echo "i = j is not true"
  end if
end if

 

Résultat :

 

C:\vbs>equal_bug
i has been hardcoded

i = 1
IsNumeric(i): Vrai
j = 1
IsNumeric(j): Vrai
i = j is true
 

 


C:\vbs>equal_bug 1
i has been passed via command line

i = 1
IsNumeric(i): Vrai
j = 1
IsNumeric(j): Vrai
i = j is NOT true

i, passed via command line, has now value i=0+i
i = 1
IsNumeric(i): Vrai
j = 1
IsNumeric(j): Vrai
i = j is true

C:\vbs>

 

Réponse des spécialistes : "C'est normal, 1 en binaire vaut 00000001 et 1 en ASCII vaut 00110001, ils sont donc différents."

 

 

[début]


 

Ne pas utiliser la gestion des fenêtres de Windows avec WScript en mode console

 

Utiliser l'option H: (Host) des commandes wscript ou cscript

 

Exemple :

 

C:\vbs>Cscript //H:cscript //S

L'environnement d'exécution de scripts Windows est maintenant fixé à "cscript.exe".

 

Remarque 1 : Si on avait utilisé C:\>wscript au lieu de cscript, on aurait obtenu le même résultat mais le message aurait été affiché dans une "boîte de messages" au lieu d'être affiché dans la fenêtre de la console :

 

 

Remarque 2 : Sans cette définition d'environnement d'exécution, les scripts VBS appelés par Wscript gèrent leurs entrées/sorties avec des fenêtres de Windows (Dialog Box et Message Box), ceux appelés par Cscript gèrent leurs entrées/sorties dans la fenêtre de la console d'où ils ont été lancés.

 

Remarque 3 : le paramètre "//S" permet de sauvegarder cette configuration lorsque la fenêtre de commande est fermée.

 

[début]


 

Supprimer la bannière...

 

Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. Tous droits réservés.

 

...à l'exécution d'un script par Cscript

 

Utiliser l'option /nologo

 

Exemple :

 

C:\vbs>cscript /nologo monScript.vbs

 

ou

 

Ouvrir une fenêtre Console

Lancer wscript.exe

Décocher la case : "Afficher le logo lorsque le script est exécuté dans la console de commande"

 

 

[début]


 

Afficher la date et l'heure

 

On utilise les fonctions Date, Time et Now.

 

Exemple :

 

Nous_sommes_le.vbs

 

dim currDate, currTime, currDateTime
currDate = Date
currTime = Time

currDateTime = Now
wscript.echo "Nous sommes le " & currDate & " et il est " & currTime

wscript.echo "Autrement dit : " & currDateTime
wscript.quit

 

Résultat :

 

C:\vbs>nous_sommes_le
Nous sommes le 18/10/2010 et il est 22:07:25
Autrement dit : 18/10/2010 22:07:25

 

[début]


 

Changer le format de la date

 

On utilise la fonction FormatDateTime

 

Exemple :

 

DateDisplay.vbs

 

wscript.echo "FormatDateTime function demo" & vbcrlf
For i = 0 to 4
  currDate = GetCurrentDate(i)
  wscript.echo "Format " & i & ": " & currDate
Next
wscript.quit

 

Function GetCurrentDate(intFormat)
  GetCurrentDate = FormatDateTime(Now, intFormat)
End Function

 

Résultat :

 

C:\vbs>datedisplay
FormatDateTime function demo

Format 0: 19/10/2010 11:44:58
Format 1: mardi 19 octobre 2010
Format 2: 19/10/2010
Format 3: 11:44:58
Format 4: 11:44

 

[début]


 

Passer un ou plusieurs paramètres à une fonction dans un script

 

MyFunction param_1, param_2,... param_n

 

ou

 

Call MyFunction(param_1, param_2,... param_n)

 

Les deux syntaxes sont possibles, la seconde est plus facile à lire pour le debugging.

 

[début]


 

Récupérer la valeur renvoyée par une fonction

 

Exemple :

 

ShowSum.vbs

 

Result = ShowSum(1,2)
wscript.echo "The sum of 1 and 2 is " & Result
wscript.quit

Function ShowSum(value1,value2)
  Dim sum
  sum = value1 + value2
  ShowSum = sum
End Function

 

Résultat :

 

C:\vbs>showsum
The sum of 1 and 2 is 3

 

[début]


 

Remplacer une chaîne de caractères par une autre

 

On utilise l'objet RegExp ou la fonction Replace

 

Exemple avec l'objet RegExp :

 

ReplaceString.vbs

 

wscript.echo "Result : " & ReplaceTest("fox", "cat")

Function ReplaceTest(strPattern, strReplaceString)
  Dim regEx, string_1
  string_1 = "The quick brown fox jumps over the lazy dog."
  wscript.echo "Original text: " & string_1
  Set regEx = New RegExp
  regEx.Pattern = strPattern
  regEx.IgnoreCase = True
  wscript.echo "let's replace ""fox"" by ""cat"""
  ReplaceTest = regEx.Replace(string_1, strReplaceString)
End Function

 

Résultat :

 

C:\vbs>replaceString
Original text: The quick brown fox jumps over the lazy dog.
let's replace "fox" by "cat"
Result       : The quick brown cat jumps over the lazy dog.

 

Exemple avec la fonction Replace

 

ReplaceString_2.vbs

 

Dim strSource, str_1, str_2, result

strSource = "The quick brown fox jumps over the lazy dog."
wscript.echo strSource

str_1 = "FoX" 'note the mixed case
str_2 = "cat"

' Let's replace "fox" by "cat" in the strSource string
' (flag vbTextCompare disable case sensitivity)
result = Replace(strSource, str_1, str_2, 1, -1, vbTextCompare)
wscript.echo result
wscript.quit

 

Résultat :

 

C:\vbs>replaceString_2
The quick brown fox jumps over the lazy dog.
The quick brown cat jumps over the lazy dog.

 

[début]


 

Ecrire dans une feuille Excel

 

Excel_from_VBS.vbs

 

Option Explicit
Dim objExcel, objExcelSheet, yesNo, closeIt, objFso, objFile, strFilename

strFilename = "C:\users\Didier\TEST.XLS"
wscript.echo "*******"
wscript.echo "WARNING - This DEMO script deletes a file named " & strFilename
wscript.echo "*******"
wscript.stdout.Write("Do you want to continue (Y/N): ")
yesNo = Ucase(wscript.stdin.readline)
if yesNo <> "Y" then
  wscript.echo "Script aborted by the user"
  wscript.quit
end if

wscript.echo "Creating Excel instance"
Set objExcel = CreateObject("Excel.Application")

wscript.echo "Creating Excel Sheet object"
Set objExcelSheet = CreateObject("Excel.Sheet")
objExcel.Application.Visible = True

wscript.echo "Loading cell (1,1) with data"
objExcelSheet.ActiveSheet.Cells(1,1).Value = "Salut les Copains, ça mousse ?"

wscript.echo "[Testing if resulting file already exists]"
Set objFso = CreateObject("Scripting.FileSystemObject")
on error resume next
Set objFile = objFso.GetFile(strFilename)
on error goto 0
if objFso.fileExists(strFilename) then
  wscript.echo "[Previous version of file exists, deleting...]"
  objFile.Delete
  wscript.echo "[Done]" & vbcrlf
end if

wscript.echo "Saving Excel file as " & uCase(strFilename)
objExcelSheet.SaveAs strFilename

wscript.stdout.Write("Press <RET> to close Excel: ")
closeIt = wscript.stdin.readline
objExcel.Application.Quit
wscript.quit

 

Résultat :

 

C:\vbs>excel_from_vbs
*******
WARNING - This DEMO script deletes a file named C:\users\Didier\TEST.XLS
*******
Do you want to continue (Y/N): y
Creating Excel instance
Creating Excel Sheet object
Loading cell (1,1) with data
[Testing if resulting file already exists]
[Previous version of file exists, deleting...]
[Done]

Saving Excel file as C:\USERS\DIDIER\TEST.XLS
Press <RET> to close Excel:

C:\vbs>

 

[début]


 

Récupérer le nom et la version du moteur de script utilisé dans un script

 

On utilise la fonction système GetScriptEngineInfo

 

Exemple :

 

ScriptEngineInfo.vbs

 

dim scriptInfo

ScriptInfo = GetScriptEngineInfo
wscript.echo ScriptInfo
wscript.quit

Function GetScriptEngineInfo
  Dim s
  s = ""
  s = ScriptEngine & " Version "
  s = s & ScriptEngineMajorVersion & "."
  s = s & ScriptEngineMinorVersion & "."
  s = s & ScriptEngineBuildVersion
  GetScriptEngineInfo = s
End Function

 

Résultat :

 

C:\vbs>scriptengineinfo
VBScript Version 5.8.16546

 

[début]


 

Trouver la position d'un substring dans un string

 

On utilise la fonction InStr

 

Remarque 1 : Attention, cette fonction est sensible à la casse.

 

Remarque 2 : On peut faire la même chose à partir de la fin avec la fonction InStrRev.

 

Exemple :

 

locate_string.vbs

 

wscript.stdout.write("Enter target string: ")
strTarget = Lcase(wscript.stdin.readline)

wscript.stdout.write("Enter string to locate: ")
strItem = Lcase(wscript.stdin.readline)

intPos = InStr(strTarget,strItem)
if intPos <> 0 then
  wscript.echo "String '" & strItem & "' is located at position " & intPos
else
  wscript.echo "String '" & strItem & "' not found in '" & strTarget & "'"
end if
wscript.quit

 

Résultat :

 

C:\vbs>locate_string
Enter target string: ake coucou
Enter string to locate: toto
String 'toto' not found in 'ake coucou'

C:\vbs>locate_string
Enter target string: ake coucou
Enter string to locate: coucou
String 'coucou' is located at position 5

 

[début]


 

Exécuter une commande de la console à partir d'un script VBS

 

On utilise l'objet Shell de VBScript

 

Exemple :

 

run_from_vbscript.vbs

 

' run_from_vbscript.vbs
'
' this proc opens a new window, then closes it when subproc ends
' status = return code (should be tested)
' §1 : Shell command to be executed
' §2 : window behaviour (see "Run Method" in VBScript Help)
' §3 : true = spawn / false = spawn/nowait

Const intWindowStyle = 1
Set WshShell = Wscript.CreateObject("wscript.Shell")
status = WshShell.Run("cscript /nologo free_space.vbs", _
                       intWindowStyle, _
                       True)
wscript.quit 0

 

Résultat :

 

 

[début]


 

Lire la base d'indexation de Windows Desktop Search

 

On utilise l'objet ADODB

 

La base créée et mise à jour par WDS s'appelle SYSTEMINDEX.

Les propriétés accessibles pour cette base sont listées ici.

La gestion des erreurs ADO est plutôt ici.

Toutes les propriétés System sont listées .

 

Exemple d'utilisation :

 

search.vbs

 

On Error Resume Next

i=0
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open _
  "Provider=Search.CollatorDSO;Extended properties='Application=Windows';"

objRecordSet.Open "SELECT System.FileName FROM SYSTEMINDEX", objConnection
objRecordSet.MoveFirst
Do Until objRecordset.EOF
  Wscript.Echo objRecordset.Fields.Item("System.FileName")
  objRecordset.MoveNext
  i=i+1
Loop

wscript.echo "Nr of items found: " & i
wscript.quit 0

 

Résultat :

 

C:\vbs>search.vbs

../..

Pictures
Saved Games
Videos
Try Visual Studio 2010 Professional.url
Quest Software
ActiveRoles Management Shell for Active Directory.lnk
PowerGUI
PowerGUI.lnk
PowerGUI Script Editor.lnk
Bootrace.exe.lnk
bootracer.log
FileReadWrite.vshost.exe.manifest
FileReadWrite.vshost.exe
FileReadWrite.pdb
FileReadWrite.exe
FileReadWrite.xml
FileReadWrite.vbproj.FileListAbsolute.txt
bootracer.ini


Nr of items found: 3212

 

[début]


 

Qu'est-ce que c'est que ce ",,48" trouvé dans des SELECT WMI ?

 

Ce sont des flags de modification d'une requête WQL (WMI Query Language) envoyée à WMI.

 

Tout sur les requêtes WQL, c'est par ici.

 

Cette requête est semi-synchrone. La valeur 48 (et non 42, qui est la réponse à une question célèbre) est la somme des valeurs des flags 16 et 32. La valeur 16 signifie "WbemFlagReturnImmediately" et la valeur 32 signifie "WbemFlagForwardOnly". Tout savoir sur les appels synchrones et asynchrones ? par là. En savoir plus sur le ",,48" c'est plutôt par là.

 

Exemple :

 

On Error Resume Next

For Each obj in GetObject("WinMgmts:").ExecQuery _

 ("SELECT * FROM Win32_NTLogEvent WHERE _ LogFile='Application'",,48)

count = count + 1

Next

 

[début]


 

Afficher la liste des drivers

 

On utilise la commande DRIVERQUERY

 

Syntaxe :

 

DRIVERQUERY [/S système [/U nom_utilisateur [/P [mot_passe]]]] [/FO format] [/NH] [/SI] [/V]

 

L'option format peut prendre les valeurs table, list ou csv.

Voir l'aide en ligne par la commande

 

driverquery /?

 

[début]


 

Connaître son système

 

On utilise la commande SYSTEMINFO

 

Syntaxe :

 

SYSTEMINFO [/S système [/U utilisateur [/P mot_de_passe]]] [/FO format] [/NH]

 

L'option format peut prendre les valeurs table, list ou csv

Voir l'aide en ligne par la commande

 

systeminfo /?

 

[début]


 

Gérer les services

 

On utilise la commande SC

 

Syntaxe :

 

SC <serveur> [commande] [nom service] <option1> <option2>...

 

Voir l'aide en ligne par la commande

 

sc /?

 

[début]


 

Lister les évenements du log système des applications de ce jour

 

Hmm... Heu ??.. voir ici. :-(

 

[début]


 

Ecrire un message dans le journal des évènements

 

On utilise la commande EVENTCREATE

 

Syntaxe :

 

EVENTCREATE [/S système [/U utilisateur [ /P mot_de_passe]]]] /ID id_événement
            [/L nom_du_journal] [/SO nom_source] } /T type /D description

 

Voir l'aide en ligne par la commande

 

eventcreate /?

 

ATTENTION : On ne peut pas écrire dans le journal du système.

 

[début]


 

Liste des process

 

On utilise la commande TASKLIST

 

Syntaxe :

 

TASKLIST [/S système [/U utilisateur [/P mot_de_passe]]]]
         [/M [module] | /SVC | /V] [/FI filtre] [/FO format] [/NH]

 

Voir l'aide en ligne par la commande

 

tasklist /?

 

[début]


 

Gestion des journaux d'évènements

 

On utilise la commande WEVTUTIL

 

Syntaxe :

 

WEVTUTIL COMMANDE [ARGUMENT [ARGUMENT] ...] [/OPTION:VALEUR

                  [/OPTION:VALEUR] ...]

 

Voir l'aide en ligne par la commande

 

wevtutil /?

 

Les commandes que cet utilitaire peut réaliser sont :

 

 el | enum-logs Répertorie les noms des journaux.
 gl | get-log Obtient les informations de configuration des journaux.
 sl | set-log Modifie la configuration d’un journal.
 ep | enum-publishers Répertorie les éditeurs d’événements.
 gp | get-publisher Obtient les informations de configuration des éditeurs.
 im | install-manifest Installe les éditeurs et les journaux des événements à partir d’un manifeste.
 um | uninstall-manifest Désinstalle les éditeurs et les journaux des événements à partir d’un manifeste.
 qe | query-events Interroge les événements à partir d’un journal ou d’un fichier journal.
gli | get-log-info Obtient les informations d’état d’un journal.
epl | export-log Exporte un journal.
 al | archive-log Archive un journal exporté.
 cl | clear-log Efface un journal.

 

[début]


 

Liste de la file d'attente batch (tâches programmées)

 

On utilise la commande SCHTASKS

 

Syntaxe :

 

SCHTASKS /paramètre [arguments]

 

Voir l'aide en ligne par la commande

 

schtasks /?

 

[début]


 

Gestion des disques

 

On utilise la commande DISKPART

 

Syntaxe :

 

diskpart

 

Voir l'aide en ligne par la commande

 

DISKPART> diskpart /?

 

Cet utilitaire possède son propre interpréteur. Il permet, en interactif ou dans un script Diskpart, l'utilisation des commandes suivantes :

 

ACTIVE       - Indique la partition sélectionnée comme étant active.
ADD         *- Ajoute un miroir à un volume simple.
ASSIGN      *- Assigne une lettre de lecteur ou un point de montage au volume sélectionné.
ATTRIBUTES  *- Manipule les attributs de volume ou de disque.
ATTACH       - Attache un fichier de disque virtuel.
AUTOMOUNT   *- Active et désactiver le montage automatique des volumes de base.
BREAK       *- Détruit un jeu de miroir.
CLEAN        - Efface les informations de configuration ou toutes les informations du disque.
COMPACT      - Tente de réduire la taille physique du fichier.
CONVERT     *- Convertit à différents formats de disque.
CREATE      *- Crée un volume, une partition ou un disque virtuel.
DELETE      *- Supprime un objet.
DETAIL       - Fournit des détails concernant un objet.
DETACH       - Détache un fichier de disque virtuel.
EXIT         - Quitte DiskPart.
EXTEND      *- Étend un volume.
EXPAND       - Étend la taille maximale disponible sur un disque virtuel.
FILESYSTEMS  - Affiche les systèmes de fichiers en cours et pris en charge sur le volume.
FORMAT       - Formate la partition ou le volume actif
GPT          - Assigne des attributs à la partition GPT sélectionnée.
HELP         - Imprime cette liste de commandes.
IMPORT      *- Importe un groupe de disques.
INACTIVE     - Marque la partition sélectionnée comme inactive.
LIST         - Affiche une liste des objets.
MERGE        - Fusionne un disque enfant avec ses parents.
ONLINE       - Met en ligne un objet qui est actuellement marqué comme hors connexion.
OFFLINE     *- Met hors connexion un objet actuellement marqué comme en ligne.
RECOVER     *- Actualise l'état de tous les disques dans le jeu de disques sélectionné.
              Tente une récupération sur les disques situés dans le jeu de disques non valide,

              et resynchronise les volumes en miroir et les volumes RAID5 qui possèdent des données

              de plex ou de parité périmées.
REM          - Ne fait rien. Utilisé pour commenter des scripts.
REMOVE      *- Supprime une lettre de lecteur ou l'assignement d'un point de montage.
REPAIR      *- Répare un volume RAID-5 avec un membre défectueux.
RESCAN       - Analyse à nouveau l'ordinateur à la recherche de disques et de volumes.
RETAIN       - Place une partition nominale sous un volume simple.
SAN         *- Affiche ou définir la stratégie SAN pour le système d'exploitation actuellement démarré.
SELECT       - Déplace le focus vers un objet.
SETID       *- Change le type de partition.
SHRINK      *- Réduit la taille du volume sélectionné.
UNIQUEID    *- Affiche ou définit l'identificateur de la table de partition GUID (GPT) ou signature

              de l'enregistrement de démarrage principal (MBR) d'un disque.

 

Les commandes de Diskpart qui sont marquées d'un astérisque peuvent comporter l'option NoErr. Cette option permet, dans un script Diskpart, de dire à l'utilitaire de continuer le traitement du script si une erreur est advenue. Cette option est similaire à l'instruction On Error Resume Next de VBScript.

 

Un script Diskpart est un fichier texte, qui comporte habituellement l'extension .txt, et qui est appelé par la commande :

 

C:\vbs>diskpart /s MonScript.txt

 

[début]


 

Gestion du système de fichiers (File System)

 

On utilise la commande FSUTIL

 

Syntaxe :

 

fsutil

 

Voir l'aide en ligne par la commande

 

fsutil /?

 

qui ne semble pas fonctionner, vu que l'on reçoit un message d'erreur, mais qui affiche quand-même les fonctions de l'utilitaire...

 

Les commandes que cet utilitaire peut réaliser sont :

 

8dot3name    Gestion des noms au format 8.3 caractères (8dot3)
behavior     Contrôle du mode du système de fichiers
dirty        Gestion du bit d’intégrité du volume
file         Commandes fichier spécifiques
fsinfo       Informations du système de fichiers
hardlink     Gestion des liens réels
objectid     Gestion des ID d’objets
quota        Gestion des quotas
repair       Gestion de réparation spontanée
reparsepoint Gestion du point d’analyse
resource     Gestion du Gestionnaire transactionnel de ressources
sparse       Contrôle de fragmentation des fichiers
transaction  Gestion des transactions
usn          Gestion USN
volume       Gestion des volumes

 

ATTENTION : On lit partout que la suppression de la gestion des noms au format 8.3 accélère Windows. C'est probablement vrai, vu que Windows crée aussi un nom au format 8.3 à chaque fois qu'il crée un nom dans le File System, mais c'est complètement idiot car, depuis Windows NT jusqu'à Windows 7, ce format est toujours utilisé en interne par Windows dans des cas bien précis. Il est donc vivement déconseillé de désactiver cette fonctionnalité (en savoir plus).

 

[début]


 

Contrôler la bonne exécution de la demande de création d'un objet WMI

 

On utilise IsObject(ObjectName)

 

Exemple :

 

IsObject.vbs

 

strObject = "Word.Application"
on error resume next                       ' sinon, s'il y a une erreur, le script s'arrête
set TestObject = CreateObject(strObject)
wscript.echo IsObject(TestObject)          ' 0 = False, -1 = True
if IsObject(TestObject) then
   wscript.echo strObject & " is a valid WMI object"
   wscript.echo "Instance of " & strObject & " started"
else
   wscript.echo strObject & " is not a valid WMI object"
   wscript.quit 1
end if
wscript.quit 0

 

Résultat :

 

C:\vbs>isobject
-1
Word.Application is a valid WMI object
Instance of Word.Application started

C:\vbs>

 

Remarque : L'exécution de ce script une fois terminée, l'application Word est toujours active en tâche de fond. On peut la terminer par l'instruction

 

strObject.Application.Quit

 

ou via le gestionnaire des tâches de Windows (appelé par la combinaison de touches CTRL-ALT-DEL).

 

[début]


 

Avoir des accents dans et hors de ses scripts de console

 

Passer en code page 1252 avant les messages produits par le script et repasser en code page 850 après.

 

chcp 1252>nul

chcp  850>nul

 

(Bon, visiblement ça ne marche pas à tous les coups. Souvent, quelque soit le code page, on a quand-même les accents. C'est donc une info à utiliser avec des pincettes.)

 

[début]


 

Pour ajouter un programme au clic droit > Envoyer vers

Par exemple vers Notepad.exe :

Outils > Options des dossiers > Affichage > ne pas masquer les fichiers protégés du système + afficher les fichiers, dossiers et lecteurs cachés

Le raccourci vers un répertoire SendTo apparaît.

clic droit > Propriétés > Sécurité > %user% > Avancé > Modifier les autorisations > supprimer l'ACL "refuser tout le monde"

Ensuite, ouvrir le répertoire SendTo et y mettre un raccourci vers Notepad.exe

On ferme tout ça, on restaure les paramètres habituels, et quand on clique droit sur un fichier texte, on a "Envoyer vers > Bloc-notes".

(Merci Ed Wilson et son VBScript Step by Step, page 22).

 

 

Ou aussi :

 

C:\Users\%user%\AppData\Roaming\Microsoft\Windows\SendTo

 

pour accéder au répertoire cible du raccourci.

 

(Merci le Newsgroup Ponx.fr/Windows 7).

 

[début]


 

Chronométrer un traitement

 

Utiliser la fonction Timer.

 

Exemple :

 

timer.vbs

 

startTime = Timer                         'nb de secondes depuis 00:00:00

for i = 1 to 100
  WScript.Echo "Dans la forêt lointaine"
  WScript.Echo "On entend le coucou"
  WScript.Echo "Du haut de son grand chêne"
  WScript.Echo "Il répond au hibou" & vbcrlf
  WScript.Echo "coucou"
  WScript.Echo "coucou"
  WScript.Echo "coucou fait le Coucou" & vbcrlf
next

endTime = Timer

elapsedTime = endTime - startTime
WScript.Echo "Elapsed time woz " & formatNumber(elapsedTime) & " seconds."
WScript.Quit

 

Résultat :

 

../.. (98 blocs de lignes supprimés)

 

Dans la forêt lointaine
On entend le coucou
Du haut de son grand chêne
Il répond au hibou

coucou
coucou
coucou fait le Coucou

Dans la forêt lointaine
On entend le coucou
Du haut de son grand chêne
Il répond au hibou

coucou
coucou
coucou fait le Coucou

Elapsed time woz 0,26 seconds.

C:\vbs>

 

Remarque 1 : Si le CPU time est précieux, on remplacera avantageusement et bien évidemment les sept WScript.Echo par un seul, avec concaténation du texte et ajout de VbCrLf pour les retours à la ligne.

 

Remarque 2 : Il y a quelqu'un qui chantait faux, là-bas, derrière, à droite...

 

[début]


 

Connaître le nom de la procédure en cours d'exécution

 

Wscript.ScriptName ou Wscript.ScriptFullName

 

[début]


 

Trier des données

 

On crée un "disconnected recordset" et on le trie, puis on le lit et on affiche le texte trié.

 

Exemple :

 

'--- A ---
Const adVarChar = 200
Const MaxCharacters = 255

'--- B ---
Set DataList = CreateObject("ADOR.Recordset")
DataList.Fields.Append "ServiceName", adVarChar, MaxCharacters
DataList.Fields.Append "ServiceState", adVarChar, MaxCharacters
DataList.Open

'--- C ---
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer& "\root\cimv2")
Set colServices = objWMIService.ExecQuery("SELECT * FROM Win32_Service")

'--- D ---
For Each Service in colServices
  DataList.AddNew
  DataList("ServiceName") = Service.Name
  DataList("ServiceState") = Service.State
  DataList.Update
Next

'--- E ---
DataList.Sort = "ServiceName"

'--- F ---
DataList.MoveFirst
Do Until DataList.EOF
  Wscript.Echo DataList.Fields.Item("ServiceName") _
     & vbTab & DataList.Fields.Item("ServiceState")
  DataList.MoveNext
Loop

Wscript.Quit

 

A : Création de deux constantes. L'instruction Option Explicit n'étant pas utilisée dans cet exemple, les variables ne sont pas définies explicitement.

 

B : Création du recordset. Un recordset est une base de données créée provisoirement en mémoire vive. Lorsqu'elle est fermée, elle disparaît. Les instructions DataList.Fields.Append définissent les données de la base.

 

C : Ce code permet la connexion à WMI pour lister les services de l'ordinateur local (strComputer = ".") puis on effectue un query de WMI pour récupérer la liste de ces services.

 

D : Cette boucle permet de "populer" le recordset. AddNew = création d'un nouveau row. Update = commit.

 

E : En fin de boucle, le recordset est chargé avec nos données. On lui demande de les trier en mémoire.

 

F : On positionne le pointeur sur le premier row et on affiche les données (triées).

 

Voilà.

 

[début]


 

Ecrire en couleurs dans une fenêtre de la console (débutants)

 

Ca c'est un peu compliqué vu que l'accès au codage ANSI n'est pas possible depuis VBScript. Il faut donc passer par une fenêtre de Internet Exploseur.


Exemple pour débutants : write_to_ie_v2.vbs

 

Explication détaillée ici.

 

[début]


 

Ecrire en couleurs dans une fenêtre de la console (experts)

 

Maintenant nous allons voir comment programmer en une seule ligne la création de et l'écriture dans une page HTML.


Le source, un peu plus compliqué, est ici : writeHTML.vbs

 

L'explication détaillée est .

 

[début]


 

Rechercher des fichiers dans la base d'indexation de Windows Search

 

On utilise ADODB pour faire directement des requêtes dans la base.


Exemple : search.vbs

 

Explication détaillée ici.

 

[début]


 

Dimensionner une matrice de façon dynamique

 

On dimensionne la matrice sans taille et on utilise l'instruction ReDim avec un paramètre pour la redimensionner.

 

Exemple :

 

Dim aryMyArray()

iMax = 3
ReDim aryMyArray(iMax)                   ' this is a 4 positions array, starting with 0

for i = 1 to iMax
  aryMyArray(i) = i
next
for i = 0 to iMax
  wscript.echo "aryMyArray(" & i & ") = " & aryMyArray(i)
next

 

Résultat :

 

c:\vbs>load_array
aryMyArray(0) =
aryMyArray(1) = 1
aryMyArray(2) = 2
aryMyArray(3) = 3

c:\vbs>

 

[début]


 

Afficher les caractéristiques d'un écran

 

Win32_VideoController

Win32_DesktopMonitor

CIM_VideoControllerResolution

 

[début]


 

Connaître le nombre de fichiers indexés par Windows Search

 

Set adoConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

adoConnection.CursorLocation = 3 'adUseClient
adoConnection.CommandTimeout = 0

adoConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"

wscript.echo "start on " & now
wscript.stdout.write "Nr of indexed files in ADODB database...: "

strStart = timer
objRecordSet.Open "SELECT System.Search.EntryID FROM SystemIndex", adoConnection
wscript.stdout.writeline objRecordSet.RecordCount
strEnd = timer

wscript.echo "ended on " & now
wscript.echo "duration time: " & (strEnd - strStart) & " seconds."

objRecordSet.Close
adoConnection.Close

 

Résultat :

 

c:\vbs>C:\vbs\Windows_Search_total
start on 16/11/2010 14:33:40
Nr of indexed files in ADODB database...: 501343
end on 16/11/2010 14:34:07
duration time: 26,57422 seconds.

c:\vbs>

 

 

[début]


 

WshShell.Run et WshShell.Exec

 

La méthode WshShell.Run lance une application depuis VBScript de façon synchrone (Wait = True) ou asynchrone (Wait = False) puis le contrôle est passé à la ligne suivante, sans possibilité de terminer l'application lancée.

 

La méthode WshShell.Exec lance une application depuis VBScript de façon synchrone (Wait = True) ou asynchrone (Wait = False) puis le contrôle est passé à la ligne suivante. Mais l'objet application lancée est persistant et on peut terminer l'application lancée via la méthode Terminate.


Exemple :

 

Set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("notepad.exe " & WScript.ScriptFullName, 1, true)
Wscript.quit
 

Set WshShell = WScript.CreateObject("WScript.Shell")
Wscript.echo "Launching Notepad"
set WshScriptExec = WshShell.Exec("notepad.exe " & WScript.ScriptFullName)
Wscript.stdout.Write "Press <RET> to terminate application: "
dummy = Wscript.stdin.ReadLine
WshScriptExec.Terminate
Wscript.quit

 

 

[début]


 

accueil | console | VBScript | PowerShell | documentation | formation  | trucs et astuces | exemples | glossaire