IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

[VBS][RegExp] Extraire un bloc de données entre deux mots clés


Sujet :

VBScript

  1. #1
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut [VBS][RegExp] Extraire un bloc de données entre deux mots clés

    Je veux extraire un bloc de données entre deux mots clés :#Start et :#End
    Donc j'ai un fichier qui contient :
    XXXXXXXXX
    YYYYYYYYYYYYY
    ...........
    etc..........................
    :#Start
    Bloc de données à extraire
    .....................................
    .....................................

    :#End
    ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
    pppppppppppppppppppppppppppppppp
    etc.................
    Donc comment je peux faire ceci ?

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    On peut faire comme ça.
    Code vbs : 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
    's : capturée le fichier entier non-vide
     
    set rx=new regexp
    with rx
        .global=true
        .ignorecase=false
        '.pattern="(^|(\r\n))(:#Start\r\n)([\s\S]*?)(\r\n)(:#End)"    'submatches(3)
        .pattern="(?:^|(?:\r\n))(?::#Start\r\n)([\s\S]*?)(?:\r\n)(?::#End)"    'submatches(0)
    end with
     
    if rx.test(s) then
        set cm=rx.execute(s)
        for each m in cm
            'chaque résultat attendue
            'wscript.echo m.submatches(3)    'selon le pattern
            wscript.echo m.submatches(0)
        next
    end if

  3. #3
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut
    Le problème est

  4. #4
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,

    pas la peine d'inclure des CRLF's tant que \s\S inclut tout caractère..le moteur fera des "efforts" inutiles pour trouver la chaine correspondante...on peux simplifier ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?::#Start)([\s\S]*?)(?::#End)
    une autre methode est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?::#Start)((?:(?!:#End)[\s\S])*)
    explication

    pour avoir un echec rapide en stoppant le baktracking on peux simuler un groupe atomique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?::#Start)(?=((?:(?!:#End)[\s\S])*))\1
    le groupe positive lookahead est par nature atomique on peux ainsi l'utiliser ainsi (?=(gprs))\n pour simuler des groupes atomiques (?>gprs)

  5. #5
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    pas la peine d'inclure des CRLF's tant que \s\S inclut tout caractère..le moteur fera des "efforts" inutiles pour trouver la chaine correspondante...
    Comme ce n'est pas la première fois je reçois ce même (genre) de commentaire, je prenais à la côté légère et il me semblait ce n'est pas tellement grave pour valoir une réponse. Mais comme ça se répète, je crois je devrais y répondre.

    Je pense Monsieur n'a pas bien compris l'issue que j'ai pris en considération. Que \s\S inclut \r et \n c'est évident. Mais Monsieur ne pense pas le pattern q'il propose pour remplacer le mien soit le même, j'espère ! Les considérations prises en compte s'agissent

    [1] Que :#Start se positionne au début d'une ligne et se termine de suite; que :#End se positionne au début d'une ligne. Cela fait la différence entre les deux patterns et ce n'est pas rien;

    [1'] Que les data ne se trouvent pas dans ce situation "xyz:#Start blah blah :#End abc" pour une précision supplémentaire mineure;

    [2] Que les data soit "Hello", je n'ai aucune raison de mépriser par retourner vbcrlf & "Hello" & vbcrlf si ce n'est pas trop de travail dans ma côté.

    Voilà !

  6. #6
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut HTABOX.bat

    Juste, pour vous expliquer pourquoi j'ai eu recours à cette astuce qui extrait un bloc de données entre deux mots clés :#Start et :#End

    Donc, je vous présente un nouveau élément à utiliser dans vos batchs lorsque vous voulez cacher la saisie du mot de passe tapé par l'utilisateur et que l'on puisse le récupérer dans une variable pour une utilisation ultérieure
    Donc, ce programme est un script hybride qui regroupe le Batch le Vbscript et le HTA.

    Comment ça marche ?

    C'est très simple ; ce script génère un Vbscript qui sert à lire le code de notre batch qui est en cours d'exécution et extraire la partie HTML comprise entre :#Start et :#End et qui va nous intéresser pour créer le fameux HTA en question et qui a pour but de cacher le mot de passe saisi par l'utilisateur

    Donc en gros c'est comme un module que vous pouvez facilement l’intégrer à tous vos scripts batchs qui nécessite une saisie de mot de passe.

    HTABOX.bat

    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
    @echo off
    Title G‚n‚rer un HTABOX pour cacher un mot de passe en ligne de commande Copyright Hackoo 2014
    mode con cols=90 lines=3 & color 9B
    Set MyVBSFile=%tmp%\%~n0.vbs
    Set MyHTAFile=%tmp%\%~n0.hta
    :: Créer le VBS Pour extraire et générer le code du HTA
    Call :CreateMyVBS
    :: Lancer Le VBS
    Cscript.exe //NOLOGO %MyVBSFile%
    :: Lancer Le HTA crée par le VBS
    start /wait mshta.exe "%MyHTAFile%"
    Del "%MyVBSFile%" & Del "%MyHTAFile%"
    :: Lire le contenu du fichier %tmp%\userIn pour extraire le mot de passe tapé depuis
    :: le HTABOX et le définir comme une variable
    for /f %%i in (%tmp%\userIn) do set "Mypassword=%%i"
    echo Votre mot de passe saisi est : %MyPassword%
    Del %tmp%\userIn
    pause 
    Exit /b
    :#Start
    <html>
    <head>
    <title>Mot de Passe © Hackoo</title>
    <hta:application id="htaid"
    applicationName="Password"
    border="thin"
    icon="wlrmdr.exe"
    borderStyle="normal"
    caption="yes"
    contextMenu="no"
    maximizeButton="no"
    minimizeButton="yes"
    navigable="yes"
    showInTaskbar="yes"
    singleInstance="yes"
    sysmenu="yes"
    SCROLL="NO" 
    SHOWINTASKBAR="Yes"   
    SELECTION="no"
    MINIMIZEBUTTON="no" 
    >
    </head>
    <META HTTP-EQUIV="MSThemeCompatible" CONTENT="YES"> 
    <BODY TOPMARGIN="1" LEFTMARGIN="1"><CENTER><DIV><SPAN ID="ONSCR"></SPAN></DIV></CENTER></BODY>
    <script language="vbscript">
    '---------------------------------------------------------------------------------------
    Sub Window_OnLoad
        CenterWindow 300,150
        Call PasswordForm()
        Call TextFocus()
    end sub
    '---------------------------------------------------------------------------------------
    Sub CenterWindow(x,y)
        Dim iLeft,itop
        window.resizeTo x,y
        iLeft = window.screen.availWidth/2 - x/2
        itop = window.screen.availHeight/2 - y/2
        window.moveTo ileft,itop
    End Sub
    '----------------------------------------------------------------------------------------
    Sub SavePassword()
        set fs=CreateObject("Scripting.FileSystemObject")
        strFile=fs.GetAbsolutePathName(fs.BuildPath(fs.GetSpecialFolder(2),"UserIn"))
        set ts=fs.OpenTextFile(strFile,2,True)
        If PasswordArea.value <> "" Then
            ts.WriteLine PasswordArea.value
            ts.Close
            self.Close 'Pour fermer ce HTA après avoir enregistré le mot de passe comme une variable dans le fichier Userin
        else
            Msgbox "Le mot de passe est vide ! "& Vbcrlf & "SVP entrez de nouveau votre mot de passe",VbExclamation,"Mot de Passe © Hackoo"
            Location.reload(true) 'Pour recharger à nouveau ce HTA
        end if
    End Sub
    '----------------------------------------------------------------------------------------
    Sub PasswordForm()
        Self.document.title = "Mot de Passe © Hackoo"
        Self.document.bgColor = "lightblue"
        ONSCR.InnerHTML="<center><FONT COLOR=""#FFFFFF"" SIZE=""+1"" FACE=""VERDANA,ARIAL,HELVETICA,SANS-SERIF"">Taper votre mot de passe</FONT<br>"_
        &"<input type=""password"" name=""PasswordArea"" size=""20"" onKeyUp=""TextFocus""><P>"_
        &"<input type=""Submit"" STYLE=""HEIGHT:25;WIDTH:110"" value=""OK"" onClick=""SavePassword"">"
    END Sub
    '----------------------------------------------------------------------------------------
    Sub TextFocus
        PasswordArea.Focus 
    End Sub
    '----------------------------------------------------------------------------------------
    </script>
    </body>
    </html>
    :#End
    ::***********************************************************************************************
    :CreateMyVBS
    ::'**********************************************************************************************
    (
    echo. Set fso = CreateObject^("Scripting.FileSystemObject"^)
    echo. Set f=fso.opentextfile^("%~f0",1^)
    echo. a=f.readall
    echo. Set r=new regexp
    echo. r.pattern = "(?:^|(?:\r\n))(?::#Start\r\n)([\s\S]*?)(?:\r\n)(?::#End)"
    echo. Set Matches = r.Execute^(a^)
    echo. If Matches.Count ^> 0 Then Data = Matches^(0^).SubMatches^(0^)
    echo. WriteFileText "%MyHTAFile%",Data
    echo. f.close
    ::'**********************************************************************************************
    echo. 
    echo. Function WriteFileText^(sFile,Data^)
    echo.     Dim objFSO,oTS,sText
    echo.     Set objFSO = CreateObject^("Scripting.FileSystemObject"^)
    echo.     Set oTS = objFSO.CreateTextFile^(sFile,2^)
    echo.     oTS.WriteLine Data
    echo.     oTS.close
    echo.     set oTS = nothing
    echo.     Set objFSO = nothing
    echo. End Function 
    ) > %MyVBSFile%
    ::'***********************************************************************************************
    Remarque : n'oubliez surtout pas de voter sur cette astuce et un grand pour ceux qui m'ont aider à la mettre en place

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/10/2012, 18h40
  2. Extraire un bloc de données
    Par mour92 dans le forum VBScript
    Réponses: 6
    Dernier message: 12/04/2012, 21h39
  3. Extraire des blocs de données dans un fichier. AWK?
    Par oliverjack dans le forum Linux
    Réponses: 2
    Dernier message: 25/06/2009, 19h56
  4. séparaition entre deux mots clés..
    Par {F-I} dans le forum Référencement
    Réponses: 2
    Dernier message: 23/01/2008, 21h48
  5. [ADO.Net][VB.NET] Comment copier des données entre deux BDD différentes ?
    Par maddog2032 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 06/06/2005, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo