Bonjour,

Pourriez vous m'aider, j'ai fais un script en VBS, qui me permettrait de récuperer les infos 'un filesystem, script que je souhaite exécuter sur un server windows 2000. Mais cela ne marche pas. J'ai besoin de votre aide. ci-joint, le script en entier :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
-----------------------------------------------------
 
'Script qui récupère des informations sur le FS
 
'Constante de script
Const SFSO = "Scripting.FileSystemObject", WSS = "Wscript.Shell", MSWS = "mswinsock.winsock"
 
'Constante pour l'ouverture des fichiers
Const ForReading = 1, ForWriting = 2, ForAppending = 8
 
'Répertoire qui contient les FS
Const S_FS_DIRECTORY = "C:\testFS\"
'Const S_FS_DIRECTORY = "I:\_DataApplications\rcfrance\rcsiebel\"
 
'Paramètres d'envoi de mail
Const S_REMOTE_HOST = "wsmtp.toto.fr"
Const S_REMOTE_PORT = "25"
S_MAIL_RCPT =	"rcpt to:test@toto.com"
'Pour pouvoir mettre plusieurs destinataire au mail, il faut les séparer par des virgules comme
'dans l'exemple ci-dessous :
'S_MAIL_RCPT =	"rcpt to:guy.agbre-renexter@renault.com,olivier.guennec-renexter@renault.com"
 
'Fichier de données des différents FS
Const S_FILE_SYNCHRO = "c:\temp\synchro.dat"
Const S_FILE_RECENT = "c:\temp\recent.dat"
Const S_FILE_SIEBELFS = "c:\temp\siebelfs.dat"
 
'Contenu du mail
Dim sMailData
 
'Création de l'en-tête du mail
sMailData = "<!doctype html public ""-//w3c//dtd html 4.0 transitional//en"">" & vbcrlf & _
			"<html>" & vbcrlf & _
			"<b><i><u>Synthèse du file system du " & Now & "</u></i></b>" & vbcrlf & _
			"<p>" & vbcrlf & _
			"<hr WIDTH=""100%"">" & vbcrlf & _
			"<br>&nbsp;" & vbcrlf
 
'On récupère les informations sur le FS et on les met dans les fichiers de données
'get_fs_info
 
'On analyse le fichier de données du répertoire Synchro
sMailData = sMailData & "<b>Analyse du répertoire Synchro</b>" & vbcrlf
analyse_data S_FILE_SYNCHRO
 
'On analyse le fichier de données du répertoire Recent
sMailData = sMailData & "<b>Analyse du répertoire Recent</b>" & vbcrlf
analyse_data S_FILE_RECENT
 
'On analyse le fichier de données du répertoire SiebelFS
sMailData = sMailData & "<b>Analyse du répertoire SiebelFS</b>" & vbcrlf
analyse_data S_FILE_SIEBELFS
 
'Création de la fin du mail
sMailData = sMailData & "</html>" & vbcrlf
 
'Envoi d'un mail de synthèse
envoi_mail
 
'-----------------------------------------------------------------------------------------------------
'---------------------------- Code des fonctions et procédures utilisées -----------------------------
'-----------------------------------------------------------------------------------------------------
 
'Procédure qui lance une commande DOS et attend qu'elle se termine
Sub lance_dos(vsCommande)
	'Objet shell
	Dim oShell
 
	'Création de l'objet shell
	Set oShell = WScript.CreateObject(WSS)
 
	'Lancement de la commande passée en paramètre.
	'On attend que la commande soit terminée pour passer à la suite du code
	'La commande est lancée en arrière-plan
	oShell.Run "command /c " & vsCommande, 0, True
 
	'Libération de la mémoire
	Set oShell = Nothing
End Sub
 
