Listing 1.1 : Script HelloWorld2.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: HelloWorld2.vbs $ $Revision: 3 $ $Date: 12/04/98 3:19p $
' $Archive: /Scripts/HelloWorld2.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Simple échantillon WSH "Hello World!"
Option Explicit
Wscript.Echo Wscript.ScriptName & " $Revision: 3 $"
Wscript.Echo "Copyright (c) 1998 Tim Hill. All Rights Reserved."
' Ouvre IE et affiche la page about:blank pour nous fournir un document vide
Dim oIE, oIEDoc
Set oIE = Wscript.CreateObject("InternetExplorer.Application")
oIE.Navigate "about:blank"
Set oIEDoc = oIE.Document
oIE.AddressBar = False
oIE.StatusBar = False
oIE.ToolBar = False
oIE.MenuBar = False
oIE.Visible = True
' Emet maintenant le code HTML vers IE
oIEDoc.WriteLn ""
oIEDoc.WriteLn "
"
oIEDoc.WriteLn "Echantillon de script HelloWorld2"
oIEDoc.WriteLn ""
oIEDoc.WriteLn ""
oIEDoc.WriteLn "Bienvenue dans Windows Scripting Host."
oIEDoc.Write ""
If Hour(Now) < 12 Then
oIEDoc.Write "Bonjour"
ElseIf Hour(Now) < 17 Then
oIEDoc.Write "Bonjour"
Else
oIEDoc.Write "Bonsoir"
End If
oIEDoc.WriteLn " tout le monde, il est " & Time & ""
oIEDoc.WriteLn "Attendez SVP."
oIEDoc.WriteLn "La fenêtre se fermera dans 10 secondes."
oIEDoc.WriteLn ""
oIEDoc.WriteLn ""
' Attendre dix secondes
Dim vStart
vStart = Now
Do While DateDiff("s", vStart, Now) < 10
Wscript.Sleep 1000
Loop
Set oIEDoc = Nothing
oIE.Quit
Set oIE = Nothing
Wscript.Quit 0
'////////////////////////////////////////////////////////////////////////////
Listing 2.1 : Script ShowArgs1.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: ShowArgs1.vbs $ $Révision: 1 $ $Date: 12/02/98 11:34a $
' $Archive: /Scripts/ShowArgs1.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Affiche les quatre premiers arguments de ligne de commande
Wscript.Echo "Vous avez saisi", Wscript.Arguments.Count, "les arguments"
On Error Resume Next
Wscript.Echo "Argument 0:", Wscript.Arguments(0)
Wscript.Echo "Argument 1:", Wscript.Arguments(1)
Wscript.Echo "Argument 2:", Wscript.Arguments(2)
Wscript.Echo "Argument 3:", Wscript.Arguments(3)
'////////////////////////////////////////////////////////////////////////////
Listing 2.2 : Script SphereStats.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: SphereStats.vbs $ $Revision: 2 $ $Date: 4/18/99 3:39p $
' $Archive: /Scripts/SphereStats.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Calcule la surface et le volume d'une sphère, étant donné le rayon
Option Explicit
Dim fRadius, fSurface, fVolume, PI
PI = 3.1415926
fRadius = Wscript.Arguments(0)
fSurface = 4 * PI * fRadius^2
fVolume = (4 * PI * fRadius^3) / 3
Wscript.Echo "Rayon :", fRadius, "Aire de surface :", fSurface, "Volume:", fVolume
'////////////////////////////////////////////////////////////////////////////
Listing 2.3 : Script ShowArgs2.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: ShowArgs2.vbs $ $Revision: 4 $ $Date: 4/24/99 11:20a $
' $Archive: /Scripts/ShowArgs2.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Affiche tous les arguments de ligne de commande
Option Explicit
Dim nIndex, sArg
Wscript.Echo "Vous avez saisi",Wscript.Arguments.Count,"les arguments"
' Utilise une boucle pour afficher tous les arguments
nIndex = 0
Do While nIndex < Wscript.Arguments.Count
Wscript.Echo "Argument " & nIndex & ":", Wscript.Arguments(nIndex)
nIndex = nIndex + 1
Loop
' Utilise l'itération pour afficher tous les arguments
For nIndex = 0 To Wscript.Arguments.Count - 1
Wscript.Echo "Argument " & nIndex & ":", Wscript.Arguments(nIndex)
Next
' Utilise l'itération de collection pour afficher tous les arguments
For Each sArg In Wscript.Arguments
If sArg = "fantôme" Then
Wscript.Echo "Le fantôme dans la machine !"
Else
Wscript.Echo "Argument :", sArg
End If
Next
'////////////////////////////////////////////////////////////////////////////
Listing 2.4 : Script QuickCalc.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: QuickCalc.vbs $ $Revision: 3 $ $Date: 4/18/99 7:18p $
' $Archive: /Scripts/QuickCalc.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Evalue tous les args de ligne de commande en tant qu'exprs et affiche résultat
Option Explicit
Dim sCmdLine, sArg, sResult
' Tout d'abord, assemble la ligne de commande complète
sCmdLine = ""
For Each sArg In Wscript.Arguments
If sCmdLine = "" Then
sCmdLine = sArg
Else
sCmdLine = sCmdLine & " " & sArg
End If
Next
' Evalue maintenant la ligne de commande
sResult = Eval(sCmdLine)
Wscript.Echo sCmdLine & "=" & sResult
Wscript.Quit(CInt(sResult))
'////////////////////////////////////////////////////////////////////////////
Listing 3.1 : Script VarType1.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: TypeVar1.vbs $ $Revision: 1 $ $Date: 4/28/99 8:40p $
' $Archive: /Scripts/TypeVar1.vbs $
' Copyright (c)1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Affiche les types des variables WSH
Option Explicit
' Déclare certaines variables et affecte diverses valeurs et types
Dim A(10), B(2), x
A(0) = Empty ' Valeur Empty
A(1) = Null ' Valeur Null
A(2) = 10 ' Un entier
A(3) = 14.5 ' Valeur à virgule flottante
A(4) = #14/3/1952# ' Une date
A(5) = "Salut là-dedans" ' Une chaîne
A(6) = False ' Une valeur booléenne
A(7) = B ' Un tableau
' Affiche maintenant les types de variables
For x = 0 To UBound(A)
Wscript.Echo "Le type de A(" & x & ") est " & NomType(A(x)) _
& " (" & TypeVar(A(x)) & ")"
Next
'////////////////////////////////////////////////////////////////////////////
Listing 4.1 : Script ParseArgs1.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: ParseArgs1.vbs $ $Revision: 1 $ $Date: 5/08/99 3:21p $
' $Archive: /Scripts/ParseArgs1.vbs $
' Copyright 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Analyse les arguments de commandes de la forme =
Listing 5.1 : Script DayOfWeek1.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: DayOfWeek1.vbs $ $Revision: 1 $ $Date: 5/22/99 3:39p $
' $Archive: /Scripts/DayOfWeek1.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Affiche le jour de la semaine
Option Explicit
Wscript.Echo String(40, "-")
Wscript.Echo "DayOfWeek version 1.0"
Wscript.Echo "Copyright (c) 1999 The Acme Software Co."
Wscript.Echo String(40, "-")
Dim sArg
For Each sArg In Wscript.Arguments
If IsDate(sArg) Then
Wscript.Echo sArg, "est un", WeekdayName(Weekday(DateValue(sArg)))
End If
Next
'////////////////////////////////////////////////////////////////////////////
Listing 5.2 : Script DayOfWeek2.vbs
1 '////////////////////////////////////////////////////////////////////////////
2 ' $Workfile: DayOfWeek2.vbs $ $Revision: 1 $ $Date: 5/22/99 3:39p $
3 ' $Archive: /Scripts/DayOfWeek2.vbs $
4 ' Copyright (c) 1998 Tim Hill. All Rights Reserved.
5 '////////////////////////////////////////////////////////////////////////////
6 ' Affiche le jour de la semaine
7 Option Explicit
8 ShowBanner
9 ProcessArgs
10 Sub ProcessArgs
11 Dim sArg
12 For Each sArg In Wscript.Arguments
13 If IsDate(sArg) Then
14 Wscript.Echo sArg, "est un", WeekdayName(Weekday(DateValue(sArg)))
15 End If
16 Next
17 End Sub
18 Sub ShowBanner
19 Wscript.Echo String(40, "-")
20 Wscript.Echo "DayOfWeek version 1.0"
21 Wscript.Echo "Copyright (c) 1999 The Acme Software Co."
22 Wscript.Echo String(40, "-")
23 End Sub
24 '////////////////////////////////////////////////////////////////////////////
Listing 5.3 : Script VarType2.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: VarType2.vbs $ $Revision: 2 $ $Date: 5/29/99 5:31p $
' $Archive: /Scripts/VarType2.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Affiche les types de variables
Option Explicit
' Déclare certaines variables et affecte diverses valeurs et types
Dim a(5), b(5), c(5), x
For x = 0 To UBound(a)
a(x) = 0
b(x) = x
c(x) = x * x
Next
c(5) = Array(#1/1/99#, 12.5, True)
c(4) = "Cela est une chaîne"
b(2) = c
a(4) = b
a(2) = Empty
a(3) = Null
x = 100
ShowVar 0, "x", x
ShowVar 0, "a", a
' ShowVar : Montre type de var, avec prise en charge type d'élément de tableau
' Arguments : nLevel=niveau de récursivité, sName=nom var, X=variable
Sub ShowVar(ByVal nLevel, ByVal sName, ByRef x)
Dim s, ix
s = space(nLevel * 4) & "Type of " & Chr(34) & sName & Chr(34) & ": " & TypeName(x)
If IsObject(x) Then
Wscript.Echo s & " (objet)"
ElseIf IsNull(x) Then
Wscript.Echo s & " (null)"
ElseIf IsEmpty(x) Then
Wscript.Echo s & " (vide)"
ElseIf IsArray(x) Then
Wscript.Echo s & " (tableau)..."
For ix = 0 to Ubound(x)
ShowVar nLevel + 1, sName & "(" & ix & ")", x(ix)
Next
Else
Wscript.Echo s & " valeur=", x
End If
End Sub
'////////////////////////////////////////////////////////////////////////////
Listing 6.1 : Script HelloWorld2.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: HelloWorld2.vbs $ $Revision: 3 $ $Date: 12/04/98 3:19p $
' $Archive: /Scripts/HelloWorld2.vbs $
' Copyright (c)1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Simple échantillon WSH "Hello World!"
Option Explicit
Wscript.Echo Wscript.ScriptName & " $Revision: 3 $"
Wscript.Echo "Copyright (c)1998 Tim Hill. All Rights Reserved."
' Ouvre IE et affiche la page about:blank pour nous fournir un document vide
Dim oIE, oIEDoc
Set oIE = CreateObject("InternetExplorer.Application")
oIE.Navigate "about:blank"
oIE.AddressBar = False
oIE.StatusBar = False
oIE.ToolBar = False
oIE.MenuBar = False
oIE.Visible = True
' Envoie maintenant le code HTML à IE
Set oIEDoc = oIE.Document
oIEDoc.WriteLn ""
oIEDoc.WriteLn ""
oIEDoc.WriteLn "Echantillon de script HelloWorld2"
oIEDoc.WriteLn ""
oIEDoc.WriteLn ""
oIEDoc.WriteLn "Bienvenue dans Windows Scripting Host."
oIEDoc.Write ""
If Hour(Now) < 12 Then
oIEDoc.Write "Bonjour"
ElseIf Hour(Now) < 17 Then
oIEDoc.Write "Bonjour"
Else
oIEDoc.Write "Bonsoir"
End If
oIEDoc.WriteLn " tout le monde, il est " & Time & ""
oIEDoc.WriteLn " Attendez SVP."
oIEDoc.WriteLn "La fenêtre se fermera dans 10 secondes."
oIEDoc.WriteLn ""
oIEDoc.WriteLn ""
' Attendre dix secondes
Dim vStart
vStart = Now
Do While DateDiff("s", vStart, Now) < 10
Wscript.Sleep 1000
Loop
Set oIEDoc = Nothing
oIE.Quit
Set oIE = Nothing
Wscript.Quit 0
'////////////////////////////////////////////////////////////////////////////
Listing 7.1 : Script RegExp.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: ShowArgs2.vbs $ $Revision: 5 $ $Date: 4/24/99 11:36a $
' $Archive: /Scripts/ShowArgs2.vbs $
' Copyright (c) 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Traite une structure de comparaison d'expression régulière
' D'abord structure de comparaison arg=regexp, ensuite chaîne arg=search
Option Explicit
' Vérifie si les arguments de ligne de commande sont suffisants
Dim sPattern, sSearch
If Wscript.Arguments.Count < 2 Then
Wscript.Echo "usage: regexp "
Wscript.Quit(1)
End If
sPattern = Wscript.Arguments(0)
sSearch = Wscript.Arguments(1)
' Effectue la correspondance d'expression régulière
Dim oRE, oMatches
Set oRE = New RegExp
oRE.Global = True
oRE.IgnoreCase = True
oRE.Pattern = sPattern
Set oMatches = oRE.Execute(sSearch)
' Traite maintenant toutes les correspondances (s'il y en a)
Dim oMatch
Wscript.Echo "Chaîne de Structure: " & Chr(34) & sPattern & Chr(34)
Wscript.Echo "Chaîne de Recherche: " & Chr(34) & sSearch & Chr(34) & vbCRLF
Wscript.Echo oMatches.Count, "Correspondances:"
Wscript.Echo " " & sSearch
For Each oMatch In oMatches
Wscript.Echo " " & String(oMatch.FirstIndex, " ") & String(oMatch.Length, "^")
Next
'////////////////////////////////////////////////////////////////////////////
Listing 8 : Script SplitPath.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: SplitPath.vbs $ $Revision: 1 $ $Date: 6/23/99 11:15a $
' $Archive: /Scripts/SplitPath.vbs $
' Copyright (c) 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Décompose chaque argument en nom de chemin
Option Explicit
Dim sArg, oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")
' Traite chaque argument
For Each sArg In Wscript.Arguments
ShowComponents sArg, 0
Next
Set oFSO = Nothing
'////////////////////////////////////////////////////////////////////////////
' ShowComponents
' Affiche les composants distincts à partir des noms de chemin passés
'
' sPath Nom de chemin à décomposer
' nLevel Niveau de récursivité pour la mise en retrait
'
Sub ShowComponents(sPath, nLevel)
Dim sAbsPath, sIndent
sIndent = Space(nLevel * 4)
' Interrompt la récursivité quand le chemin est vide
If sPath = "" Then Exit Sub
Wscript.Echo sIndent & "Décompose : " & Chr(34) & sPath & Chr(34)
sAbsPath = oFSO.GetAbsolutePathName(sPath)
Wscript.Echo sIndent & " Chemin absolu : " & sAbsPath
Wscript.Echo sIndent & " Fichier valide : " & CBool(oFSO.FileExists(sAbsPath))
Wscript.Echo sIndent & " Chemin valide : " & CBool(oFSO.FolderExists(sAbsPath))
Wscript.Echo sIndent & " Nom de fichier : " & oFSO.GetFileName(sAbsPath)
Wscript.Echo sIndent & " Nom de base : " & oFSO.GetBaseName(sAbsPath)
Wscript.Echo sIndent & " Extension : " & oFSO.GetExtensionName(sAbsPath)
Wscript.Echo sIndent & " Nom de disque : " & oFSO.GetDriveName(sAbsPath)
Wscript.Echo
' Décompose maintenant récursivement le dossier parent
ShowComponents oFSO.GetParentFolderName(sAbsPath), nLevel + 1
End Sub
'////////////////////////////////////////////////////////////////////////////
Listing 8.2 : Script DriveInfo.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: DriveInfo.vbs $ $Revision: 2 $ $Date: 7/04/99 12:33p $
' $Archive: /Scripts/DriveInfo.vbs $
' Copyright (c) 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Afficher les informations concernant le disque spécifié
Option Explicit
Dim sArg, oFSO, sDriveName, sType
Set oFSO = CreateObject("Scripting.FileSystemObject")
' Obtenir nom de fichier absolu depuis ligne de commande, puis obtenir nom disque
If Wscript.Arguments.Count < 1 Then Wscript.Quit(1)
sArg = oFSO.GetAbsolutePathName(Wscript.Arguments(0))
sDriveName = oFSO.GetDriveName(sArg)
' obtenir les propriétés d'objet et afficher les propriétés
With oFSO.GetDrive(sDriveName)
Wscript.Echo "Taille totale du disque (Ko):", .TotalSize / 1024
Wscript.Echo "Espace disponible (Ko) :", .AvailableSpace / 1024
Wscript.Echo "Espace libre (KB) :", .FreeSpace / 1024
Wscript.Echo "Lettre de disque :", .DriveLetter
Wscript.Echo "Nom de partage UNC :", .ShareName
Wscript.Echo "Nom de volume :", .VolumeName
Wscript.Echo "Chemin :", .Path
Wscript.Echo "Numéro de série :", Hex(.SerialNumber)
Wscript.Echo "Système de fichiers :", .FileSystem
Wscript.Echo "Disque prêt :", CBool(.IsReady)
Select Case .DriveType
Case 1: sType = "Amovible"
Case 2: sType = "Fixe"
Case 3: sType = "Réseau"
Case 4: sType = "CD-ROM"
Case 5: sType = "Disque RAM"
Case Else sType = "Inconnu"
Ernd Select
Wscript.Echo "Type de disque :", sType
End With
Set oFSO = Nothing
'////////////////////////////////////////////////////////////////////////////
Listing 8.3 : Script FolderInfo.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: FolderInfo.vbs $ $Revision: 1 $ $Date: 7/03/99 7:27p $
' $Archive: /Scripts/FolderInfo.vbs $
' Copyright (c) 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Afficher les informations concernant le dossier spécifié
Option Explicit
Dim sArg, oFSO, oFolder, sAttr, nAttr
Set oFSO = CreateObject("Scripting.FileSystemObject")
' Obtenir le nom de chemin absolu à partir de la ligne de commande, puis obtenir le nom du disque
If Wscript.Arguments.Count < 1 Then Wscript.Quit(1)
sArg = oFSO.GetAbsolutePathName(Wscript.Arguments(0))
' Obtenir l'objet folder et afficher ses propriétés
Set oFolder = oFSO.GetFolder(sArg)
Wscript.Echo "Disque contenant le dossier :", oFolder.Drive
Wscript.Echo "Dossier racine ? :", oFolder.IsRootFolder
Wscript.Echo "Nom de dossier ? :", oFolder.Name
Wscript.Echo "Chemin :", oFolder.Path
Wscript.Echo "Nom court (MSDOS) :", oFolder.ShortName
Wscript.Echo "Nom court (MSDOS) :", oFolder.ShortPath
Wscript.Echo "Size (files+subfolders) :", oFolder.Size
Wscript.Echo "Folder type :", oFolder.Type
If Not oFolder.IsRootFolder Then
Wscript.Echo "Date créée :", oFolder.DateCreated
Wscript.Echo "Date de dernier accès :", oFolder.DateLastAccessed
Wscript.Echo "Date de dernière modification :", oFolder.DateLastModified
Wscript.Echo "Nom du dossier parent :", oFolder.ParentFolder.Name
End If
nAttr = oFolder.Attributes
Wscript.Echo "Attributs :", Hex(nAttr)
sAttr = ""
If nAttr And 1 Then sAttr = sAttr & "Lecture seule "
If nAttr And 2 Then sAttr = sAttr & "Masqué "
If nAttr And 4 Then sAttr = sAttr & "Système "
If nAttr And 8 Then sAttr = sAttr & "Volume "
If nAttr And 16 Then sAttr = sAttr & "Dossier "
If nAttr And 32 Then sAttr = sAttr & "Archive "
If nAttr And 64 Then sAttr = sAttr & "Alias "
If nAttr And 128 Then sAttr = sAttr & "Compressé "
Wscript.Echo " " & sAttr
Set oFolder = Nothing
Set oFSO = Nothing
'////////////////////////////////////////////////////////////////////////////
Listing 8.4 : VBTree.vbs Script
'////////////////////////////////////////////////////////////////////////////
' $Workfile: VBTree.vbs $ $Revision: 1 $ $Date: 7/03/99 6:49p $
' $Archive: /Scripts/VBTree.vbs $
' Copyright (c) 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Montrer une arborescence de répertoire simple
Option Explicit
Dim sArg, oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")
' Obtenir le dossier (le dossier par défaut est le dossier en cours)
If Wscript.Arguments.Count > 0 Then
sArg = Wscript.Arguments(0)
Else
sArg = "."
End If
sArg = oFSO.GetAbsolutePathName(sArg)
' Traiter l'arborescence entière (si le dossier est valide)
If oFSO.FolderExists(sArg) Then
Wscript.Echo "Arbre des dossiers de :", sArg
ShowTree "", oFSO.GetFolder(sArg)
End If
Set oFSO = Nothing
Wscript.Quit(0)
'////////////////////////////////////////////////////////////////////////////
' ShowTree
' Montrer un niveau de l'arborescence du dossier
'
' sIndent Mettre en retrait la chaîne
' oFolder Objet dossier pour ce niveau dans l'arborescence
'
Sub ShowTree(sIndent, oFolder)
Dim oSubFolder, ix
ix = 1
For Each oSubFolder In oFolder.SubFolders
Wscript.Echo sIndent & "+-" & oSubFolder.Name
If ix <> oFolder.SubFolders.Count Then
ShowTree sIndent & "| ", oSubFolder
Else
ShowTree sIndent & " ", oSubFolder
End If
ix = ix + 1
Next
End Sub
'////////////////////////////////////////////////////////////////////////////
Listing 8.5 : Script FileInfo.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: FileInfo.vbs $ $Revision: 1 $ $Date: 7/04/99 1:16p $
' $Archive: /Scripts/FileInfo.vbs $
' Copyright (c) 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Affiche les informations concernant le fichier spécifié
Option Explicit
Dim sArg, oFSO, oFile, sAttr, nAttr
Set oFSO = CreateObject("Scripting.FileSystemObject")
' Obtenir le nom absolu du fichier depuis la ligne de commande, puis obtenir le nom du disque
If Wscript.Arguments.Count < 1 Then Wscript.Quit(1)
sArg = oFSO.GetAbsolutePathName(Wscript.Arguments(0))
' Obtenir l'objet fichier et afficher ses propriétés
Set oFile = oFSO.GetFile(sArg)
Wscript.Echo "Disque contenant le fichier :", oFile.Drive
Wscript.Echo "Nom de fichier :", oFile.Name
Wscript.Echo "Chemin :", oFile.Path
Wscript.Echo "Nom MS-DOS (court) :", oFile.ShortName
Wscript.Echo "Chemin MS-DOS (court) :", oFile.ShortPath
Wscript.Echo "Taille :", oFile.Size
Wscript.Echo "Type de fichier :", oFile.Type
Wscript.Echo "Date créée :", oFile.DateCreated
Wscript.Echo "Date de dernier accès :", oFile.DateLastAccessed
Wscript.Echo "Date de dernière modification :", oFile.DateLastModified
Wscript.Echo "Nom de dossier parent :", oFile.ParentFolder.Name
nAttr = oFile.Attributes
Wscript.Echo "Attributs :", Hex(nAttr)
sAttr = ""
If nAttr And 1 Then sAttr = sAttr & "Lecture seule "
If nAttr And 2 Then sAttr = sAttr & "Masqué "
If nAttr And 4 Then sAttr = sAttr & "Système "
If nAttr And 8 Then sAttr = sAttr & "Volume "
If nAttr And 16 Then sAttr = sAttr & "Dossier "
If nAttr And 32 Then sAttr = sAttr & "Archive "
If nAttr And 64 Then sAttr = sAttr & "Alias "
If nAttr And 128 Then sAttr = sAttr & "Compressé "
Wscript.Echo " " & sAttr
Set oFile = Nothing
Set oFSO = Nothing
'////////////////////////////////////////////////////////////////////////////
Listing 8.6 : Script ShowINFSection.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: ShowINFSection.vbs $ $Revision: 1 $ $Date: 7/04/99 3:13p $
' $Archive: /Scripts/ShowINFSection.vbs $
' Copyright (c) 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Expressions régulières pour extraire une section INF d'un fichier INF
Option Explicit
Dim sArg, oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")
' S'il n'y a pas d'arguments, afficher bref usage
If Wscript.Arguments.Count < 2 Then
Wscript.Echo "usage : showinfsection section-nom INF-fichier"
Wscript.Quit(0)
End If
' Préparer les objets expressions régulières
Dim oREStart, oREEnd
Set oREStart = new RegExp
Set oREEnd = new RegExp
oREStart.Pattern = "^\s*\[\s*" & Wscript.Arguments(0) & "\s*\]\s*$"
oREStart.IgnoreCase = True
oREEnd.Pattern = "^\s*\[.*\]\s*$"
' Préparer le flux de saisie
Dim oStream, nState, sLine
Set oStream = oFSO.OpenTextFile(Wscript.Arguments(1))
nState = 0
Do Until oStream.AtEndOfStream
sLine = oStream.ReadLine
Select Case nState
Case 0: ' Etat 0 : Section avant
If oREStart.Test(sLine) Then nState = 1
Case 1: ' Etat 1 : Section au-dedans
If oREEnd.Test(sLine) Then
nState = 2
Else
Wscript.Echo sLine
End If
Case 2: ' Etat 3 : section après
End Select
Loop
Set oStream = Nothing
Set oREStart = Nothing
Set oREEnd = Nothing
'////////////////////////////////////////////////////////////////////////////
Listing 8.7 : Script Tee.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: SplitPath.vbs $ $Revision: 1 $ $Date: 6/23/99 11:15a $
' $Archive: /Scripts/SplitPath.vbs $
' Copyright (c) 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Sortie en "T" vers un fichier (comme un joint de plomberie en T)
Option Explicit
Dim sArg, oFSO, oStream, oStdIn, oStdOut, sLine
Set oFSO = CreateObject("Scripting.FileSystemObject")
' Définit le flux de texte oStream depuis argument de ligne de commande
If Wscript.Arguments.Count > 0 Then
Set oStream = oFSO.CreateTextFile(Wscript.Arguments(0), True)
Else
Set oStream = Nothing
End If
' Copie maintenant StdIn vers StdOut et oStream
Set oStdIn = Wscript.StdIn
Set oStdOut = Wscript.StdOut
Do Until oStdIn.AtEndOfStream
sLine = oStdIn.ReadLine
oStdOut.WriteLine sLine
If Not oStream Is Nothing Then oStream.WriteLine sLine
Loop
Set oStdOut = Nothing
Set oStdIn = Nothing
Set oStream = Nothing
Wscript.Quit(0)
'////////////////////////////////////////////////////////////////////////////
Listing 8.8 : Script VBGrep.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: SplitPath.vbs $ $Revision: 1 $ $Date: 6/23/99 11:15a $
' $Archive: /Scripts/SplitPath.vbs $
' Copyright (c) 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Utiliser des expressions régulières pour filtrer les lignes dans un ou plusieurs ' fichiers
Option Explicit
Dim sArg, oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")
' S'il n'y a pas d'argument, afficher utilisation brève
If Wscript.Arguments.Count < 1 Then
Wscript.Echo "usage: vbgrep reg-exp [folders]"
Wscript.Echo "Si aucun dossier, lit stdin"
Wscript.Quit(0)
End If
' Préparer l'objet expression régulière
Dim oRE
Set oRE = new RegExp
oRE.Pattern = Wscript.Arguments(0)
' Traiter maintenant l'entrée
Dim nMatchCount, ix, oFolder, oFile, oStream
nMatchCount = 0
If Wscript.Arguments.Count < 2 Then
nMatchCount = nMatchCount + GrepStream(Wscript.StdIn, oRE, Wscript.StdOut)
Else
For ix = 1 To Wscript.Arguments.Count - 1
sArg = Wscript.Arguments(ix)
If oFSO.FolderExists(sArg) Then
Set oFolder = oFSO.GetFolder(sArg)
For Each oFile In oFolder.Files
Set oStream = oFile.OpenAsTextStream(1)
nMatchCount = nMatchCount + GrepStream(oStream, oRE, Wscript.StdOut)
Set oStream = Nothing
Next
Set oFolder = Nothing
Else
Wscript.Echo sArg,"non trouvé"
End If
Next
End If
Set oRE = Nothing
Set oFSO = Nothing
Wscript.Quit(nMatchCount)
'////////////////////////////////////////////////////////////////////////////
' GrepStream
' Filtre un flux de texte en se fondant sur un objet expression régulière
'
' oStream Flux de texte à filtrer
' oRE Expression régulière pour le filtre
' oOutput Flux de sortie pour le résultat
' Renvoie Nombre de lignes correspondantes
'
Function GrepStream(oStream, oRE, oOutput)
Dim sLine, nCount
' Traiter chaque ligne de flux de sortie
nCount = 0
Do Until oStream.AtEndOfStream
sLine = oStream.ReadLine
' Si RE correspond, envoyer ligne vers flux de sortie
If oRE.Test(sLine) Then
oOutput.WriteLine sLine
nCount = nCount + 1
End If
Loop
GrepStream = nCount
End Function
'////////////////////////////////////////////////////////////////////////////
Listing 9.1 : Script CountUNCNames.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: CountUNCNames.vbs $ $Revision: 1 $ $Date: 7/05/99 11:23a $
' $Archive: /Scripts/CountUNCNames.vbs $
' Copyright (c) 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Compter les noms UNC sur la ligne de commande, répartis selon les indices pairs ' et impairs
Option Explicit
Dim oOddCount, oEvenCount, sArg, ix
Set oOddCount = New UNCCount
Set oEvenCount = New UNCCount
oOddCount.Reset : oEvenCount.Reset
For ix = 0 To Wscript.Arguments.Count - 1
sArg = Wscript.Arguments(ix)
If ix And 1 Then
oOddCount.AddName sArg
Else
oEvenCount.AddName sArg
End If
Next
Wscript.Echo oOddCount.Count, oEvenCount.Count
'////////////////////////////////////////////////////////////////////////////
' Classe de compteur UNC - compte les noms UNC
'
Class UNCCount
Public Count
' Initialiser toutes les propriétés
Public Sub Reset
Count = 0
End Sub
' Ajouter un nom (si c'est un nom UNC)
Public Sub AddName(sName)
If Left(sName, 2) = "\\" Then Count = Count + 1
End Sub
End Class
'////////////////////////////////////////////////////////////////////////////
Listing 9.2 : Script RDir.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: RDir.vbs $ $Revision: 2 $ $Date: 7/07/99 9:28p $
' $Archive: /Scripts/RDir.vbs $
' Copyright (c) 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Fichier d'expressions régulières utilisant la classe FileScan
Option Explicit
Dim oFileScan, oFSO, ix
Set oFSO = CreateObject("Scripting.FileSystemObject")
' Montrer usage si pas d'arguments
If Wscript.Arguments.Count < 1 Then
Wscript.Echo "usage : rdir reg-expr [chemin...]"
Wscript.Quit(0)
End If
' Créer l'objet FileScan et définir RE depuis la ligne de commande
Set oFileScan = New FileScan
oFileScan.Expr = Wscript.Arguments(0)
oFileScan.ScanSubFolders = True
' Traiter maintenant tous les arguments, ou utiliser le rép en cours si aucun
If Wscript.Arguments.Count > 1 Then
For ix = 1 To Wscript.Arguments.Count - 1
oFileScan.Execute oFSO.GetAbsolutePathName(Wscript.Arguments(ix))
Next
Else
oFileScan.Execute oFSO.GetAbsolutePathName(".")
End If
' Afficher les résultats
For ix = 0 To oFileScan.Count
Wscript.Echo oFileScan(ix)
Next
Wscript.Quit(oFileScan.Count)
'////////////////////////////////////////////////////////////////////////////
' FileScan
' Classe File scan, construit collection de fichiers selon une expr régulière
'
Class FileScan
Public Expr ' Expr rég à faire correspondre
Public MatchFullPath ' True pour faire correspondre chemin complet
Public ScanSubFolders ' True pour scanner sous-dossiers
Private sFiles ' Liste de fichiers correspondants
Private nCount ' Compte de correspondances
' Initialiser l'objet (supprimer toutes les correspondances de fichiers)
Public Sub Reset
nCount = 0 ' Ne marquer aucun fichier
sFiles = Empty ' Vider les tableaux de fichiers
End Sub
' Renvoyer le compte de fichiers en cours (R/O)
Public Property Get Count
Count = CInt(nCount) ' Renvoyez simplement le compte
End Property
' Exécuter recherche (construire liste fichiers)
Public Sub Execute(sPath)
Dim oFSO, oFolder, oRE
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder(sPath) ' Obtenir le chemin de fichier
Set oRE = New RegExp
oRE.Pattern = Expr ' Définir structure de comparaison
oRE.IgnoreCase = True ' Ignorer la casse
MatchFiles oRE, oFolder ' Faire correspondre fichiers ici
End Sub
Private Sub MatchFiles(oRE, oFolder) ' Faire corresp fichiers dans dossier
Dim oFile, oSubFolder
For Each oFile In oFolder.Files ' Parcourir tous fichiers
If MatchFullPath Then
If oRE.Test(oFile.Path) Then ' Corresp chemin complet
AddFile oFile.Path ' Ajouter si correspond
End If
Else
If oRE.Test(oFile.Name) Then ' Faire corresp nom
AddFile oFile.Path ' Ajouter si corresp
End If
End If
Next
If ScanSubFolders Then ' Si nécessaire..
For Each oSubFolder In oFolder.SubFolders ' Parcourir sous-dossiers
MatchFiles oRE, oSubFolder
Next
End If
End Sub
' Obtenir les fichiers distincts (propriété par défaut)
Public Default Property Get Item(nIndex) ' Obtenir élément indexé
Dim ixMajor, ixMinor
If (nIndex >= nCount) Or (nIndex >= 1024 * 4096) Then
Item = "" 'Fanion débordement
Else
ixMajor = nIndex / 4096 ' Calculer indice principal
ixMinor = nIndex And 4095 ' Calculer indice secondaire
Item = sFiles(ixMajor)(ixMinor) ' Obtenir nom de chemin
End If
End Property
' Ajouter nouvel élément fichier au tableau dynamique
Private Sub AddFile(sPath)
Dim ix, ixMajor, ixMinor, a ' Index de tableau
If IsEmpty(sFiles) Then ' Si encore aucun tableau..
ReDim sFiles(1023) ' Espace pour 1024 jeux
End If
ix = nCount ' Obtenir indice en cours
nCount = nCount + 1 ' Compteur complémentaire
If ix >= 1024 * 4096 Then Exit Sub ' Quitter si déborde !!
ixMajor = ix / 4096 ' Calculer indice principal
ixMinor = ix And 4095 ' Calculer indice secondaire
If IsEmpty(sFiles(ixMajor)) Then ' Si besoin nouveau tableau
ReDim a(4095) ' Créer tableau provisoire
sFiles(ixMajor) = a ' Copier pour peupler
End If
sFiles(ixMajor)(ixMinor) = sPath ' Ajouter chemin au tableau
End Sub
End Class
Listing 10.1 : Composant Simple.wsc
Listing 10.2 : Script UseSimple.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: UseSimple.vbs $ $Revision: 1 $ $Date: 7/13/99 9:57a $
' $Archive: /Scripts/UseSimple.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Echantillon WSH "Hello World!" simple
Option Explicit
Dim oSimple
Set oSimple = CreateObject("Simple.WSC")
Wscript.Echo oSimple.Hello
Set oSimple = Nothing
'////////////////////////////////////////////////////////////////////////////
Listing 10.3 : Composant FileScan.wsc
Listing 10.4 : Script Rdir2.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: RDir2.vbs $ $Revision: 1 $ $Date: 7/13/99 9:57a $
' $Archive: /Scripts/RDir2.vbs $
' Copyright (c) 1999 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Fichier de recherche d'expressions régulières utilisant la classe FileScan
Option Explicit
Dim oFileScan, oFSO, ix
Set oFSO = CreateObject("Scripting.FileSystemObject")
' Montrer usage si pas d'argument
If Wscript.Arguments.Count < 1 Then
Wscript.Echo "usage: filescan reg-expr [path...]"
Wscript.Quit(0)
End If
' Créer objet FileScan et définir le RE depuis la ligne de commande
Set oFileScan = CreateObject("FileScan.WSC")
oFileScan.Expr = Wscript.Arguments(0)
oFileScan.ScanSubFolders = True
' Traiter maintenant tous les arguments, ou utiliser rép en cours si aucun
If Wscript.Arguments.Count > 1 Then
For ix = 1 To Wscript.Arguments.Count - 1
oFileScan.Execute oFSO.GetAbsolutePathName(Wscript.Arguments(ix))
Next
Else
oFileScan.Execute oFSO.GetAbsolutePathName(".")
End If
' Afficher résultats
For ix = 0 To oFileScan.Count
Wscript.Echo oFileScan(ix)
Next
Wscript.Quit(oFileScan.Count)
Listing 11.1 : Script Template.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: Template.vbs $ $Revision: 1 $ $Date: 7/18/99 10:42p $
' $Archive: /Scripts/Template.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Modèle de création de scripts
' Déclaration explicite de variables et variables globales
Option Explicit
Dim g_sScriptPath, g_sScriptName, g_sScriptFolder, g_sVersion
Dim g_nTraceLevel
Dim g_oShell, g_oFSO
Dim s, ix, i
' Définir variables globales et créer objets globaux
g_sVersion = "1.0"
g_sScriptPath = Wscript.ScriptFullName
g_sScriptName = Wscript.ScriptName
g_sScriptFolder = Left(g_sScriptPath, Len(g_sScriptPath) - Len(g_sScriptName))
Set g_oShell = CreateObject("Wscript.Shell")
Set g_oFSO = CreateObject("Scripting.FileSystemObject")
' Définir contrôle de suivi depuis variable d'environnement WSHTRACE
i = g_oShell.Environment("Process").Item("WSHTRACE")
If IsNumeric(i) Then g_nTraceLevel = CInt(i) Else g_nTraceLevel = 0
' Vérifier présence de requêtes d'aide -help, -? etc sur ligne de commande
If Wscript.Arguments.Count > 0 Then
s = LCase(Wscript.Arguments(0))
If (s = "-help") Or (s = "-?") Or (s = "/help") Or (s = "/?") Then
ShowHelpMessage
Wscript.Quit(1)
End If
End If
' Afficher bannière d'accueil, puis appeler fonction Main
ix = Instr(g_sScriptName, ".")
If ix <> 0 Then s = Left(g_sScriptName, ix - 1) Else s = g_sScriptName
Wscript.Echo s & " version " & g_sVersion & vbCRLF
i = Main
' Libérer objets globaux standards, puis quitter script
Set g_oFSO = Nothing
Set g_oShell = Nothing
Wscript.Quit(i)
'////////////////////////////////////////////////////////////////////////////
' Main
' Fonction principale appelée pour incorporer logique principale du script
'
' Renvoie Code de sortie du script
'
Function Main
Trace 1, "+++Main"
' Val de renvoi est passé à Wscript.Quit comme code de sortie du script
Main = 0
End Function
'////////////////////////////////////////////////////////////////////////////
' ShowHelpMessage
' Afficher message d'aide
'
Sub ShowHelpMessage
Trace 1, "+++ShowHelpMessage"
Wscript.Echo "Placer ici du texte d'aide."
End Sub
'////////////////////////////////////////////////////////////////////////////
' Trace
' Sortie suivi débogage contrôlée par var env g_nTraceLevel et WSHTRACE
'
' nLevel Niveau de suivi. Afficher seulement si <= var env WSHTRACE
' sText Texte à afficher
'
Sub Trace(nLevel, sText)
if g_nTraceLevel >= nLevel Then Wscript.Echo sText
End Sub
'////////////////////////////////////////////////////////////////////////////
Listing 11.2 : Bibliothèque de composants MTPLib.wsc
MTP Library
Copyright (c) 1998-99 Tim Hill. All Rights Reserved.
1.0
Listing 12.1 : Script MTPLogon.bat
@echo OFF
if not "%ECHO%"=="" echo %ECHO%
rem $Workfile: MTPLogon.bat $ $Revision: 1 $ $Date: 7/25/99 12:59p $
rem Copyright (c) 1998 Tim Hill. All Rights Reserved.
set MTPLOGONVER=$Revision: 1 $
set WSHVERSION=510
set VBSVERSION=500
set WSHINSTALL=%0\..\WSH20EN.EXE /Q
set VBSINSTALL=%0\..\STE50EN.EXE /Q
set SCRIPTDIR=c:\Scripts
set SRCDIR=%0\..\LocalScripts
echo %%0=%0
rem Branch selon plate-forme OS (WSH ou non-WSH)
if "%windir%"=="" goto :NOWSH
if exist %windir%\system\kernel32.dll goto :WSHOK
if exist %windir%\system32\kernel32.dll goto :WSHOK
goto :NOWSH
:WSHOK
echo Exécution du script WSH...
rem Installer WSH si pas trouvé...
if exist %windir%\command\cscript.exe goto :WSHFOUND
if exist %windir%\system\cscript.exe goto :WSHFOUND
if exist %windir%\system32\cscript.exe goto :WSHFOUND
%WSHINSTALL%
:WSHFOUND
rem Installer VBScript si pas trouvé...
if exist %windir%\system\vbscript.dll goto :VBSFOUND
if exist %windir%\system32\vbscript.dll goto :VBSFOUND
%VBSINSTALL%
:VBSFOUND
rem Mise à jour WSH si nécessaire...
cscript //i //nologo %0\..\checkwshversion.vbs %WSHVERSION%
if errorlevel 1 %WSHINSTALL%
rem Mise à jour VBScript si nécessaire...
cscript //i //nologo %0\..\checkvbsversion.vbs %VBSVERSION%
if errorlevel 1 %VBSINSTALL%
rem Installation et inscription des scripts locaux
if not exist %SCRIPTDIR%\*.* md %SCRIPTDIR%
attrib -r -s -h %SCRIPTDIR%
rem del %SCRIPTDIR%\*.*
copy %SRCDIR% %SCRIPTDIR%
for %%i in (%SCRIPTDIR%\*.wsc) do regsvr32 /s /c scrobj.dll /n /i:file:%%i
rem Exécuter maintenant le script de connexion de phase 2...
cscript //i //nologo %0\..\mtplogon.vbs
goto :EXIT
rem Nous arrivons ici si nous fonctionnons sur une plate-forme non-WSH
:NOWSH
echo Exemption du script non-WSH...
if exist %0\..\doslogon.bat call %0\..\doslogon.bat
goto :EXIT
rem Dépannage spécial pour fin de script de connexion boguée
:EXIT
if exist c:\windows\*.* echo . >c:\windows\lmscript.$$$
if exist c:\win95\*.* echo . >c:\win95\lmscript.$$$
if exist c:\win98\*.* echo . >c:\win98\lmscript.$$$
Listing 12.2 : Script CheckWSHVersion.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: CheckWSHVersion.vbs $ $Revision: 1 $ $Date: 7/25/99 12:59p $
' $Archive: /Scripts/CheckWSHVersion.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Vérifie la version de WSH et renvoie zéro si ok, non-zéro si besoin mise à jour
Dim nVersion
nVersion = CInt(Wscript.Version * 100)
Wscript.Echo "Cela est la version : " & nVersion
If Wscript.Arguments.Count < 1 Then
Wscript.Echo "usage : checkwshversion "
Wscript.Echo " doit être 120 pour la version 1.20, etc."
Wscript.Echo "Renvoie 0 si ok, 1 si besoin mise à jour version"
Wscript.Quit(0)
End If
If nVersion < CInt(Wscript.Arguments(0)) Then
Wscript.Quit(1)
Else
Wscript.Quit(0)
End If
Listing 12.3 : Script CheckVBSVersion.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: CheckVBSVersion.vbs $ $Revision: 1 $ $Date: 7/25/99 12:59p $
' $Archive: /Scripts/CheckVBSVersion.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Vérifie version VBScript et renvoie 0 si ok, non-zéro si besoin mise à jour
Dim nVersion
nVersion = CInt((ScriptEngineMajorVersion * 100) + ScriptEngineMinorVersion)
Wscript.Echo "Cela est la version : " & nVersion
If Wscript.Arguments.Count < 1 Then
Wscript.Echo "usage : checkvbsversion "
Wscript.Echo " doit être 120 pour la version 1.20, etc."
Wscript.Echo "Renvoie 0 si ok, 1 si besoin mise à jour version"
Wscript.Quit(0)
End If
If nVersion < CInt(Wscript.Arguments(0)) Then
Wscript.Quit(1)
Else
Wscript.Quit(0)
End If
Listing 12.4 : Script MTPLogon.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: MTPLogon.vbs $ $Revision: 4 $ $Date: 7/25/99 3:17p $
' $Archive: /Scripts/MTPLogon.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Script de connexion de Phase 2
' Déclaration variables explicites et globales standards
Option Explicit
Dim g_oShell, g_oFSO, g_oNet, g_oGroupDict
Set g_oShell = CreateObject("Wscript.Shell")
Set g_oFSO = CreateObject("Scripting.FileSystemObject")
Set g_oNet = CreateObject("Wscript.Network")
' Un mappage de disque comprend ","
' Ur * dans les deux champs pour le disque ou répertoire d'accueil
Dim g_sDriveMap(25)
g_sDriveMap(0) = "J:,\\K140\JAZDRIVE"
g_sDriveMap(1) = "L:,\\K140\LIBRARY"
g_sDriveMap(2) = "S:,\\K140\SETUP"
g_sDriveMap(3) = "P:,*"
g_sDriveMap(4) = "K:,\\K140\COMMON"
g_sDriveMap(5) = "R:,\\K140\C$"
' Mapper disques selon table de mappage de disque
Dim sMap, bResult, sItems
For Each sMap In g_sDriveMap
If Not IsEmpty(sMap) Then
sItems = Split(sMap, ",")
bResult = MapDrive(sItems(0), sItems(1))
If Not bResult Then Wscript.Echo "*** FAILED"
End If
Next
' Mapper disque selon appartenance au groupe
If IsMember("Domain Admins") Then
bResult = MapDrive("W:", "\\K140\NetApps")
If Not bResult Then Wscript.Echo "*** FAILED"
End If
Wscript.Quit(0)
'////////////////////////////////////////////////////////////////////////////
' IsMember
' Tester pour voir si l'utilisateur appartient au groupe spécifié
'
' sGroup Nom du groupe
' Renvoie True si utilisateur est membre du groupe
'
Function IsMember(sGroup)
Dim sAdsPath, oUser, oGroup
' Peupler dictionnaire si pas encore créé
If IsEmpty(g_oGroupDict) Then
Set g_oGroupDict = CreateObject("Scripting.Dictionary")
g_oGroupDict.CompareMode = vbTextCompare
sAdsPath = g_oNet.UserDomain & "/" & g_oNet.UserName
Set oUser = GetObject("WinNT://" & sAdsPath & ",user")
For Each oGroup In oUser.Groups
g_oGroupDict.Add oGroup.Name, "-"
Next
Set oUser = Nothing
End If
IsMember = CBool(g_oGroupDict.Exists(sGroup))
End Function
'////////////////////////////////////////////////////////////////////////////
' MapDrive
' Mapper un disque réseau comme spécifié
'
' g_oFSO Objet FileSystem
' g_oNet Objet WshNetwork
' sPath Nom chemin pour disque ou * (peut être relatif)
' sUNCPath Chemin UNC vers partage ou * pour accueil (\\computer\sharename)
' Renvoie True si disque bien mappé, sinon erreur
'
Function MapDrive(ByVal sPath, ByVal sUNCPath)
Dim nExit, sAdsPath, oAdsObj, sComputer, sShare, x, sDrive, sLocalPath
' Si nécessaire, obtenir rép ou disque d'accueil
If sPath = "*" Or sUNCPath = "*" Then
sAdsPath = g_oNet.UserDomain & "/" & g_oNet.UserName
Set oAdsObj = GetObject("WinNT://" & sAdsPath & ",user")
If sPath = "*" Then sPath = oAdsObj.HomeDirDrive
If sUNCPath = "*" Then sUNCPath = oAdsObj.HomeDirectory
Set oAdsObj = Nothing
End If
' Valider les paramètres, puis analyser le nom UNC
If sPath = "" Or sUNCPath = "" Then
MapDrive = False : Exit Function
End If
x = Split(sUNCPath, "\")
If UBound(x) < 3 Then
MapDrive = False : Exit Function
End If
sComputer = x(2) : sShare = x(3)
sDrive = GetDriveName(sPath)
Wscript.Echo "Mappe : " & sDrive & " -> " & sUNCPath
' Essayer de démapper ou unSUBST le disque
UnmapDrive(sDrive)
' Ne peut mapper disque local
If IsLocalDrive(sDrive) Then
MapDrive = False : Exit Function
End If
' Si possible, utiliser SUBST, car plus rapide que boucle locale en retour
If IsWinNT And StrComp(sComputer, g_oNet.ComputerName, vbTextCompare) = 0 Then
sAdsPath = sComputer & "/lanmanserver/" & sShare
Set oAdsObj = GetObject("WinNT://" & sAdsPath & ",fileshare")
sLocalPath = oAdsObj.Path
Set oAdsObj = Nothing
nExit = RunCmd("subst " & sDrive & " " & sLocalPath)
' Terminé si bon mappage SUBST
If nExit = 0 Then
MapDrive = True : Exit Function
End If
End If
' Mapper le disque réseau et renvoyer le résultat
g_oNet.MapNetworkDrive sDrive, sUNCPath
MapDrive = IsNetworkDrive(sDrive)
End Function
'////////////////////////////////////////////////////////////////////////////
' UnmapDrive
' Supprimer mappage d'un disque réseau (ou un d'un disque SUBST sous WinNT)
'
' g_oFSO Objet FileSystem
' g_oNet Objet WshNetwork
' sPath Nom de chemin pour disque (peut être relatif)
'
Sub UnmapDrive(sPath)
Dim nExit, sDrive
sDrive = GetDriveName(sPath)
' Sous WinNT, disques SUBST apparaissent comme locaux
If IsWinNT And IsLocalDrive(sDrive) Then
nExit = RunCmd("subst " & sDrive & " /d")
End If
' Ne peut démapper que les disques réseau
If IsNetworkDrive(sDrive) Then
g_oNet.RemoveNetworkDrive sDrive, True, True
End If
End Sub
'////////////////////////////////////////////////////////////////////////////
' IsNetworkDrive
' Teste si un disque est un disque mis en réseau
'
' g_oFSO Objet FileSystem
' sPath Nom de chemin du disque (peut être relatif)
' Renvoie True si disque est mis en réseau, False sinon
Function IsNetworkDrive(sPath)
Dim oDrive
Set oDrive = GetDriveObject(sPath)
' Teste type si disque valide
If Not oDrive Is Nothing Then
IsNetworkDrive = CBool(oDrive.DriveType = 3)
Else
IsNetworkDrive = False
End If
End Function
'////////////////////////////////////////////////////////////////////////////
' IsLocalDrive
' Teste si un disque est local (tout type)
'
' g_oFSO Objet FileSystem
' sPath Nom chemin pour disque (peut être relatif)
' Renvoie True si disque est local, False sinon
'
Function IsLocalDrive(sPath)
Dim oDrive
Set oDrive = GetDriveObject(sPath)
' Teste type si disque valide
If Not oDrive Is Nothing Then
IsLocalDrive = CBool(oDrive.DriveType <> 3)
Else
IsLocalDrive = False
End If
End Function
'////////////////////////////////////////////////////////////////////////////
' GetDriveObject
' Obtient objet disque FSO avec vérification erreurs
'
' g_oFSO Objet FileSystem
' sPath Nom de chemin pour disque (peut être relatif)
' Renvoie Objet disque ou Nothing si le disque n'existe pas
'
Function GetDriveObject(sPath)
On Error Resume Next
Set GetDriveObject = Nothing
Set GetDriveObject = g_oFSO.GetDrive(GetDriveName(sPath))
If Err.Number <> 0 Then Set GetDriveObject = Nothing
End Function
'////////////////////////////////////////////////////////////////////////////
' GetDriveName
' Obtient nom du disque à partir du nom de chemin
'
' g_oFSO Objet FileSystem
' sPath Nom de chemin pour le disque (peut être relatif)
' Renvoie Nom du disque à partir du chemin
'
Function GetDriveName(sPath)
GetDriveName = g_oFSO.GetDriveName(g_oFSO.GetAbsolutePathName(sPath)) End Function
'////////////////////////////////////////////////////////////////////////////
' RunCmd
' Run a shell command
'
' g_oShell Objet WshShell
' sCmd Commande à exécuter
' Renvoie Code de sortie de l'application
'
Function RunCmd(sCmd)
Dim sShell
' Obtient le nom du processeur de commande
sShell = g_oShell.Environment("Process").Item("COMSPEC")
If sShell = "" Then
If IsWinNT Then sShell = "cmd" Else sShell = "command"
End If
' Exécute la commande via "COMSPEC /c command"
WScript.Echo "Run: " & sCmd
RunCmd = g_oShell.Run(sShell & " /c " & sCmd, &H20000000, True)
End Function
'////////////////////////////////////////////////////////////////////////////
' IsWinNT
' Teste pour savoir si Windows NT ou Windows 2000
'
' g_oShell Objet WshShell
' Renvoie True sur NT ou Win2K, False sinon
'
Function IsWinNT
Dim sOS
sOS = g_oShell.Environment("Process").Item("OS")
IsWinNT = CBool(sOS = "Windows_NT")
End Function
'////////////////////////////////////////////////////////////////////////////
Listing 13.1 : Script ADSIExplore.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: ADSIExplore.vbs $ $Revision: 1 $ $Date: 7/18/99 10:42p $
' $Archive: /Scripts/ADSIExplore.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Enumère tous les objets ADSI contenus dans l'ordinateur spécifié
' Déclaration variables explicites et globales standards
Option Explicit
Dim g_sScriptPath, g_sScriptName, g_sScriptFolder, g_sVersion
Dim g_nTraceLevel
Dim g_oShell, g_oFSO
Dim s, ix, i
' Définir globales standard et créer objets globaux
g_sVersion = "1.0"
g_sScriptPath = Wscript.ScriptFullName
g_sScriptName = Wscript.ScriptName
g_sScriptFolder = Left(g_sScriptPath, Len(g_sScriptPath) - Len(g_sScriptName))
Set g_oShell = CreateObject("Wscript.Shell")
Set g_oFSO = CreateObject("Scripting.FileSystemObject")
' Installer contrôle suivi depuis variable d'environnement WSHTRACE
i = g_oShell.Environment("Process").Item("WSHTRACE")
If IsNumeric(i) Then g_nTraceLevel = CInt(i) Else g_nTraceLevel = 0
' Rechercher requête d'aide -help, -? etc sur ligne de commande
If Wscript.Arguments.Count > 0 Then
s = LCase(Wscript.Arguments(0))
If (s = "-help") Or (s = "-?") Or (s = "/help") Or (s = "/?") Then
ShowHelpMessage
Wscript.Quit(1)
End If
End If
' Globales utilisées par Main etc
Dim g_bSubObjSwitch, g_bVerboseSwitch, g_aFilters
' Afficher bannière d'accueil, puis appeler fonction Main
ix = Instr(g_sScriptName, ".")
If ix <> 0 Then s = Left(g_sScriptName, ix - 1) Else s = g_sScriptName
Wscript.Echo s & " version " & g_sVersion & vbCRLF
i = Main
' Libérer globales standard, puis quitter script
Set g_oFSO = Nothing
Set g_oShell = Nothing
Wscript.Quit(i)
'////////////////////////////////////////////////////////////////////////////
' Main
' Fonction Main appelée pour incorporer logique du script principal
'
' Renvoie Code de sortie de script
'
Function Main
Trace 1, "+++Main"
Dim sAdsPath, oAdsObj, nCount, oArgs, oArg
' Analyser ligne de commande en globales
Set oArgs = CreateObject("MTP.CmdArgs")
oArgs.FromCollection(Wscript.Arguments) ' Obtenir ligne de commande
If oArgs.TypedCount(1+4) < 1 Then ' Si chemin manque..
ShowHelpMessage
Wscript.Quit(0)
End If
sAdsPath = oArgs.TypedItem(1+4, 0).Text ' Obtenir nom de chemin ADSI
g_bSubObjSwitch = oArgs.TestSwitch("c") Or oArgs.TestSwitch("s")
g_bVerboseSwitch = oArgs.TestSwitch("v")
ReDim g_aFilters(100) : ix = 0 : nCount = 0
Do
Set oArg = oArgs.FindArg(2, "f", ix) ' Trouver commutateur /f
If Not oArg Is Nothing Then
ix = oArg.Index + 1 ' Prêt pour la suite
g_aFilters(nCount) = oArg.Value ' Obtenir valeur filtre
nCount = nCount + 1
End if
Loop Until oArg Is Nothing
If nCount > 0 Then
ReDim Preserve g_aFilters(nCount - 1) ' Rogner tableau
Else
g_aFilters = Empty ' Supprimer tableau
End If
Set oArgs = Nothing
' Préparer objet ADSI
On Error Resume Next
Set oAdsObj = GetObject(sAdsPath)
If Err.Number <> 0 Then
Wscript.Echo sAdsPath & ": pas trouvé (0x" & Hex(Err.Number) & ")"
Wscript.Quit(Err.Number)
End If
On Error Goto 0
' Afficher en-tête, puis cliche objet principal et contenu
Wscript.StdOut.WriteLine "ADSI Dump of: " & sAdsPath
Wscript.StdOut.WriteLine
If g_bVerboseSwitch Then
DumpSchema "", oAdsObj
Wscript.StdOut.WriteLine
End If
DumpAll "", oAdsObj
' Valeur de retour passée à Wscript.Quit comme code pour quitter script
Main = 0
End Function
'////////////////////////////////////////////////////////////////////////////
' DumpSchema
' Clicher le schéma de l'objet ADSI spécifié
'
' sPrefix Espace préfixe pour mise en retrait
' oAdsObj Object à clicher
'
Sub DumpSchema(sPrefix, oAdsObj)
Trace 1, "+++DumpSchema"
Dim sData, oClass, sList
' Obtenir objet classe pour l'objet ADSI
Set oClass = GetObject(oAdsObj.Schema)
' Clicher contenu classe (objets)
Wscript.StdOut.WriteLine sPrefix & "Schéma pour classe : " & oClass.Name
If oClass.Container Then
Wscript.StdOut.WriteLine sPrefix & " Objets contenus :"
sList = ""
For Each sData In oClass.Containment
If sList = "" Then
sList = sData
Else
sList = sList & ", " & sData
End If
Next
Wscript.StdOut.WriteLine sPrefix & " " & sList
End If
' Clicher propriétés de la classe
Wscript.StdOut.WriteLine sPrefix & " Properties (O=optional, M=mandatory):"
For Each sData In oClass.MandatoryProperties
Wscript.StdOut.WriteLine sPrefix & " (M) " & sData
Next
For Each sData in oClass.OptionalProperties
Wscript.StdOut.WriteLine sPrefix & " (O) " & sData
Next
End Sub
'////////////////////////////////////////////////////////////////////////////
' DumpAll
' Clicher objet et tout objet qu'il contient, récursivement
'
' sPrefix Espace préfixe pour mise en retrait
' oAdsObj Objet à clicher
'
Sub DumpAll(sPrefix, oAdsObj)
Trace 2, "+++DumpAll"
Dim oSubObj
' Clicher objet lui-même
DumpObject sPrefix, oAdsObj
Wscript.StdOut.WriteLine
' Si objet dans conteneur, énumérer tous objets contenus
If g_bSubObjSwitch And GetObject(oAdsObj.Schema).Container = True Then
If Not IsEmpty(g_aFilters) Then
oAdsObj.Filter = g_aFilters ' Définir filtres
End If
For Each oSubObj In oAdsObj
DumpAll sPrefix & " ", oSubObj
Next
End If
End Sub
'////////////////////////////////////////////////////////////////////////////
' DumpObject
' Clicher objet ADSI distinct (ainsi que les infos en rapport avec objet)
'
' sPrefix Préfixes espaces pour mise en retrait
' oAdsObj Objet à clicher
'
Sub DumpObject(sPrefix, oAdsObj)
Trace 3, "+++DumpObject"
Dim nPropCount, ix, sName, vData, sType, oPropEntry
' Afficher informations élémentaires objet
Wscript.StdOut.WriteLine sPrefix & "*** " & oAdsObj.Class & ": " & oAdsObj.Name
Wscript.StdOut.WriteLine sPrefix & "AdsPath: " & oAdsObj.AdsPath & "," & oAdsObj.Class
' Charger cache de propriétés et obtenir décompte propriétés
oAdsObj.GetInfo
On Error Resume Next
nPropCount = oAdsObj.PropertyCount
If Err.Number <> 0 Then nPropCount = 0
On Error Goto 0
' Traiter toutes informations spécifiques de la classe
Select Case oAdsObj.Class
Case "Group", "LocalGroup"
Wscript.StdOut.WriteLine sPrefix & "Membres:"
Wscript.StdOut.WriteLine sPrefix & " " & GetList(oAdsObj.Members)
Case "Utilisateur"
Wscript.StdOut.WriteLine sPrefix & "Groupes :"
Wscript.StdOut.WriteLine sPrefix & " " & GetList(oAdsObj.Groups)
Case "Service"
Wscript.StdOut.WriteLine sPrefix & "Etat =" & oAdsObj.Status
Case "FileService"
Wscript.StdOut.WriteLine sPrefix & "Sessions :"
Wscript.StdOut.WriteLine sPrefix & " " & GetList(oAdsObj.Sessions)
End Select
' Clicher liste propriétés (si prolixe)
If nPropCount <> 0 And g_bVerboseSwitch Then
Wscript.StdOut.WriteLine sPrefix & "Propriétés (" & nPropCount & "):"
For ix = 0 To nPropCount - 1
Set oPropEntry = oAdsObj.Item(ix)
If oPropEntry.AdsType <> 0 Then
vData = oAdsObj.Get(oPropEntry.Name)
sType = oPropEntry.AdsType & "," & TypeName(vData)
sName = oPropEntry.Name & "[" & sType & "]="
Wscript.StdOut.WriteLine sPrefix & " " & sName & CStr(vData)
End If
Next
End If
End Sub
' Elaborer liste de noms délimitée par virgules
Function GetList(oColl)
Dim oObj
GetList = ""
For Each oObj In oColl ' Pour chaque objet
If GetList = "" Then ' si premier élément..
GetList = oObj.Name
Else
GetList = GetList & ", " & oObj.Name
End If
Next
End Function
'////////////////////////////////////////////////////////////////////////////
' ShowHelpMessage
' Afficher message d'aide
'
Sub ShowHelpMessage
Trace 1, "+++ShowHelpMessage"
Wscript.Echo "usage: adsiexplore []"
Wscript.Echo " /c Cliché contenait objets (secondaires)"
Wscript.Echo " /s Même que /c"
Wscript.Echo " /f:cls Filtre pour classe spécifiée (déf : tous)"
Wscript.Echo " (Plusieurs commutateurs /f autorisés)"
Wscript.Echo " /v Sortie prolixe (schéma et autres détails)"
Wscript.Echo ""
Wscript.Echo "Enumère toutes propriétés ADSI dans espace WinNT pour"
Wscript.Echo "chemin ADSI spécifié (e.g. WinNT://ordinateur,ordinateur)."
End Sub
'////////////////////////////////////////////////////////////////////////////
' Trace
' Débogue sortie trace contrôlée par var env g_nTraceLevel et WSHTRACE
'
' nLevel Niveau suivi. Seulement afficher si >= var env WSHTRACE
' sText Texte à afficher
'
Sub Trace(nLevel, sText)
if g_nTraceLevel > nLevel Then Wscript.Echo sText
End Sub
'////////////////////////////////////////////////////////////////////////////
Listing 13.2 : Script DumpUsers.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: DumpUsers.vbs $ $Revision: 1 $ $Date: 7/18/99 10:42p $
' $Archive: /Scripts/DumpUsers.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Saisir les comptes utilisateurs sur une feuille de calcul Excel
' Déclaration variables explicites et globales standards
Option Explicit
Dim g_sScriptPath, g_sScriptName, g_sScriptFolder, g_sVersion
Dim g_nTraceLevel
Dim g_oShell, g_oFSO
Dim s, ix, i
' Définir globales standards et créer objets globaux
g_sVersion = "1.0"
g_sScriptPath = Wscript.ScriptFullName
g_sScriptName = Wscript.ScriptName
g_sScriptFolder = Left(g_sScriptPath, Len(g_sScriptPath) - Len(g_sScriptName))
Set g_oShell = CreateObject("Wscript.Shell")
Set g_oFSO = CreateObject("Scripting.FileSystemObject")
' Installer contrôle de suivi depuis variable d'environnement WSHTRACE
i = g_oShell.Environment("Process").Item("WSHTRACE")
If IsNumeric(i) Then g_nTraceLevel = CInt(i) Else g_nTraceLevel = 0
' Rechercher requête d'aide -help, -? etc sur ligne de commande
If Wscript.Arguments.Count > 0 Then
s = LCase(Wscript.Arguments(0))
If (s = "-help") Or (s = "-?") Or (s = "/help") Or (s = "/?") Then
ShowHelpMessage
Wscript.Quit(1)
End If
End If
' Afficher bannière d'accueuil, puis appeler fonction Main
ix = Instr(g_sScriptName, ".")
If ix <> 0 Then s = Left(g_sScriptName, ix - 1) Else s = g_sScriptName
Wscript.Echo s & " version " & g_sVersion & vbCRLF
i = Main
' Libérer objets globaux standards, puis quitter script
Set g_oFSO = Nothing
Set g_oShell = Nothing
Wscript.Quit(i)
'////////////////////////////////////////////////////////////////////////////
' Main
' Fonction Main appelée pour incorporer logique du script principal
'
' Renvoie Code de sortie du script
'
Function Main
Trace 1, "+++Main"
Dim sAdsPath, sExcelPath, oSheet, oExcel, oUser, oAdsObj
' Valider ligne de commande et obtenir args
If Wscript.Arguments.Count < 2 Then
ShowHelpMessage
Wscript.Quit(1)
End If
sAdsPath = "WinNT://" & Wscript.Arguments(0)
sExcelPath = g_oFSO.GetAbsolutePathName(Wscript.Arguments(1))
' Préparer objet ordinateur/domaine ADSI
On Error Resume Next
Set oAdsObj = GetObject(sAdsPath)
If Err.Number <> 0 Then
Wscript.Echo sAdsPath & ": pas trouvé (0x" & Hex(Err.Number) & ")"
Wscript.Quit(Err.Number)
End If
On Error Goto 0
' Préparer feuille de calcul
Set oExcel = CreateObject("Excel.Application")
oExcel.Workbooks.Add
oExcel.ActiveWorkbook.Worksheets.Add
Set oSheet = oExcel.ActiveWorkbook.Worksheets(1)
oSheet.Cells.Font.Size = 8
oSheet.Name = "Clicher utilisateur"
oSheet.Cells(1,1).Value = "Clicher données uts. sur : " & Wscript.Arguments(0)
oSheet.Cells(1,1).Font.Bold = True
oSheet.Cells(1,1).Font.Size = 10
oSheet.Range("A3:I3").Font.Bold = True
oSheet.Range("A3:I3").Interior.Color = RGB(192,192,192)
SetupCol oSheet, 3, 1, 12, "Nom"
SetupCol oSheet, 3, 2, 18, "Nom complet"
SetupCol oSheet, 3, 3, 10, "Disque d'accueil"
SetupCol oSheet, 3, 4, 12, "Rép d'accueil"
SetupCol oSheet, 3, 5, 12, "Script de connexion"
SetupCol oSheet, 3, 6, 8, "Fanions utilisateurs"
SetupCol oSheet, 3, 7, 12, "Profil"
SetupCol oSheet, 3, 8, 36, "Description"
SetupCol oSheet, 3, 9, 36, "Groupes"
' Enumérer tous les utilisateurs dans l'ordinateur/domaine
oAdsObj.Filter = Array("User") ' Filtrer cptes utilisateurs seult
ix = 0
For Each oUser In oAdsObj ' Pour chaque compte utilisateur..
DumpAccount oSheet, ix, oUser ' Aller ajouter à feuille
ix = ix + 1 ' indice complémentaire
Next
' Enregistrer feuille de calcul et fermer
oExcel.ActiveWorkbook.SaveAs sExcelPath
oExcel.ActiveWorkbook.Close
Set oSheet = Nothing
Set oExcel = Nothing
Set oAdsObj = Nothing
' Val de retour est passée à Wscript.Quit quand script quitte code
Main = 0
End Function
Sub SetupCol(oSheet, nRow, nCol, nWidth, sTitle)
oSheet.Cells(nRow, nCol).Value = sTitle
oSheet.Cells(nRow, nCol).ColumnWidth = nWidth
End Sub
'////////////////////////////////////////////////////////////////////////////
' DumpAccount
' Clicher comptes utilisateurs
'
' oSheet Objet feuille de calcul
' ix Indice compte
' oUser Objet compte utilisateur
'
Sub DumpAccount(oSheet, ix, oUser)
Dim oObj, sList
' Elaborer liste groupes
sList = ""
For Each oObj In oUser.Groups
If sList = "" Then
sList = oObj.Name
Else
sList = sList & ", " & oObj.Name
End If
Next
' Définir valeurs cellules
oSheet.Cells(4 + ix, 1).Value = oUser.Name
oSheet.Cells(4 + ix, 2).Value = oUser.FullName
oSheet.Cells(4 + ix, 3).Value = oUser.HomeDirDrive
oSheet.Cells(4 + ix, 4).Value = oUser.HomeDirectory
oSheet.Cells(4 + ix, 5).Value = oUser.LoginScript
oSheet.Cells(4 + ix, 6).Value = "0x" & Hex(oUser.UserFlags)
oSheet.Cells(4 + ix, 7).Value = oUser.Profile
oSheet.Cells(4 + ix, 8).Value = oUser.Description
oSheet.Cells(4 + ix, 9).Value = sList
End Sub
'////////////////////////////////////////////////////////////////////////////
' ShowHelpMessage
' Affiche message d'aide
'
Sub ShowHelpMessage
Trace 1, "+++ShowHelpMessage"
Wscript.Echo "utilisation : utilisateursclichés "
Wscript.Echo
Wscript.Echo "Cliché des informations comptes utilisateurs sous feuille de"
Wscript.Echo "calcul Excel spécifiée. Spécifier un nom d'ordinateur ou un nom"
Wscript.Echo "de domaine. Pour améliorer performances, ajoute "",ordinateur"""
Wscript.Echo "aux noms d'ordinateurs et "",domaine"" aux noms de domaines."
Wscript.Echo "Par exemple :"
Wscript.Echo
Wscript.Echo " utilisateursclichés mondomaine,domaine mondomaine.xls"
Wscript.Echo
Wscript.Echo "Clichera les uts du domaine MONDOMAIN vers MYDOMAIN.XLS"
End Sub
'////////////////////////////////////////////////////////////////////////////
' Trace
' Déboguer sortie de suivi contrôlé par var env g_nTraceLevel et WSHTRACE
'
' nLevel Niveau de suivi. N'affiche que si >= var en WSHTRACE
' sText Texte à afficher
'
Sub Trace(nLevel, sText)
if g_nTraceLevel > nLevel Then Wscript.Echo sText
End Sub
'////////////////////////////////////////////////////////////////////////////
Listing 13.3 : Script NewUser.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: NewUser.vbs $ $Revision: 1 $ $Date: 7/18/99 10:42p $
' $Archive: /Scripts/NewUser.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Créer un nouvel utilisateur dans l'ordinateur ou le domaine spécifié
' Déclaration variables explicites et globales standards
Option Explicit
Dim g_sScriptPath, g_sScriptName, g_sScriptFolder, g_sVersion
Dim g_nTraceLevel
Dim g_oShell, g_oFSO
Dim s, ix, i
' Définir globales standards et créer objets globaux
g_sVersion = "1.0"
g_sScriptPath = Wscript.ScriptFullName
g_sScriptName = Wscript.ScriptName
g_sScriptFolder = Left(g_sScriptPath, Len(g_sScriptPath) - Len(g_sScriptName))
Set g_oShell = CreateObject("Wscript.Shell")
Set g_oFSO = CreateObject("Scripting.FileSystemObject")
' Définir contrôle de suivi depuis variable d'environnement WSHTRACE
i = g_oShell.Environment("Process").Item("WSHTRACE")
If IsNumeric(i) Then g_nTraceLevel = CInt(i) Else g_nTraceLevel = 0
' Rechercher requêtes d'aide -help, -? etc sur ligne de commande
If Wscript.Arguments.Count > 0 Then
s = LCase(Wscript.Arguments(0))
If (s = "-help") Or (s = "-?") Or (s = "/help") Or (s = "/?") Then
ShowHelpMessage
Wscript.Quit(1)
End If
End If
' Globales utilisées par Main etc
Dim g_bDomainSwitch, g_sFullNameSwitch, g_sDescriptionSwitch
Dim g_sLoginScriptSwitch, g_sHomeDirSwitch, g_sHomeDriveSwitch
Dim g_aGroupList, g_sHomeComputerSwitch, g_sProtoFilesSwitch
Dim g_sPasswordSwitch, g_sComputerName, g_sUserName
' Afficher bannière d'accueil, puis appeler fonction Main
ix = Instr(g_sScriptName, ".")
If ix <> 0 Then s = Left(g_sScriptName, ix - 1) Else s = g_sScriptName
Wscript.Echo s & " version " & g_sVersion & vbCRLF
i = Main
' Libérer objets globaux standards, puis quitter script
Set g_oFSO = Nothing
Set g_oShell = Nothing
Wscript.Quit(i)
'////////////////////////////////////////////////////////////////////////////
' Main
' Fonction Main appelée pour incorporer logique du script principal
'
' Renvoie Code de sortie du script
'
Function Main
Trace 1, "+++Main"
Dim oArgs, oArg, ix, nCount, sAdsPath, oAdsObj
Dim oUser, oGroup, sGroup
' Obtenir ligne de commande et analyser en globales
Set oArgs = CreateObject("MTP.CmdArgs")
oArgs.FromCollection(Wscript.Arguments) ' Obtenir ligne de commande
If oArgs.TypedCount(1+4) < 2 Then ' doit avoir ord+utilisateur
ShowHelpMessage
Wscript.Quit(0)
End If
g_sComputerName = oArgs.TypedItem(1+4, 0) ' Obtenir nom ordinateur
g_sUserName = oArgs.TypedItem(1+4, 1) ' .. et nom utilisateur
g_bDomainSwitch = oArgs.TestSwitch("Domain")
g_sFullNameSwitch = oArgs.GetSwitch("FullName", "")
g_sDescriptionSwitch = oArgs.GetSwitch("Description", "")
g_sLoginScriptSwitch = oArgs.GetSwitch("LoginScript", "")
g_sHomeDirSwitch = oArgs.GetSwitch("HomeDir", "")
g_sHomeDriveSwitch = oArgs.GetSwitch("HomeDrive", "")
g_sHomeComputerSwitch = oArgs.GetSwitch("HomeComputer", "")
g_sProtoFilesSwitch = oArgs.GetSwitch("ProtoFiles", "")
g_sPasswordSwitch = oArgs.GetSwitch("Password", "")
ix = 0 : nCount = 0 : ReDim g_aGroupList(100)
Do
Set oArg = oArgs.FindArg(2, "Group", ix) ' Obtenir argument groupe..
If Not oArg Is Nothing Then
ix = oArg.Index + 1 ' Définir indice de recherche
g_aGroupList(nCount) = oArg.Value ' Obtenir nom groupe
nCount = nCount + 1 ' Compteur complémentaire
End If
Loop Until oArg Is Nothing
If nCount > 0 Then ' Si quelques groupes..
ReDim Preserve g_aGroupList(nCount - 1) ' Rogner tableau
Else
g_aGroupList = Empty ' Ne marquer aucun groupe
End If
Set oArgs = Nothing
' Préparer objet ADSI
sAdsPath = "WinNT://" & g_sComputerName ' Chemin basique
If g_bDomainSwitch Then ' S'il s'agit d'un domaine..
sAdsPath = sAdsPath & ",domaine"
Else
sAdsPath = sAdsPath & ",ordinateur"
End If
Set oAdsObj = GetObject(sAdsPath)
' Si /HomeComputer spécifié, créer le partage et modifier le rép d'accueil
If g_sHomeComputerSwitch <> "" And g_sHomeDirSwitch <> "" Then
g_sHomeDirSwitch = CreateHomeShare(g_sHomeComputerSwitch, g_sUserName, g_sHomeDirSwitch)
End If
' Créer le compte de base
Set oUser = oAdsObj.Create("user", g_sUserName)
oUser.FullName = g_sFullNameSwitch ' Définit nom utilisateur complet
oUser.Description = g_sDescriptionSwitch ' .. et description
oUser.LoginScript = g_sLoginScriptSwitch ' Nom script de connexion
oUser.HomeDirectory = g_sHomeDirSwitch ' Rép et disque d'accueuil
oUser.SetInfo ' Mettre à jour objet
If g_sPasswordSwitch <> "" Then
oUser.SetPassword = g_sPasswordSwitch ' Définir le mot de passe
End If
oUser.SetInfo ' Mettre à jour objet
' Ajouter le nouveau compte au groupe requis
If Not IsEmpty(g_aGroupList) Then ' Si quelques-uns spécifiés..
For Each sGroup In g_aGroupList ' Pour chaque groupe..
Set oGroup = GetObject(oAdsObj.AdsPath & "/" & sGroup & ",groupe")
oGroup.Add oUser.AdsPath ' Ajouter utilisateur
Set oGroup = Nothing
Next
End If
Set oUser = Nothing
' Copier prototype arborescence vers nouveau répertoire d'accueil
If g_sProtoFilesSwitch <> "" And g_sHomeDirSwitch <> "" Then
Wscript.Echo "Copie: " & g_sProtoFilesSwitch & " En : " & g_sHomeDirSwitch
g_oFSO.CopyFolder g_sProtoFilesSwitch, g_sHomeDirSwitch & "\", False
End If
' Valeur de retour est passée à Wscript.Quit comme code de script de sortie
Main = 0
End Function
'////////////////////////////////////////////////////////////////////////////
' CreateHomeShare
' Créer un nouveau partage sur l'ordinateur spécifié
'
' sComputer Ordinateur cible (où créer partage)
' sUserName Nom de compte utilisateur pour partage
' sPath Chemin vers partage sur ordinateur (chemin local)
' Renvoie Chemin UNC vers nouveau partage
'
Function CreateHomeShare(sComputer, sUserName, sPath)
Trace 1, "+++ShowHelpMessage"
Dim oAdsObj, sAdsPath, oShare
sAdsPath = "WinNT://" & sComputer & "/lanmanserver,fileservice"
Set oAdsObj = GetObject(sAdsPath) ' Obtenir chemin service
Set oShare = oAdsObj.Create("fileshare", sUserName & "$") ' Créer partage
oShare.Path = sPath ' Définir chemin local de partage
oShare.SetInfo ' Enregistrer nouveau partage
Set oAdsObj = Nothing
CreateHomeShare = "\\" & sComputer & "\" & sUserName & "$"
End Function
'////////////////////////////////////////////////////////////////////////////
' ShowHelpMessage
' Afficher message d'aide
'
Sub ShowHelpMessage
Trace 1, "+++ShowHelpMessage"
Wscript.Echo "usage : newuser []"
Wscript.Echo
Wscript.Echo "Crée un nouveau compte utilisateur sur l'ordi ou le domaine"
Wscript.Echo "specifié comme premier argument. Les commutateurs suivants"
Wscript.Echo "sont pris en charge :"
Wscript.Echo " /Domain Crée le compte dans un domaine"
Wscript.Echo " /FullName:name Nom complet des utilisateurs"
Wscript.Echo " /Description:text Texte descriptif pour comptes"
Wscript.Echo " /LoginScript:name Nom du script de connexion"
Wscript.Echo " /HomeDir:path Chemin vers répertoire d'accueil"
Wscript.Echo " /HomeDrive:name Disque à mapper au chemin d'accueil"
Wscript.Echo " /Group:name Rendre utilisateur membre du groupe"
Wscript.Echo " /HomeComputer:name Ordinateur pour partage username$"
Wscript.Echo " /ProtoFiles:path Source des fichiers prototypes"
Wscript.Echo " /Password:pwd Mot de passe initial"
Wscript.Echo "Plusieurs commutateurs /Group sont autorisés. Si le"
Wscript.Echo "/HomeComputer est spécifié, un nouveau partage appelé username$"
Wscript.Echo "sera créé sur l'ordinateur à l'emplacement dans"
Wscript.Echo "/HomeDir. Le répertoire d'accueil effectif du compte"
Wscript.Echo "référencera alors ce partage."
End Sub
'////////////////////////////////////////////////////////////////////////////
' Trace
' Déboguer sortie de suivi contrôlée par var env g_nTraceLevel and WSHTRACE
'
' nLevel Niveau de sortie. Ne s'affiche que si >= var env WSHTRACE
' sText Texte à afficher
'
Sub Trace(nLevel, sText)
if g_nTraceLevel > nLevel Then Wscript.Echo sText
End Sub
'////////////////////////////////////////////////////////////////////////////
Listing 14.1 : Script XMLDir.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: XMLDir.vbs $ $Revision: 1 $ $Date: 7/18/99 10:42p $
' $Archive: /Scripts/XMLDir.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Génère la représentation XML d'un répertoire
' Déclaration de variables explicites et globales standards
Option Explicit
Dim g_sScriptPath, g_sScriptName, g_sScriptFolder, g_sVersion
Dim g_nTraceLevel
Dim g_oShell, g_oFSO
Dim s, ix, i
' Définir globales standards et créer objets globaux
g_sVersion = "1.0"
g_sScriptPath = Wscript.ScriptFullName
g_sScriptName = Wscript.ScriptName
g_sScriptFolder = Left(g_sScriptPath, Len(g_sScriptPath) - Len(g_sScriptName))
Set g_oShell = CreateObject("Wscript.Shell")
Set g_oFSO = CreateObject("Scripting.FileSystemObject")
' Installer contrôle de suivi à partir de la variable d'environnement WSHTRACE
i = g_oShell.Environment("Process").Item("WSHTRACE")
If IsNumeric(i) Then g_nTraceLevel = CInt(i) Else g_nTraceLevel = 0
' Rechercher requêtes d'aide -help, -? etc sur ligne de commande
If Wscript.Arguments.Count > 0 Then
s = LCase(Wscript.Arguments(0))
If (s = "-help") Or (s = "-?") Or (s = "/help") Or (s = "/?") Then
ShowHelpMessage
Wscript.Quit(1)
End If
End If
' Afficher bannière d'accueil, puis appeler fonction Main
ix = Instr(g_sScriptName, ".")
If ix <> 0 Then s = Left(g_sScriptName, ix - 1) Else s = g_sScriptName
Wscript.Echo s & " version " & g_sVersion & vbCRLF
i = Main
' Libérer objets globaux standards, puis quitter le script
Set g_oFSO = Nothing
Set g_oShell = Nothing
Wscript.Quit(i)
'////////////////////////////////////////////////////////////////////////////
' Main
' Fonction Main appelée pour incorporer la logique du script principal
'
' Renvoie Code de sortie du script
'
Function Main
Trace 1, "+++Main"
Dim sPath, oFolder, oFile, oSubFolder
' Obtenir le nom de chemin absolu du répertoire
If Wscript.Arguments.Count < 1 Then
sPath = "." ' Utiliser ce répertoire
Else
sPath = Wscript.Arguments(0)
End If
sPath = g_oFSO.GetAbsolutePathName(sPath) ' Rendre absolu
Set oFolder = g_oFSO.GetFolder(sPath) ' Obtenir dossier
' Emettre la séquence de début de bloc
Wscript.StdOut.WriteLine "" ' En-tête XML spécial
Wscript.StdOut.WriteLine ""
Wscript.StdOut.WriteLine
Wscript.StdOut.WriteLine ""
' Emettre éléments de fichiers et de dossiers distincts
For Each oFile In oFolder.Files ' Pour chaque fichier..
EmitFile " ", oFile ' Emettre code XML
Next
For Each oSubFolder In oFolder.SubFolders ' Pour chaque dossier
EmitFolder " ", oSubFolder ' Emettre code XML
Next
' Emettre la séquence de fin de bloc
Wscript.StdOut.WriteLine ""
Set oFolder = Nothing
' Valeur de retour passée à Wscript.Quit comme code de sortie du script
Main = 0
End Function
'////////////////////////////////////////////////////////////////////////////
' EmitFile
' Emit file object as XML
'
Sub EmitFile(sPrefix, oFile)
Wscript.StdOut.WriteLine sPrefix & "" ' Elément de départ
EmitElement sPrefix & " ", "NOM", oFile.Name
EmitElement sPrefix & " ", "DATECREATION", oFile.DateCreated
EmitElement sPrefix & " ", "DATEDERNIERACCES", oFile.DateLastAccessed
EmitElement sPrefix & " ", "DATEDERNIEREMODIF", oFile.DateLastModified
EmitElement sPrefix & " ", "TAILLE", oFile.Size
EmitElement sPrefix & " ", "ATTR", GetAttrString(oFile.Attributes)
Wscript.StdOut.WriteLine sPrefix & "" ' Elément de fermeture
End Sub
'////////////////////////////////////////////////////////////////////////////
' EmitFolder
' Emettre objet dossier comme code XML
'
Sub EmitFolder(sPrefix, oFolder)
Wscript.StdOut.WriteLine sPrefix & "" ' Elément de départ
EmitElement sPrefix & " ", "NOM", oFolder.Name
EmitElement sPrefix & " ", "DATECREATION", oFolder.DateCreated
EmitElement sPrefix & " ", "DATEDERNIERACCES", oFolder.DateLastAccessed
EmitElement sPrefix & " ", "DATEDERNIEREMODIF", oFolder.DateLastModified
EmitElement sPrefix & " ", "ATTR", GetAttrString(oFolder.Attributes)
Wscript.StdOut.WriteLine sPrefix & "" ' Elément de fermeture
End Sub
'////////////////////////////////////////////////////////////////////////////
' GetAttrString
' Obtenir attributs sous forme chaîne
'
Function GetAttrString(nAttr)
Dim sAttr
GetAttrString = ""
If nAttr And 1 Then sAttr = "R" Else sAttr = "-"
GetAttrString = GetAttrString & sAttr
If nAttr And 2 Then sAttr = "H" Else sAttr = "-"
GetAttrString = GetAttrString & sAttr
If nAttr And 4 Then sAttr = "S" Else sAttr = "-"
GetAttrString = GetAttrString & sAttr
If nAttr And 8 Then sAttr = "V" Else sAttr = "-"
GetAttrString = GetAttrString & sAttr
If nAttr And 16 Then sAttr = "D" Else sAttr = "-"
GetAttrString = GetAttrString & sAttr
If nAttr And 32 Then sAttr = "A" Else sAttr = "-"
GetAttrString = GetAttrString & sAttr
End Function
'////////////////////////////////////////////////////////////////////////////
' EmitElement
' Emettre éléments XML distincts
'
Sub EmitElement(sPrefix, sName, sValue)
Dim sElement
sElement = "<" & sName & ">" & MakeXML(sValue) & "" & sName & ">"
Wscript.StdOut.WriteLine sPrefix & sElement
End Sub
'////////////////////////////////////////////////////////////////////////////
' MakeXML and MakeQXML
' Rendre chaîne valide pour utilisation XML (convertit en entités cars réservés)
'
' sString Chaîne à convertir
'
Function MakeXML(sString)
' Remplacer par entités les caractères réservés
MakeXML = sString ' Obtenir chaîne de remplacement
MakeXML = Replace(MakeXML, "&", "&") ' DOIT VENIR D'ABORD !!
MakeXML = Replace(MakeXML, "<", "<") ' Inférieur à
MakeXML = Replace(MakeXML, ">", ">") ' Supérieur à
MakeXML = Replace(MakeXML, "'", "'") ' Apostrophe
MakeXML = Replace(MakeXML, Chr(34), """) ' Doubles guillemets
End Function
Function MakeQXML(sString)
MakeQXML = Chr(34) & MakeXML(sString) & Chr(34)
End Function
'////////////////////////////////////////////////////////////////////////////
' ShowHelpMessage
' Afficher message d'aide
'
Sub ShowHelpMessage
Trace 1, "+++ShowHelpMessage"
Wscript.Echo "usage : xmldir []"
Wscript.Echo
Wscript.Echo "Génère un fichier XML vers StdOut contenant un fichier XML"
Wscript.Echo "bien formé (sans DTD) décrivant le contenu du répertoire "
Wscript.Echo "spécifié, ou le répertoire actuel si aucun n'est"
Wscript.Echo "spécifié."
End Sub
'////////////////////////////////////////////////////////////////////////////
' Trace
' Déboguer sortie de suivi contrôlée par var env g_nTraceLevel et WSHTRACE
'
' nLevel Niveau de suivi. N'affiche que si >= var env WSHTRACE
' sText Texte à afficher
'
Sub Trace(nLevel, sText)
if g_nTraceLevel > nLevel Then Wscript.Echo sText
End Sub
'////////////////////////////////////////////////////////////////////////////
Listing 14.2 : Script VBSToWS.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: VBSToWS.vbs $ $Revision: 1 $ $Date: 7/18/99 10:42p $
' $Archive: /Scripts/VBSToWS.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Convertit un script .VBS en script .WS
' Déclaration de variables explicites et globales standards
Option Explicit
Dim g_sScriptPath, g_sScriptName, g_sScriptFolder, g_sVersion
Dim g_nTraceLevel
Dim g_oShell, g_oFSO
Dim s, ix, i
' Définir globales standards et créer objets globaux
g_sVersion = "1.0"
g_sScriptPath = Wscript.ScriptFullName
g_sScriptName = Wscript.ScriptName
g_sScriptFolder = Left(g_sScriptPath, Len(g_sScriptPath) - Len(g_sScriptName))
Set g_oShell = CreateObject("Wscript.Shell")
Set g_oFSO = CreateObject("Scripting.FileSystemObject")
' Définir contrôle de suivi depuis la variable d'environnement WSHTRACE
i = g_oShell.Environment("Process").Item("WSHTRACE")
If IsNumeric(i) Then g_nTraceLevel = CInt(i) Else g_nTraceLevel = 0
' Rechercher les requêtes d'aide -help, -? etc sur la ligne de commande
If Wscript.Arguments.Count > 0 Then
s = LCase(Wscript.Arguments(0))
If (s = "-help") Or (s = "-?") Or (s = "/help") Or (s = "/?") Then
ShowHelpMessage
Wscript.Quit(1)
End If
End If
' Afficher bannière d'accueil, puis appeler fonction Main
ix = Instr(g_sScriptName, ".")If ix <> 0 Then s = Left(g_sScriptName, ix - 1) Else s = g_sScriptName
Wscript.Echo s & " version " & g_sVersion & vbCRLF
i = Main
' Libérer objets globaux standards, puis quitter le script
Set g_oFSO = Nothing
Set g_oShell = Nothing
Wscript.Quit(i)
'////////////////////////////////////////////////////////////////////////////
' Main
' Fonction Main appelée pour incorporer la logique du script principal
'
' Renvoie Code de sortie du script
'
Function Main
Trace 1, "+++Main"
Dim sDstPath, oDstStream, sSrcPath, oSrcStream, ix, sLine, sID
' DERNIER arg est le fichier de sortie .WS, les autres sont fichiers .VBS i/p
If Wscript.Arguments.Count < 2 Then
ShowHelpMessage
Wscript.Quit(1)
End If
sDstPath = Wscript.Arguments(Wscript.Arguments.Count - 1)
If sDstPath <> "-" Then
sDstPath = g_oFSO.GetAbsolutePathName(sDstPath)
Set oDstStream = g_oFSO.CreateTextFile(sDstPath, True)
Else
Set oDstStream = Wscript.StdOut
End If
' Emettre la séquence de début de bloc
oDstStream.WriteLine "" ' En-tête XML spécial
oDstStream.WriteLine ""
oDstStream.WriteLine
If Wscript.Arguments.Count > 2 Then ' Si plusieurs fichiers .VBS
oDstStream.WriteLine ""
oDstStream.WriteLine
End If
' Traite chaque fichier .VBS distinct
For ix = 0 To Wscript.Arguments.Count - 2
sSrcPath = g_oFSO.GetAbsolutePathName(Wscript.Arguments(ix))
sID = g_oFSO.GetBaseName(sSrcPath)
' Emettre la séquence de début de bloc du fichier
oDstStream.WriteLine ""
oDstStream.WriteLine ""
oDstStream.WriteLine ""
oDstStream.WriteLine ""
oDstStream.WriteLine
Next
' Emettre la séquence de fin de bloc et fermer le flux dst
If Wscript.Arguments.Count > 2 Then ' Si plusieurs fichiers .VBS
oDstStream.WriteLine ""
End If
oDstStream.Close
Set oDstStream = Nothing
' Valeur de retour passée à Wscript.Quit quand le script quitte le code
Main = 0
End Function
'////////////////////////////////////////////////////////////////////////////
' MakeXML and MakeQXML
' Rendre chaîne valide pour utilisation XML (convertit en entités cars réservés)
'
' sString Chaîne à convertir
'
Function MakeXML(sString)
' Remplacer caractères réservés par entités
MakeXML = sString ' Obtenir chaîne de remplacement
MakeXML = Replace(MakeXML, "&", "&") ' DOIT VENIR D'ABORD !!
MakeXML = Replace(MakeXML, "<", "<") ' Inférieur à
MakeXML = Replace(MakeXML, ">", ">") ' Supérieur à
MakeXML = Replace(MakeXML, "'", "'") ' Apostrophe
MakeXML = Replace(MakeXML, Chr(34), """) ' Doubles guillemets
End Function
Function MakeQXML(sString)
MakeQXML = Chr(34) & MakeXML(sString) & Chr(34)
End Function
'////////////////////////////////////////////////////////////////////////////
' ShowHelpMessage
' Afficher message d'aide
'
Sub ShowHelpMessage
Trace 1, "+++ShowHelpMessage"
Wscript.Echo "usage: vbstows ... "
Wscript.Echo
Wscript.Echo "Convertit un ou plusieurs scripts .VBS de style WSH 1.0 en un"
Wscript.Echo "script.WS WSH 2.0 unique en ajoutant les éléments XML"
Wscript.Echo "nécessaires. Le dernier argument spécifie le à"
Wscript.Echo "utiliser pour la sortie. Chaque fichier .VBS est écrit dans le"
Wscript.Echo "fichier .WSH comme simple élément job. Si le "
Wscript.Echo "est ""-"", la sortie est écrite dans StdOut."
End Sub
'////////////////////////////////////////////////////////////////////////////
' Trace
' Débogue sortie de suivi contrôlée par g_nTraceLevel et var env WSHTRACE
'
' nLevel Niveau de suivi. Ne s'affiche que si >= var env WSHTRACE
' sText Texte à afficher
'
Sub Trace(nLevel, sText)
if g_nTraceLevel > nLevel Then Wscript.Echo sText
End Sub
'////////////////////////////////////////////////////////////////////////////
Listing 14.3 : Script FindMovedFiles.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: FindMovedFiles.vbs $ $Revision: 1 $ $Date: 7/18/99 10:42p $
' $Archive: /Scripts/FindMovedFiles.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Trouver tous les fichiers déplacés dans une arborescence
' Déclaration de variables explicites et globales standards
Option Explicit
Dim g_sScriptPath, g_sScriptName, g_sScriptFolder, g_sVersion
Dim g_nTraceLevel
Dim g_oShell, g_oFSO
Dim s, ix, i
' Définir globales standards et créer objets globaux
g_sVersion = "1.0"
g_sScriptPath = Wscript.ScriptFullName
g_sScriptName = Wscript.ScriptName
g_sScriptFolder = Left(g_sScriptPath, Len(g_sScriptPath) - Len(g_sScriptName))
Set g_oShell = CreateObject("Wscript.Shell")
Set g_oFSO = CreateObject("Scripting.FileSystemObject")
' Définir contrôle de suivi depuis la variable d'environnement WSHTRACE
i = g_oShell.Environment("Process").Item("WSHTRACE")
If IsNumeric(i) Then g_nTraceLevel = CInt(i) Else g_nTraceLevel = 0
' Rechercher les requêtes d'aide -help, -? etc sur la ligne de commande
If Wscript.Arguments.Count > 0 Then
s = LCase(Wscript.Arguments(0))
If (s = "-help") Or (s = "-?") Or (s = "/help") Or (s = "/?") Then
ShowHelpMessage
Wscript.Quit(1)
End If
End If
' Afficher bannière d'accueil, puis appeler fonction Main
ix = Instr(g_sScriptName, ".")
If ix <> 0 Then s = Left(g_sScriptName, ix - 1) Else s = g_sScriptName
Wscript.Echo s & " version " & g_sVersion & vbCRLF
i = Main
' Libérer objets globaux standards, puis quitter le script
Set g_oFSO = Nothing
Set g_oShell = Nothing
Wscript.Quit(i)
'////////////////////////////////////////////////////////////////////////////
' Main
' Fonction Main appelée pour incorporer la logique du script principal
'
' Renvoie Code de sortie du script
'
Function Main
Trace 1, "+++Main"
Dim sSrcPath, sDstPath, oSrcDict, oDstDict, oSrcRoot, oDstRoot, nCount
' Valider les args (doivent être au moins deux, et répertoires valides)
If Wscript.Arguments.Count < 2 Then ShowHelpMessage : Wscript.Quit(0)
sSrcPath = g_oFSO.BuildPath(Wscript.Arguments(0), ".")
If Not g_oFSO.FolderExists(sSrcPath) Then
Wscript.Echo Wscript.Arguments(0) & " n'existe pas"
Wscript.Quit(0)
End If
sDstPath = g_oFSO.BuildPath(Wscript.Arguments(1), ".")
If Not g_oFSO.FolderExists(sDstPath) Then
Wscript.Echo Wscript.Arguments(1) & " n'existe pas"
Wscript.Quit(0)
End If
sSrcPath = g_oFSO.GetAbsolutePathName(g_oFSO.GetParentFolderName(sSrcPath))
sDstPath = g_oFSO.GetAbsolutePathname(g_oFSO.GetParentFolderName(sDstPath))
' Elaborer les dictionnaires src et dst
Set oSrcDict = BuildDictionary(sSrcPath)
Set oDstDict = BuildDictionary(sDstPath)
' Trouver tous fichiers source orphelins et fichier déplacé dans destination
Set oSrcRoot = g_oFSO.GetFolder(sSrcPath)
Set oDstRoot = g_oFSO.GetFolder(sDstPath)
nCount = FindMovedFiles(oSrcRoot, oDstRoot, oSrcDict, oDstDict, oSrcRoot)
' Valeur de retour passée à Wscript.Quit en tant que code de sortie du script
Main = nCount
End Function
'////////////////////////////////////////////////////////////////////////////
' BuildDictionary
' Crée objet dictionnaire contenant signatures de tous fichiers de l'arborescence
'
' sPath Chemin du dossier à la racine de l'arborescence
' Renvoie Objet dictionnaire créé
'
Function BuildDictionary(sPath)
Trace 1, "+++BuildDictionary: " & sPath
Dim oDict, oFolder
Set oDict = CreateObject("Scripting.Dictionary")
oDict.CompareMode = vbTextCompare ' Ignorer la casse
Set oFolder = g_oFSO.GetFolder(sPath)
AddFiles oDict, oFolder ' Ajouter fichiers récursivement
Set BuildDictionary = oDict
End Function
Sub AddFiles(ByVal oDict, ByVal oFolder)
Trace 2, "+++AddFiles: " & oFolder.Path
Dim oFile, sSig, oSubFolder
' Ajouter chaque fichier dans ce dossier
For Each oFile In oFolder.Files ' Pour chaque fichier..
sSig = GetSignature(oFile) ' Obtenir signature
If oDict.Exists(sSig) Then ' S'il existe..
oDict.Item(sSig) = oDict.Item(sSig) & ";" & oFile.Path
Else
oDict.Add sSig, oFile.Path ' Ajouter nouvel élément
End If
Next
' Ajouter récursivement fichiers de sous-dossiers
For Each oSubFolder in oFolder.SubFolders ' Pour chaque sous-dossier..
AddFiles oDict, oSubFolder ' ..ajouter plus de fichiers
Next
End Sub
'////////////////////////////////////////////////////////////////////////////
' FindMovedFiles
' Trouve tous les fichiers déplacés en comparant src à dst
'
' oSrcRoot Dossier racine source
' oDstRoot Dossier racine de destination
' oSrcDict Dictionnaire des fichiers signature du fichier source
' oDstDict Dictionnaire des fichiers signature du fichier de destination
' oFolder Dossier actuel à parcourir (récursivement)
' Renvoie Décompte des fichiers déplacés trouvés
'
Function FindMovedFiles(oSrcRoot, oDstRoot, oSrcDict, oDstDict, oFolder)
Trace 2, "+++FindMovedFiles: " & oFolder.Path
Dim nCount, oFile, oSubFolder, sSig, sCmd, sCmd1, sCmd2
Dim sSrcPath, sDstPath, sSrcRelPath, sDstRelPath
nCount = 0
' Traiter chaque fichier dans ce dossier
For Each oFile In oFolder.Files
sSig = GetSignature(oFile) ' Obtenir signature fichier
' La signature doit exister dans les arborescences src et dst
If oSrcDict.Exists(sSig) And oDstDict.Exists(sSig) Then
' Il doit n'y avoir qu'un fichier src et dst
If Instr(oSrcDict.Item(sSig), ";") = 0 Then
If Instr(oDstDict.Item(sSig), ";") = 0 Then
' Les chemins relatifs Src/dst doivent être différents
sSrcPath = oSrcDict.Item(sSig)
sDstPath = oDstDict.Item(sSig)
sSrcRelPath = Mid(sSrcPath, Len(oSrcRoot.Path) + 1)
sDstRelPath = Mid(sDstPath, Len(oDstRoot.Path) + 1)
If StrComp(sSrcRelPath, sDstRelPath, vbTextCompare) <> 0 Then
sCmd1 = g_oFSO.BuildPath(oDstRoot.Path, sDstRelPath)
-sCmd2 = g_oFSO.GetParentFolderName(g_oFSO.BuildPath(oDstRoot.Path, sSrcRelPath))
sCmd = "MOVE " & sCmd1 & " " & sCmd2
Wscript.StdOut.WriteLine sCmd
' Traite ligne suivante pour effectuer opérations MOVE
'g_oFSO.MoveFile sCmd1, sCmd2
End If
End If
End If
End If
Next
' Traiter récursivement les sous-dossiers
For Each oSubFolder In oFolder.SubFolders
nCount = nCount + FindMovedFiles(oSrcRoot, oDstRoot, oSrcDict, oDstDict, oSubFolder)
Next
FindMovedFiles = nCount ' Renvoie décompte de déplacements
End Function
'////////////////////////////////////////////////////////////////////////////
' GetSignature
' Calcule signature pour un objet fichier
'
' oFile Objet fichier
' Renvoie Chaîne de signature pour fichier
'
Function GetSignature(oFile)
Trace 3, "+++GetSignature: " & oFile.Name
Dim nAttr
nAttr = oFile.Attributes And Not (32+64+2048)
GetSignature = oFile.Name & ";" & CStr(oFile.DateCreated)
GetSignature = GetSignature & ";" & CStr(oFile.DateLastModified)
GetSignature = GetSignature & ";" & CStr(oFile.Size) & ";" & CStr(nAttr)
End Function
'////////////////////////////////////////////////////////////////////////////
' ShowHelpMessage
' Afficher message d'aide
'
Sub ShowHelpMessage
Trace 1, "+++ShowHelpMessage"
Wscript.Echo "usage : findmovedfiles "
Wscript.Echo "Les arborescences trouvées en src-path et dst-path sont"
Wscript.Echo "comparées et les fichiers qui ont changé d'emplacement dans"
Wscript.Echo " dst-path (donc ont été déplacés) sont identifiés. La sortie"
Wscript.Echo "est une liste de ces fichiers exprimée en tant que série de"
Wscript.Echo "commandes MOVE, qui peuvent être capturées dans un fichier"
Wscript.Echo "et exécutées comme script batch."
End Sub
'////////////////////////////////////////////////////////////////////////////
' Trace
' Déboguer sortie de suivi contrôlée par var env g_nTraceLevel et WSHTRACE
'
' nLevel Niveau de suivi. Ne s'affiche que si >= var env WSHTRACE
' sText Texte à afficher
'
Sub Trace(nLevel, sText)
if g_nTraceLevel > nLevel Then Wscript.Echo sText
End Sub
'////////////////////////////////////////////////////////////////////////////
Listing 14.4 : Script Animal.vbs
'////////////////////////////////////////////////////////////////////////////
' $Workfile: Animal.vbs $ $Revision: 1 $ $Date: 7/18/99 10:42p $
' $Archive: /Scripts/Animal.vbs $
' Copyright (c) 1998 Tim Hill. All Rights Reserved.
'////////////////////////////////////////////////////////////////////////////
' Joue l'ancien jeu électronique Animal
Option Explicit
Dim oAnimals, sDatabase, n
' Former le nom de chemin du fichier de données
sDatabase = Wscript.ScriptFullName
sDatabase = Left(sDatabase, InStrRev(sDatabase, ".") - 1) & ".dat"
' Charger base de données et jouer, puis enregistrer si base de données incorrecte
Set oAnimals = New AnimalSet
oAnimals.Reset
oAnimals.Load sDatabase
If PlayGame(oAnimals) Then
oAnimals.Save sDatabase
End If
Set oAnimals = Nothing
Wscript.Quit(0)
'////////////////////////////////////////////////////////////////////////////
' PlayGame
' Joue au jeu Animals
'
' oAnimals Réf à objet AnimalSet prêt à jouer
' Renvoie True si le jeu a changé (nouveaux animaux)
'
Function PlayGame(ByRef oAnimals)
Dim sMsg, nComputer, nHuman
nComputer = 0 : nHuman = 0
sMsg = ""
PlayGame = False ' Pas encore incomplet
Dim oCursor, n, sAnimal, sQuestion, bYesForNew
Do While True
Set oCursor = oAnimals.GetCursor ' Obtenir curseur jeu
n = MsgBox(sMsg & "Computer: " & nComputer & vbCRLF & "Humain : " & nHuman & vbCRLF & "Penser à un animal, puis OK pour jouer ou Cancel pour quitter.", vbOKCancel, "Animal")
If n = vbCancel Then Exit Do
Do While oCursor.IsQuestion
n = MsgBox(oCursor.Text, vbYesNo, "Animal")
If n = vbYes Then
oCursor.FollowYes
Else
oCursor.FollowNo
End If
Loop
n = MsgBox("C'est un " & oCursor.Text & "?", vbYesNo, "Animal")
If n = vbYes Then
sMsg = "J'ai gagné !! On rejoue." & vbCRLF
nComputer = nComputer + 1
Else
sAnimal = InputBox("Gagné !! A quel animal pensez-vous ?", "Animal")
sAnimal = Trim(sAnimal)
If sAnimal = "" Then Wscript.Quit(1)
Do
sQuestion = InputBox("Saisir question oui/non pour distinguer un " & sAnimal & " d'un " & oCursor.Text & ".", "Animal")
sQuestion = Trim(sQuestion)
If Instr(sQuestion, "?") = 0 Then
n = MsgBox("Saisir question (avec un ""?"" en fin)!", vbOK, "Animal")
sQuestion = ""
End If
Loop While sQuestion = ""
n = MsgBox("La question est : """ & sQuestion & """" & vbCRLF & "For a " & sAnimal & " la réponse serait ?", vbYesNo, "Animal")
If n = vbYes Then
oCursor.AddNewAnimal sAnimal, sQuestion, True
Else
oCursor.AddNewAnimal sAnimal, sQuestion, False
End If
PlayGame = True
sMsg = "J'aurai ma revanche !" & vbCRLF
nHuman = nHuman + 1
End If
Set oCursor = Nothing ' Relâcher le curseur
Loop
End Function
'////////////////////////////////////////////////////////////////////////////
' IsValidObject
' Vérifie si une variable est un objet différent de rien
'
' oObj Référence d'objet à vérifier
' Renvoie Vrai si la variable contient un objet valide
'
Function IsValidObject(ByRef oObj)
IsValidObject = False
If IsObject(oObj) Then
If Not oObj Is Nothing Then
IsValidObject = True
End If
End If
End Function
'////////////////////////////////////////////////////////////////////////////
' AnimalCursor class
' Gère un jeu animal en parcourant l'arborescence des animaux
'
Class AnimalCursor
Private m_oTree ' Arborescence où nous sommes
Private m_oNode ' Nœud actuel dans arborescence
' Attacher/détacher à/d'une arborescence
Public Sub Attach(ByRef oTree, ByRef oNode) ' Attacher curseur à arborescence
Set m_oTree = oTree
Set m_oNode = oNode
End Sub
Public Sub Detach ' Détacher curseur d'arborescence
Set m_oTree = Nothing
Set m_oNode = Nothing
End Sub
' Tests IsAnimal et IsQuestion
Public Property Get IsAnimal
If IsValidObject(m_oNode) Then
If IsValidObject(m_oNode.Yes) Then
IsAnimal = False ' Animaux sont feuilles
Else
IsAnimal = True
End If
Else
IsAnimal = False
End If
End Property
Public Property Get IsQuestion
If IsValidObject(m_oNode) Then
IsQuestion = Not IsAnimal ' Questions sont nœuds internes
Else
IsQuestion = False
End If
End Property
' Parcourir vers le nœud suivant
Public Sub FollowYes
If IsValidObject(m_oNode.Yes) Then ' Seulement si valide
Set m_oNode = m_oNode.Yes
End If
End Sub
Public Sub FollowNo
If IsValidObject(m_oNode.No) Then ' Seulement si valide
Set m_oNode = m_oNode.No
End If
End Sub
Public Property Get Text
Text = m_oNode.Text ' Texte nœud actuel
End Property
' Ajouter nouvel animal à l'arborescence (en fin de jeu)
Public Sub AddNewAnimal(sAnimal, sQuestion, bYesForNew)
Dim oYesNode, oNoNode
If IsValidObject(m_oNode) Then ' Seulement si curseur valide
Set oYesNode = m_oTree.NewNode(sAnimal, Nothing, Nothing)
Set oNoNode = m_oTree.NewNode(m_oNode.Text, Nothing, Nothing)
m_oNode.Text = sQuestion ' Nouveau nœud intérieur
If bYesForNew Then ' Lien de manière correcte
Set m_oNode.Yes = oYesNode
Set m_oNode.No = oNoNode
Else
Set m_oNode.Yes = oNoNode
Set m_oNode.No = oYesNode
End If
End If
End Sub
End Class
'////////////////////////////////////////////////////////////////////////////
' Classe AnimalNode
' Stocke les données d'un nœud simple dans l'arborescence des animaux
'
Class AnimalNode
Public Text ' Texte nœud actuel
Public Yes ' Yes réponse réf nœud
Public No ' Non réponse réf nœud
Public Index ' Utilisé à l'enregistrement
End Class
'////////////////////////////////////////////////////////////////////////////
' AnimalSet class
' Stocke le jeu complet de nœuds animaux (feuilles sont animaux)
'
Class AnimalSet
Private m_oRoot ' Racine arborescence animaux
Private m_nIndex ' Utilisé pour numéroter nœuds
' Initialiser arborescence (supprimer tous nœuds)
Public Sub Reset
DeleteNode m_oRoot ' Supprimer arborescence entière
End Sub
Private Sub DeleteNode(ByRef oNode)
If IsValidObject(oNode) Then ' Si nœud valide..
DeleteNode oNode.Yes ' Supprimer sous-arborescence Yes
DeleteNode oNode.No ' Supprimer sous-arborescence Non
End If
Set oNode = Nothing ' Supprimer le nœud lui-même
End Sub
' Charger arborescence à partir d'un fichier
Public Sub Load(sFilename)
Dim oFSO, oFile, nLastNode, nNodeSize
Dim sLine, vData, oNode, ix, oNodes()
Reset
Set oFSO = CreateObject("Scripting.FileSystemObject")
If Not oFSO.FileExists(sFilename) Then
LoadBuiltin ' Charger BD intégrée
Set oFSO = Nothing
Exit Sub ' .. et terminé
End If
Set oFile = oFSO.OpenTextFile(sFilename, 1)
nLastNode = 0 : nNodeSize = 0
Do While Not oFile.AtEndOfStream
sLine = Trim(oFile.ReadLine)
If Len(sLine) > 0 And Left(sLine, 1) <> ";" Then
vData = Split(sLine, ",", 3)
Set oNode = NewNode(vData(2), vData(0), vData(1))
nLastNode = nLastNode + 1
If nLastNode > nNodeSize Then
nNodeSize = nLastNode + 100
ReDim Preserve oNodes(nNodeSize)
End If
Set oNodes(nLastNode) = oNode
Set oNode = Nothing
End If
Loop
Set oFile = Nothing
For ix = 1 To nLastNode
n = oNodes(ix).Yes
If n <> 0 Then
Set oNodes(ix).Yes = oNodes(n)
Else
Set oNodes(ix).Yes = Nothing
End If
n = oNodes(ix).No
If n <> 0 Then
Set oNodes(ix).No = oNodes(n)
Else
Set oNodes(ix).No = Nothing
End If
Next
Set m_oRoot = oNodes(1) ' Définir nœud racine
Erase oNodes
End Sub
' Charger base de données intégrée
Public Sub LoadBuiltin
Reset
Set m_oRoot = NewNode("Vit dans la mer ?", Nothing, Nothing)
Set m_oRoot.No = NewNode("chien", Nothing, Nothing)
Set m_oRoot.Yes = NewNode("poisson", Nothing, Nothing)
End Sub
' Enregistrer arborescence vers un fichier
Public Sub Save(sFilename)
Dim oFSO, oFile
m_nIndex = 1 ' Indice de départ
NumberNodes m_oRoot ' Numéroter tous nœuds
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFile = oFSO.CreateTextFile(sFilename, True)
oFile.WriteLine ";ANIMAL data (" & m_nIndex - 1 & ")"
SaveTree oFile, m_oRoot
oFile.Close
Set oFile = Nothing
Set oFSO = Nothing
End Sub
Private Sub SaveTree(ByRef oFile, ByRef oNode)
Dim nYes, nNo
If IsValidObject(oNode) Then
If IsValidObject(oNode.Yes) Then
nYes = oNode.Yes.Index
Else
nYes = 0
End If
If IsValidObject(oNode.No) Then
nNo = oNode.No.Index
Else
nNo = 0
End If
oFile.WriteLine nYes & "," & nNo & "," & oNode.Text
SaveTree oFile, oNode.Yes
SaveTree oFile, oNode.No
End If
End Sub
Private Sub NumberNodes(ByRef oNode)
If IsValidObject(oNode) Then
oNode.Index = m_nIndex ' Numéroter ce nœud
m_nIndex = m_nIndex + 1 ' Indice complémentaire
NumberNodes oNode.Yes ' Numéro arborescence Yes
NumberNodes oNode.No ' .. et pas d'arborescence
End If
End Sub
' Obtenir arborescence
Public Function GetCursor
Set GetCursor = New AnimalCursor ' Créer nouveau curseur
GetCursor.Attach Me, m_oRoot ' Attacher à cette arborescence
End Function
' Créer un nouveau nœud
Public Function NewNode(sText, ByRef oYes, ByRef oNo)
Set NewNode = New AnimalNode ' Créer nouveau nœud
NewNode.Text = sText
If IsObject(oYes) Then
Set NewNode.Yes = oYes
Set NewNode.No = oNo
Else
NewNode.Yes = oYes
NewNode.No = oNo
End If
End Function
End Class
'////////////////////////////////////////////////////////////////////////////