[VBS] Probleme utilisation Type

Probleme utilisation Type [VBS] - VB/VBA/VBS - Programmation

Marsh Posté le 14-12-2010 à 22:02:15    

Bonjour je voudrais créer en VBScript une Structure comme en VB,je crois,d'après ce que j'ai vu qu'il fallait utiliser TYPE donc c'est se que je fais mais sa ne marche pas .J'aurais donc besoin d'aide pour comprendre mes erreurs :) merci d'avance.
 
Le code

Spoiler :

Option Explicit
Dim oFSO,objShell
Set oFSO = CreateObject("Scripting.FileSystemObject" )
Set objShell = WScript.CreateObject("WScript.Shell" )
''---Function arborescence
''-----Renvoi un tableau contenant l'arborescence du chemin 'chemin'  
 
Private  Type propriete
 Dim nom As string
 Dim chemin As String
End Type
 
Function arborescence(chemin)
 Dim i,x
 Dim oFl,oFld
 ReDim tabs(0)
  Set tabs(0) = New propriete
 
  For each oFl in oFSO.GetFolder(chemin).Files
   tabs.nom(Ubound(tabs)) = oFl.Name
   tabs.chemin(ubounds(tabs)) = oFls.Path
   Redim Preserve tabs(Ubound(tabs) + 1)  '--Augmente la taille du tableau
  Next
 
 arborescence = tabs
 
End Function
 
Dim chemin
chemin = "D:\IUT\ASR3\Cédric"
 
Dim arbo
arbo = arborescence(chemin)
 
Dim i
 
For i = 0 To Ubound(arbo)
 wscript.echo arbo.nom(i).nom
Next

Reply

Marsh Posté le 14-12-2010 à 22:02:15   

Reply

Marsh Posté le 15-12-2010 à 10:32:01    

Citation :

sa ne marche pas

Il ne faut jamais écrire sa ! Pourriez-vous, s'il vous plait, nous donner plus d'informations sur le problème ?
 
Votre projet est très ambitieux, car il s'attaque à cinq sujets qui ne sont pas faciles : la programmation, les tableaux, les objets, les scopes des variables, et la récursivité.
Je crains que le problème viennent de plusieurs de ces sujets à la fois.  
 
1. La programmation
Sa se voit que vous débuter parce que vos noms de variables sont mal choisis. Ils sont trop vagues, et trop proches de mots clés avec lesquels il pourrait y avoir une confusion. Vous cherchez une solution compliquée alors que l'on peut obtenir le résultat plus simplement. Vous faîtes un Dim i,x et vous n'utilisez ni i ni x !
 
2. Les tableaux
Vous faîtes un ReDim tabs(0) sans avoir fait Dim tabs() auparavant !
Vous utilisez ReDim pour avoir un tableau ayant un nombre d'éléments qui n'est pas déterminé à l'avance, mais vous pourriez utilisez simplement Dim sans donner de dimension, pour avoir le même résultat. C'était il y a 20 ans que l'on avait besoin de ReDim car à l'époque Dim demandait que l'on indique à l'avance le nombre d'élément. Maintenant, il existe les tableaux dynamiques sans avoir besoin de gérer soi même la partie dynamique. Il est dommage de ne pas utiliser les tableaux dynamiques existants, et de réinventer la roue.
Parfois, vous utiliser Dim sans préciser As ... C'est une démarche incohérente. La principale utilité de Dim est de donner un type à une variable. Si on ne le fait pas, alors votre variable est du type Variant, et c'est contradictoire avec votre volonté de cadrer les choses avec de la programmation objet.
Vous utiliser Ubounds(tabs) alors que vous connaissez déjà la taille de votre tableau. Il faut utiliser Ubounds avec parcimonie, sinon sa montre que vous ne maitrisez pas les données que vous manipulez.
 
3. Les scopes des variables
Vous avez des variables globales et des variables locales, mais vous ne semblez pas avoir réfléchit au pourquoi de vos choix.
 