'Procédure qui récupère des informations sur le FS.
'Cette fonction effectue un dir sur l'ensemble des répertoires du FS.
'Elle ramène les noms de fichier (8.3 et complet), les tailles, les
'dates de modification et d'accès de tous les fichiers du FS
Sub get_fs_info
	'Objet fichier, répertoire
	Dim oFSO, oSiebelFSFolder, oSiebelFSFolderList, oSiebelFSCurrentFolder
 
	'Création de l'objet FileSystem
	Set oFSO = Wscript.CreateObject(SFSO)
 
	'Lancement de la recherche sur le répertoire synchro
	lance_dos "dir /v " & S_FS_DIRECTORY & "Synchro\*.SAF > " & S_FILE_SYNCHRO
 
	'Lancement de la recherche sur le réperoire Recent
	lance_dos "dir /v " & S_FS_DIRECTORY & "Recent\*.SAF > " & S_FILE_RECENT
 
	'Lancement de la recherche sur le réperoire Siebelfs
	'On récupère les sous-répertoires du répertoire siebelfs
	Set oSiebelFSFolder = oFSO.GetFolder(S_FS_DIRECTORY & "Siebelfs")
	Set oSiebelFSFolderList = oSiebelFSFolder.SubFolders
 
	'On vide le fichier de données siebelfs.dat
	lance_dos "echo. > " & S_FILE_SIEBELFS
 
	'Pour chaque sous-répertoire
	For Each oSiebelFSCurrentFolder in oSiebelFSFolderList
		'On affiche le contenu dans le fichier de données
		lance_dos "dir /s /v " & S_FS_DIRECTORY & "Siebelfs\" & oSiebelFSCurrentFolder.name & _
		"\*.SAF >> " & S_FILE_SIEBELFS
	Next
 
	'Libération de la mémoire
	Set oSiebelFSFolder = Nothing
	Set oSiebelFSFolderList = Nothing
	Set oSiebelFSCurrentFolder = Nothing
	Set oFSO = Nothing
End Sub
 
 
'Procédure qui va traiter le fichier passé en paramètre et en tirer des données intéressantes.
'	- le nombre de fichiers
'	- le fichier le plus récent
'	- le fichier le plus ancien
'	- la taille du répertoire
Sub analyse_data(vsFile)
	'Constante de position et de longueur des données dans le fichier de données.
	Const I_POS_SIZE = 14
	Const I_LEN_SIZE = 13
	Const I_POS_YEAR = 49
	Const I_POS_MONTH = 46
	Const I_POS_DAY = 43
 
	'Objets fichier
	Dim oFSO, oFile
 
	'date max, date min, nombre de fichiers, taille de l'ensemble des fichiers
	Dim iDateMax, iDateMin, iNbFiles, iFileSize
 
	'Ligne en cours, Date en cours
	Dim sCurrentLine, iCurrentDate
 
	'Date min ou max au format string
	Dim sDate
 
	'Création de l'objet FileSystem
	Set oFSO = Wscript.CreateObject(SFSO)
 
	'Ouverture du fichier de données passé en paramètre
	Set oFile = oFSO.OpenTextFile(vsFile, ForReading, True)
 
	'Initialisation des variables
	iNbFiles = 0
 
	'Tant qu'on n'arrive pas à la fin du fichier de données
	Do While Not oFile.AtEndOfStream
		'On lit la ligne courante
		sCurrentLine = oFile.ReadLine
 
		'On vérifie qu'il s'agit d'un fichier SAF
		If UCase(Right(sCurrentLine,4)) = ".SAF" Then
 
			'Si c'est le premier passage
			If iNbFiles = 0 Then
				'On initialise la date max
				iDateMax = CLng(Mid(sCurrentLine, I_POS_YEAR, 2) & _
								Mid(sCurrentLine, I_POS_MONTH, 2) & _
								Mid(sCurrentLine, I_POS_DAY, 2))
				'On initialise la date min
				iDateMin = iDateMax
				'On initialise le nombre de fichiers
				iNbFiles = 1
				'On initialise la taille de l'ensemble des fichiers
				iFileSize = CLng(Mid(sCurrentLine, I_POS_SIZE, I_LEN_SIZE))
			'Si ce n'est pas le permier passage
			Else
				'On récupère la date de la ligne en cours
				iCurrentDate = CLng(Mid(sCurrentLine, I_POS_YEAR, 2) & _
									Mid(sCurrentLine, I_POS_MONTH, 2) & _
									Mid(sCurrentLine, I_POS_DAY, 2))
				'On vérifie si c'est la date max ou la date min
				If iCurrentDate > iDateMax Then
					iDateMax = iCurrentDate
				ElseIf iCurrentDate < iDateMin Then
					iDateMin = iCurrentDate
				End If
				'On incrémente le nombre de fichier
				iNbFiles = iNbFiles + 1
				'On calcule la taille de l'ensemble des fichiers
				iFileSize = iFileSize + CLng(Mid(sCurrentLine, I_POS_SIZE, I_LEN_SIZE))
			End If
		End If
	'On passe à la ligne suivante
	Loop
 
	'Fermeture du fichier de log
	oFile.Close
 
	'Libération de la mémoire
	Set oFile = Nothing
	Set oFSO = Nothing
 
	'Affichage du résultat dans le mail sous forme d'un tableau
	sMailData = sMailData & "<table BORDER BGCOLOR=""#CCCCCC"" >" & vbcrlf
	sDate = Right("0" & iDateMax,6)
	sMailData = sMailData & "<tr><td>Date de modification la plus récente</td><td>" & Mid(sDate, 5, 2) & "/" & Mid(sDate, 3, 2) & "/" & Mid(sDate, 1, 2) & "</td></tr>" & vbcrlf
	sDate = Right("0" & iDateMin,6)
	sMailData = sMailData & "<tr><td>Date de modification la plus ancienne</td><td>" & Mid(sDate, 5, 2) & "/" & Mid(sDate, 3, 2) & "/" & Mid(sDate, 1, 2) & "</td></tr>" & vbcrlf
	sMailData = sMailData & "<tr><td>Nombre de fichiers du répertoire</td><td>" & iNbFiles & "</td></tr>" & vbcrlf
	sMailData = sMailData & "<tr><td>Taille du répertoire</td><td>" & iFileSize & "</td></tr>" & vbcrlf
	sMailData = sMailData & "</table>" & vbcrlf
	sMailData = sMailData & "<br>&nbsp;" & vbcrlf
