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
là.
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 là.
[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
|