4. La récursivité
Il faut utiliser la récursivité, et vous ne l'utilisez pas.

Reply

Marsh Posté le 15-12-2010 à 17:11:54    

Désolé de répondre maintenant ne trouvant pas de réponse j'ai décidé de créer une matrice de 3 lignes contenant un chemin,le nom du dossier et son nom modifié (car mon programme permet de crypté,enlever les accents et décrypté une arborescence)
 
Au niveau de la récursivité je sais qu'il faut l'utilisé je l'utilise d'ailleur mais je ne voulais pas montrez quelque chose d'inutile car le problème était au niveau de l'utilisation des Type. Par contre pour le tableau,faire un Dim tabs() puis un ReDim tabs(2) ne marchez pas c'est donc pourquoi j'ai utiliser uniquement le ReDim tabs(2) puis des ReDim Preserve
 
Merci comme même et je vous poste aussi (comme même)le code :)

Spoiler :


Option Explicit
Dim oFSO,objShell
Set oFSO = CreateObject("Scripting.FileSystemObject" )
Set objShell = WScript.CreateObject("WScript.Shell" )
''---Function arborescence
''-----Renvoi un tableau contenant l'arborescence du chemin 'chemin'  
 
Function arborescence(chemin)
 Dim i
 Dim oFl,oFld
 
 ReDim tabs(2,0) '--Tableau principaux
 Dim soustabs '--Sous tableau contenant les sous-dossiers
 
  For each oFl in oFSO.GetFolder(chemin).Files
   tabs(0,Ubound(tabs,2)) = oFl.Name
   tabs(1,Ubound(tabs,2)) = Mid(oFl.Path,1,len(oFl.Path) - len(oFl.Name))
   tabs(2,Ubound(tabs,2)) = oFl.Name
   Redim Preserve tabs(2,Ubound(tabs,2) + 1)  '--Augmente la taille du tableau
  Next
 
  For each oFld in oFSO.GetFolder(chemin).SubFolders
   tabs(0,Ubound(tabs,2)) = "[" & oFld.Name & "]"
   tabs(1,Ubound(tabs,2)) = Mid(oFld.Path,1,len(oFld.Path) - len(oFld.Name) )  
   tabs(2,Ubound(tabs,2)) = oFld.Name
   Redim Preserve tabs(2,Ubound(tabs,2) + 1) '--Augmente la taille du tableau
   soustabs = arborescence(chemin & "\" & oFld.name)
   wscript.echo tabs(1,Ubound(tabs,2))  & " et " &  oFld.Path & " et " & oFld.Name
   For i=0 To Ubound(soustabs,2) - 1
    tabs(0,Ubound(tabs,2))=soustabs(0,i)  
    tabs(1,Ubound(tabs,2)) =Mid(soustabs(1,i),1,len(soustabs(1,i))-len(soustabs(2,i)))
    tabs(2,Ubound(tabs,2)) = soustabs(2,i)
    Redim Preserve tabs(2,Ubound(tabs,2)+1) '--Augmente la taille du tableau par rapport au contenu du sous tableau
   Next
   
  Next
 arborescence = tabs
 
End Function
''----Function accent
''------Enleve les accents des dossiers et fichiers d'une arborescence
''------Retourne un tableau avec une arborescence sans accent
 
Function accent(arbo)
 Dim lettre, ascii, i,j
 Dim nouveauNom
 For i=1 To len(arbo)
 
   lettre = Mid(arbo,i,1)
   ascii=asc(lettre)
 
   Select Case ascii
    Case 224, 225, 226, 227, 228, 229  ''Cas des "a" avec accent''
     nouveauNom = nouveauNom & chr(97)
    Case 232, 233, 234, 235     ''Cas des "e" avec accent"
     nouveauNom = nouveauNom & chr(101)
    Case 236, 237, 238, 239     ''Cas des "i" avec accent''
     nouveauNom = nouveauNom & chr(105)
    Case 242, 243, 244, 245, 246   ''Cas des "o" avec accent''
     nouveauNom = arboe(2,j) & chr(111)
    Case 249, 250, 251, 252   ''Cas des "u" avec accent''
     nouveauNom= nouveauNom & chr(117)
    Case Else          ''Si pas accent''
     nouveauNom = nouveauNom & chr(ascii)
   End Select
   
 Next
  accent = nouveauNom
End Function
 
''Fonction de chiffrage
''Retourne une chaine
 
Function chiffrage(arbo, key)
 Dim i,j, lettre, ascii
 Dim nouveauNom
 
 For i=1 To Len(arbo)
   lettre = Mid(arbo,i,1)
   ascii = asc(lettre)
   key = key Mod 26
   
   Select Case ascii
    Case 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 ''Cas des majuscules''
     ascii = ascii + key
     If ascii > 90 Then
      ascii = ascii - 26
     End If
     nouveauNom = nouveauNom & chr(ascii)
    Case 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 ''Cas des minuscules''
     ascii = ascii + key
     If ascii > 122 Then
      ascii = ascii - 26
     End If
     nouveauNom = nouveauNom & chr(ascii)
    Case Else ''Si pas accent''
     nouveauNom = nouveauNom & chr(ascii)
   End Select
   
 Next
 
 chiffrage = nouveauNom
End Function
''--Fonction dechiffrage
''---Renvoi une chaine dechiffrer en fonction de la clé  
Function dechiffrage(arbo, key)
 Dim i, lettre, ascii, nouveauNom
 
 i = 1
 
 Do
  lettre = Mid(arbo, i, 1)
  ascii = asc(lettre)
  key = key Mod 26
   
  Select Case ascii
   Case 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 ''Cas des majuscules''
    ascii = ascii - key
    If ascii < 65 Then
     ascii = ascii + 26
    End If
    nouveauNom = nouveauNom & chr(ascii)
   Case 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 ''Cas des minuscules''
    ascii = ascii - key
    If ascii < 97 Then
     ascii = ascii + 26
    End If
    nouveauNom = nouveauNom & chr(ascii)
   Case Else ''Si pas accent''
    nouveauNom = nouveauNom & chr(ascii)
  End Select
  i = i + 1
   
 Loop Until Mid(arbo,i,1) = ""
 
 dechiffrage = nouveauNom
 
End Function
 
'Fonction aide
'affiche les commandes
Function help()
 
 help = help & "NOM" & Chr(10)
 help = help & Chr(10)
 help = help & Chr(9) & "TraiterArbo.bvs - Traiter ..." & Chr(10)
 help = help & Chr(10)
 help = help & "SYNOPSIS" & Chr(10)
 help = help & Chr(10)
 help = help & Chr(9) & "TraiterArbo.bvs [OPTION]... [FICHIER]..." & Chr(10)
 help = help & Chr(10)
 help = help & "DESCRIPTION" & Chr(10)
 help = help & Chr(10)
 help = help & Chr(9) & "-c,--chemin REPERTOIRE" & Chr(10)
 help = help & Chr(9) & "-d, --decrypt : déchiffrage de l'arborescence CLE" & Chr(10)
 help = help & Chr(9) & "-e, --encrypt : chiffrage de l'arborescence CLE" & Chr(10)
 help = help & Chr(9) & "-a, --accent : enlève les accents" & Chr(10)
 help = help & Chr(9) & "-v, --verbose : active le mode détaillé" & Chr(10)
 help = help & Chr(9) & "-s, --simulate : active la simulation du script" & Chr(10)
 help = help & Chr(9) & "-u, --upper : changer la casse en majuscule" & Chr(10)
 help = help & Chr(9) & "-l, --lower : changer la casse en minuscule" & Chr(10)
 help = help & Chr(9) & "-f, --file : traite seulement les fichiers" & Chr(10)
 help = help & Chr(9) & "-t, --truncate : tronque le nom des éléments à x caractères NOMBRE_CARACTERES" & Chr(10)
 help = help & Chr(9) & "-h, --help : affiche l'aide" & Chr(10)
 help = help & Chr(9) & "--author :affiches les auteurs"
 
End Function
 
Function author()
 author = author & "Script : TraiterArbo.vbs" & Chr(10)
 author = author & "Auteurs : Yacine Rezgui et Ferretti Cédric"
End Function
 
''-------------------------------------------Test les arguments entrer par l'utilisateur-----------------------------------------------------------''
Dim i, cmdMain
 If wscript.Arguments.Count = 0 Then  
  wscript.echo "Aucun arguments entrés"
 Else
  i=-1 '-- A -1 pour car wscript.arguments commence a zero  
   
  Do  
   i = i + 1
   cmdMain =  wscript.Arguments(i)  ''--On s'arrete a la premiere des principaux arguments trouvé--''
  Loop Until wscript.Arguments(i) = "--author" Or wscript.Arguments(i) = "-h"   Or wscript.Arguments(i) = "--help" Or wscript.Arguments(i) = "-c" Or i >= wscript.Arguments.Count - 1
 End If
'------------------------------------------ On test les arguments principales-----------------------------------------------------------------------''
Dim chemin
 
 Select Case cmdMain
  Case "--author"
   cmdMain = "author"
  Case "-h","--help"
   cmdMain = "aide"
  Case "-c"
   ''--On test si le chemin existe et contient quelquechose--''
   If oFSO.FolderExists(wscript.Arguments(i+1)) Then
    cmdMain = "chemin"
    chemin = wscript.Arguments(i+1)
   Else : wscript.echo "Chemin invalide" ''--Sinon Msg d'erreur--''
   End If
 End Select
 
 ''-----------------------------------------Partie Recuperation de l'arborescence dans une matrice------------------------------------------------''
If cmdMain = "chemin" Then
 Dim arbo,j
 arbo = arborescence(chemin)
 
End If
''-------------------------------------------------------Matrice recuperer----------------------------------------------------------------------------------------''
 
 ''-----------------------On test maintenant si il y a d'autre arguments uniquement si un chemin valide a été entrez----------------------------------''
 
 If cmdMain="chemin" Then
  For i=0 To wscript.Arguments.Count - 1
   Select Case wscript.Arguments(i)
    Case "-a","--accent"
      For j=0 To Ubound(arbo,2)
       arbo(2,j) = accent(arbo(0,j))
      Next
   End Select
  Next
   
  For i=0 To wscript.Arguments.Count - 1
   Select Case wscript.Arguments(i)
    Case "-e","--encrypt"
      For j=0 To Ubound(arbo,2)
       arbo(2,j) = chiffrage(arbo(2,j),wscript.Arguments(i+1))
       wscript.echo arbo(2,j)
    Next
    Case "-d","--decrypt"
     For j=0 To Ubound(arbo,2)
      arbo(2,j) = dechiffrage(arbo(2,j),wscript.Arguments(i+1))
      wscript.echo arbo(2,j)
     Next    
     
   End Select
  Next
 ElseIf cmdMain = "aide" Then wscript.echo help()
 Else If cmdMain = "author" Then wscript.echo author()
 End If
 

Message cité 1 fois
Message édité par hakumen le 15-12-2010 à 17:33:00
Reply

Marsh Posté le 20-12-2010 à 10:28:09    

hakumen a écrit :

faire un Dim tabs() puis un ReDim tabs(2) ne marchez pas

C'est normal car il existe deux Dim différent :
 
- Le vieux Dim, où l'on indique la taille maximale, par exemple Dim toto(20)
Cela permet de définir un tableau de taille fixe.
Avec ce Dim, on peut faire un ReDim, si on a besoin de changer la taille.
 
- Le nouveau Dim, où l'on n'indique pas la taille, par exemple Dim toto()
Cela permet de définir un tableau de taille variable.
Avec ce nouveau Dim, on ne peut pas faire de ReDim, car cela n'aurait aucun sens. Notre tableau est déjà un tableau extensible. On peut enlever ou ajouter autant d'éléments que l'on veut.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed