Recherche de fichier sur disque dur. [VBS]

Résolu
mat76 Messages postés 9 Date d'inscription mardi 22 mai 2007 Statut Membre Dernière intervention 13 octobre 2014 - 26 mars 2008 à 10:37
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 8 avril 2008 à 13:12
Bonjour,

Tout d'abord je suis désolé , la question a du déjà être posé 1000 fois mais je ne trouve pas vraiment de réponse approprié à ce que je cherche.

Je suis sur que c'est tout simple mais je ne m'y connais franchement pas en VB.

Y a t'il une âme charitable pour m'aider?

J'aimerai un petit script qui au démarrage scan le disque dur afin de trouver une extansion de fichier , dans mon cas *.nsf (fichier Lotus Notes) et une fois trouver qu'il incrémente un fichier rapport se trouvant sur un chemin réseau ex: \\nomdemonserveur\dossier\rapport.txt.
Dans ce fichier rapport devra se trouver "nom de l'ordinateur" et les fichiers .nsf trouvés sur son disque dur.

D'avance merci

<!-- / message -->

9 réponses

cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
26 mars 2008 à 14:07
 Bonjour à tous,

L'exemple ci-dessous, avec utilisation de WMI et de l'objet Dictionary, affiche tous les fichiers *.nsf

Option Explicit
MsgBox ShowFilesLotus,,"Result"

Private Function ShowFilesLotus()
Const HARD_DISK = 3
Dim objWMIService, colDisks, colFiles
Dim objDico, objTabExt, objDisk, objFile
Dim strComputer, i
Dim cles, strList

strComputer = "."

objTabExt = "nsf"

Set objDico = CreateObject("Scripting.Dictionary")
objDico.CompareMode = VBBinaryCompare

Set objWMIService = GetObject("winmgmts:" _
                    & "{impersonationLevel=impersonate}!\" _
                    & strComputer & "\root\cimv2")

Set colDisks = objWMIService.ExecQuery _
           ("Select * from Win32_LogicalDisk Where DriveType = " & HARD_DISK & "")
       
For Each objDisk in colDisks
    Set colFiles = objWMIService.ExecQuery _
                   ("Select * from CIM_DataFile where Drive = '" &_
                     objDisk.Name & "' And Extension = '" & objTabExt &"'")
    For Each objFile in colFiles
        objDico.Add objFile.Name,""
    Next
Next
Set colFiles =  Nothing
Set colDisks =  Nothing
Set objWMIService = Nothing

cles = objDico.Keys
For i = 0 To objDico.Count-1
    strList = strList &vbCr& cles(i)
Next
Set objDico = Nothing
ShowFilesLotus = strList
End Function

jean-marc
3
mat76 Messages postés 9 Date d'inscription mardi 22 mai 2007 Statut Membre Dernière intervention 13 octobre 2014
31 mars 2008 à 10:49
Bonjour,


J'ai repris votre script qui correspond à ce que je veux faire.
Mais il y a une subtilité que je désire et n'arrive pas à faire :( on est développeur ou on ne l'est pas...) Je voudrais que le contenu de la recherche qui s'affiche dans la texte box, s'inscrive egalement dans le fichier Lotus.txt mais sans succès.

Et le comble du bonheur pour moi serait que ces informations (dans le fichier texte) soit précédé de l'identifiant de l'ordinateur ( %computername% fichier.nsf )

     

                              Option Explicit
MsgBox ShowFilesLotus,,"Result"




Private Function ShowFilesLotus()
Const HARD_DISK = 3
Dim objWMIService, colDisks, colFiles
Dim objDico, objTabExt, objDisk, objFile
Dim strComputer, i
Dim cles, strList
Dim ObjRapport, ObjFilerapport
Const ForWriting = 2




strComputer = "."




objTabExt = "nsf"


Set ObjRapport = CreateObject("Scripting.FileSystemObject" )
Set ObjFileRapport = ObjRapport.OpenTextFile("g:\migration\Lotus\Lotus.txt",ForWriting)
ObjFileRapport.Writeline (ShowFilesLotus)
ObjFileRapport.WriteBlankLines(2)
ObjFileRapport.close




Set objDico = CreateObject("Scripting.Dictionary")
objDico.CompareMode = VBBinaryCompare


Set objWMIService = GetObject("winmgmts:" _
                    & "{impersonationLevel=impersonate}!\" _
                    & strComputer & "\root\cimv2")


Set colDisks = objWMIService.ExecQuery _
           ("Select * from Win32_LogicalDisk Where DriveType = " & HARD_DISK & "")


For Each objDisk in colDisks
    Set colFiles = objWMIService.ExecQuery _
                   ("Select * from CIM_DataFile where Drive = '" &_
                     objDisk.Name & "' And Extension = '" & objTabExt &"'")
    For Each objFile in colFiles
        objDico.Add objFile.Name,""
    Next
Next
Set colFiles =  Nothing
Set colDisks =  Nothing
Set objWMIService = Nothing


cles = objDico.Keys
For i = 0 To objDico.Count-1
    strList = strList &vbCr& cles(i)
Next
Set objDico = Nothing
ShowFilesLotus = strList
End Function


0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
31 mars 2008 à 12:42
 Bonjour,

ObjRapport.OpenTextFile("c:\Lotus.txt", ForAppending, True) permet d'écrire en append dans le fichier. L'option True autorise la création du fichier si celui-ci n'existe pas.