End Sub
 
'Procédure qui envoie un mail de synthèse sur le FS
Sub envoi_mail
	'Objets socket
	Dim oSck
 
	'Compteur
	Dim i
 
	'Création de l'objet socket
	Set oSck = CreateObject(MSWS)
 
	'Initialisation des paramètres de connexion
	oSck.RemoteHost = S_REMOTE_HOST
	oSck.RemotePort = S_REMOTE_PORT
 
	'Connexion au serveur de mail
	oSck.Connect
 
	'Attente de réponse du serveur de mail
	VAR_1 = oSck.State
	While(oSck.State <> 7 And i < 1000)
		WScript.Sleep 10
		i=i+1
	Wend
 
	'Si la connexion est KO
	If i >= 1000 Then
		'Affichage d'un message d'erreur dans le fichier de logs
		write_log "Connection time out (State = " & oSck.State & "/" & VAR_1 & ")."
	'Sinon
	Else
		'Envoi du mail
		oSck.SendData(	"helo renault.fr" & vbcrlf & _
						"mail from:synthese.filesystem@renault.fr" & vbcrlf & _
						S_MAIL_RCPT & vbcrlf & _
						"data" & vbcrlf & _
						"Subject:Synthèse FileSystem" & vbcrlf & _
						"Content-type: text/html; charset=""iso-8859-15""" & vbcrlf & _
						sMailData & _
						"." & vbcrlf & _
						"quit")
						VAR_2 = oSck.State
 
		'Attente de réponse du serveur de mail
		While(oSck.State <> 7 And i < 1000)
			WScript.Sleep 10
			i=i+1
		Wend
 
		'Si l'envoi de mail est OK
		If i < 1000 Then
			'Affichage d'un message d'information dans le fichier de logs
			write_log "Message envoyé (State = " & oSck.State & "/" & VAR_1 & "/" & VAR_2 & ")."
		'Sinon
		Else
			'Affichage d'un message d'erreur dans le fichier de logs
			write_log "Erreur lors de l'envoi du message. (State = " & oSck.State & "/" & VAR_1 & "/" & VAR_2 & ")."
		End If
 
		'pause de 5 secondes pour que le message est le temps d'être envoyé avant la fermeture de la socket.
		WScript.Sleep 5000
 
	End If
 
	'Fermeture de la socket
	oSck.Close
 
	'Libération de la mémoire
	Set oSck = Nothing
End Sub
 
 
'Procédure qui affiche une ligne dans le fichier de log.
'Cette ligne est précédée de la date et de l'heure de l'ajout de la ligne.
Sub write_log(vsLine)
	'Nom du fichier de log
	Dim oFSO, oFileLog
 
	'Création de l'objet FileSystem
	Set oFSO = Wscript.CreateObject(SFSO)
 
	'Ouverture du fichier de log
	Set oFileLog = oFSO.OpenTextFile(oFSO.GetParentFolderName(Wscript.ScriptFullName) & "\" & oFSO.GetBaseName(Wscript.ScriptFullName) & ".log", ForAppending, True)
 
	'Insertion de la ligne dans le fichier de log
	oFileLog.WriteLine Now & vbTab & vsLine
 
	'Fermeture du fichier de log
	oFileLog.Close
 
	'Libération de la mémoire
	Set oFileLog = Nothing
	Set oFSO = Nothing
End Sub