Option Explicit
Call ShowFilesLotus

Private Sub ShowFilesLotus()
Const HARD_DISK = 3
Dim objWMIService, colDisks, colFiles
Dim objDico, objTabExt, objDisk, objFile
Dim wshShell
Dim strComputer, i
Dim cles, strList
Dim ObjRapport, ObjFilerapportConst ForWriting 2, ForAppending 8

strComputer = "."

objTabExt = "nsf"

Set wshShell = Wscript.CreateObject ("Wscript.Shell")

Set ObjRapport = CreateObject("Scripting.FileSystemObject" )
Set ObjFileRapport = ObjRapport.OpenTextFile("c:\Lotus.txt", ForAppending, True)

Set objDico = CreateObject("Scripting.Dictionary")
objDico.CompareMode = VBBinaryCompare

Set objWMIService = GetObject("winmgmts:" _
                    & "{impersonationLevel=impersonate}!\" _
                    & strComputer & "\root\cimv2")

Set colDisks = objWMIService.ExecQuery _
           ("Select * from Win32_LogicalDisk Where DriveType = " & HARD_DISK & "")

For Each objDisk in colDisks
    Set colFiles = objWMIService.ExecQuery _
                   ("Select * from CIM_DataFile where Drive = '" &_
                     objDisk.Name & "' And Extension = '" & objTabExt &"'")
    For Each objFile in colFiles
        objDico.Add objFile.Name,""
    Next
Next
Set colFiles =  Nothing
Set colDisks =  Nothing
Set objWMIService = Nothing

cles = objDico.Keys
For i = 0 To objDico.Count-1
    ObjFileRapport.Writeline wshShell.ExpandEnvironmentStrings ("%COMPUTERNAME%") _
                             &vbTab& cles(i) &vbCr
Next
ObjFileRapport.WriteBlankLines(2)
ObjFileRapport.close
Set objDico = Nothing
Set wshShell = Nothing
End Sub

jean-marc
0
mat76 Messages postés 9 Date d'inscription mardi 22 mai 2007 Statut Membre Dernière intervention 13 octobre 2014
31 mars 2008 à 13:20
C'est exactement ce qu'il me fallait. Un grand merci pour votre aide.

Mathieu
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mat76 Messages postés 9 Date d'inscription mardi 22 mai 2007 Statut Membre Dernière intervention 13 octobre 2014
7 avril 2008 à 16:22
Bonjour,

Toujours par rapport à ce script, y a t'il un moyen d'exclure le répertoire Documents and Settings que la recherche?

Merci
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
7 avril 2008 à 18:51
Bonsoir,

La facilité serait

For Each objDisk in colDisks
    Set colFiles = objWMIService.ExecQuery _
                   ("Select * from CIM_DataFile where Drive = '" &_
                     objDisk.Name & "' And Extension = '" & objTabExt &"'")
    For Each objFile in colFiles
        If Mid(LCase(objFile.Path),2, 22) <> "documents and settings" Then
           objDico.Add objFile.Name,""
        End if
    Next
Next

Voir éventuellement la méthode ExpandEnvironmentStrings de l'objet WshShell.
De même, on pourrait gérer les exceptions du folder dans la query en ajoutant Path <> exclusion.

jean-marc
0
mat76 Messages postés 9 Date d'inscription mardi 22 mai 2007 Statut Membre Dernière intervention 13 octobre 2014
8 avril 2008 à 08:50
Bonjour,

Une nouvelle fois merci.

Il est vrai que vous m'avez maché le travail mais en ayant un code qui marche j'ai pu comprendre le fonctionnement et même appliquer certaines fonctions (ajout de la date..) , bon je l'accorde des fonctions à ma mesure.

Encore une question, connaissez vous un bon tutoriel sur le vbs reprenant les fonctions de base etc... ( c'est pas le tout de demander de l'aide , le mieux est de comprendre ;) ).


 


Slts


Mathieu
0
mat76 Messages postés 9 Date d'inscription mardi 22 mai 2007 Statut Membre Dernière intervention 13 octobre 2014
8 avril 2008 à 11:56
Finalement, j'ai encore une petite question.

Pour l'exclusion de Documents and Settings cela marche.
J'ai essayer de rajouter Program Files aussi mais sans résultat probant puisque lorsque que j'essai de rajouter Porgram Files à votre code, l'exclusion ne fonctionne plus..

J'ai essayer comme ca mais j'ai pas du avoir un bon feeling

For Each objDisk in colDisks
    Set colFiles = objWMIService.ExecQuery _
                   ("Select * from CIM_DataFile where Drive = '" &_
                     objDisk.Name & "' And Extension = '" & objTabExt &"'")
    For Each objFile in colFiles
        If Mid(LCase(objFile.Path),2, 22) <> "documents and settings" or Mid(LCase(objFile.Path),2, 13) <> "program files" Then
           objDico.Add objFile.Name,""
        End if
    Next
Next

Et ce n' est pas le premier essai de modification que j'ai fait...
Comment puis je retirer de la recherche ces deux dossiers.

Merci

Slts
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
8 avril 2008 à 13:12
 Bonjour mat76,

Pour exclure les 2 dossiers:

        If Mid(LCase(objFile.Path),2, 22) <> "documents and settings" And _
           Mid(LCase(objFile.Path),2, 13) <> "program files" Then

jean-marc
0
Rejoignez-nous