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

Scripts/Batch Discussion :

Fonctions utiles pour des chaînes de caractères [Trucs & Astuces]


Sujet :

Scripts/Batch

  1. #1
    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 Fonctions utiles pour des chaînes de caractères
    salut,

    voici quelques fonctions pour traiter les chaînes de caractères:

    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 & setlocal enabledelayedexpansion enableextensions
     
    set str=%*
    if not defined str (set /p str=Entrez une chaine: %)
    echo.
     
    call :length  "%str%"
    call :count   "%str%"
    call :reverse "%str%"
    call :ucase   "%str%"
    call :2hexa   "%str%"
    call :cword   "%str%"
    call :def     "%str%"
    call :defRev  "%str%"
    call :DecToHex1 2657
    call :DecToHex2 2657
    call :fileRev  "my file.txt"
    
     
    set length
    set [
    set reverse
    set ucase
    set hexa
    set cword
    set $hex1
    set $hex2
     
    pause & endlocal & goto:eof
     
     
    :length
    for /f "tokens=1* delims=[]" %%a in ('
      "%comspec% /u /c echo:%~1|more|find /n /v """
     ') do set /a "length=%%a-4"
    goto:eof
     
    :count
    for /f %%: in ('
      "%comspec% /u /c echo:%~1|more|sort"
     ') do Set /A "[%%:]+=1"
    goto:eof
     
    :reverse
    for /f "tokens=1* delims=:" %%a in ('
        "%comspec% /u /c echo:%~1|more|findstr /o ."
     ') do set "reverse=%%b!reverse!"
    goto:eof
     
    :ucase
    for /f "tokens=1* delims=µ" %%a in ('
        "tree \µµµ%1|find ":\""
      ') do set "ucase=%%b"
    goto:eof
     
    :2hexa
    <nul>$asc$ set/p"=%~1"
    for /l %%i in (1 1 %length%) do <nul>>$hex$ set/p"=µ"
    for /f "skip=1 tokens=3" %%i in ('fc /b $hex$ $asc$') do set "hexa=!hexa!%%i-"
    set "hexa=%hexa:~0,-1%" & del $asc$ $hex$
    goto:eof
     
    :cword
    Set/Acword=0,cword=1+%str: =,cword+=1+%
    goto:eof
     
    :def
    for /l %%a in (0 1 %length%) do (
      for /l %%i in (1 1 1000) do >nul ver
        <nul call Set/p"=%%str:~%%a,1%%"
    )
    echo.
    goto:eof
     
    :defRev
    for /l %%a in (%length% -1 0) do (
      for /l %%i in (1 1 1000) do >nul ver
        <nul call Set/p"=%%str:~%%a,1%%"
    )
    echo.
    goto:eof
    
    :DecToHex1
    ::
    :  Idée de Carlos (voir source)
    ::
    set $hex1=0x0
    for /f "tokens=1* delims=0=" %%a in ('"%comspec% /cexit/b %1&set;|find "^=ExitCode^=""') do Set $hex1=0x%%b
    goto :eof
    
    
    :DecToHex2
    ::
    :  Idée de 01MDM (voir source)
    ::
    for /f "tokens=1,3" %%i in ('^(
      reg add hkcu\console /v $hex2 /t reg_dword /d %1 /f ^&
      reg query hkcu\console /v $hex2  ^&
      reg delete hkcu\console /v $hex2 /f
     ^)^|find "REG_DWORD"') do Set %%i=%%j
    goto:eof
    
    :fileRev
    echo.&echo     ##########[ BEGIN ]#######################
    echo.
    for /f "tokens=1* delims=][" %%s in ('find /n /v "" ^< %1') do (
       Set "table[%%s]=%%t"
       if not defined table[%%s] set table[%%s]=µµµ
       Set nline=%%s
    )
    for /l %%i in (%nline% -1 1) Do (
      for /f "tokens=1* delims=µ=" %%o in ('"2>nul set table[%%i]"') do echo=%%p
    )
    echo.&echo      ##########[ END ]#########################
    echo. 
    goto:eof


    fonction Length: affiche le nombre de caractères saisie

    fonction count: compte le nombre de lettre dans la chaine

    fonction reverse: inverse la chaine

    fonction ucase: transforme la chaîne en majuscule

    fonction 2hexa: affiche la valeur hexadecimal de chaque lettre

    fonction cword: compter les mots dans "une chaîne de caractères"

    fonction def: défilement de la chaine de caractères

    fonction defRev: défilement inverse de la chaine

    fonction DecToHex1: Converti du decimal à l'hexadecimal

    fonction DecToHex2: Converti du decimal à l'hexadecimal

    fonction fileRev: lire un fichier à l'envers

  2. #2
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 387
    Points
    387
    Billets dans le blog
    1
    Par défaut
    Excellent, cela devrait être ajouter dans la FAQ.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2008
    Messages : 240
    Points : 247
    Points
    247
    Par défaut
    Hello,
    oui je rejoins john.fender à inclure dans la FAQ. Bravo pour cette astuce.

    Elle va aider beaucoup de Batcheurs.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2008
    Messages : 252
    Points : 124
    Points
    124
    Par défaut
    Nice !

    Thx I'm_HERE

  5. #5
    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,

    merci
    le but de cette petit contribution est d'encourager d'autres membres à poster d'autres fonctions utiles..enfin j'espère..

    EDIT: Ajout de deux nouvelles fonctions de conversion Base(10)/Base(16)
    ces fonctions sont inspirées des idée de Carlos et 01MDM
    source


    PS: petite correction du code de la fonction ecToHex1
    pour ne pas avoir de conflit avec la variable =ExitCodeAscii

    pour voir les variables =EXitCode* tapez dans une invite de commandes ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /l %a in (33 1 126) do @(<nul set/p=%a&%comspec% /cexit/b %a&set;|find /i "=exit")

  6. #6
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 387
    Points
    387
    Billets dans le blog
    1
    Par défaut
    Ca manque quand même d'une fonction pour compter les lignes je trouve

  7. #7
    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
    Citation Envoyé par john.fender Voir le message
    Ca manque quand même d'une fonction pour compter les lignes je trouve
    salut,

    ceci est dans la FAQ

  8. #8
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 387
    Points
    387
    Billets dans le blog
    1
    Par défaut
    Exact, mais je parlais plus en fait d'une astuce reproduisant le wc unixien. Parser avec un for c'est bien, mais c'est lourd et on peux oublier les redirection avec | :/

  9. #9
    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,

    l'une des solution, sans passer par une boucle "FOR", est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /c /v "" < countline.txt

  10. #10
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 387
    Points
    387
    Billets dans le blog
    1
    Par défaut
    Joli, je ne connaissais pas. Encore mieux :


  11. #11
    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
    mais ceci ne va pas compter le nombre de ligne dans un fichier comme tu as demander

  12. #12
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 387
    Points
    387
    Billets dans le blog
    1
    Par défaut
    Rohh, je te pensais au dessus de ça... Voilà la forme exacte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir /b >Monfichier
    
    type Monfichier | find /c /v ""

  13. #13
    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
    Citation Envoyé par john.fender Voir le message
    Rohh, je te pensais au dessus de ça... Voilà la forme exacte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir /b >Monfichier
    
    type Monfichier | find /c /v ""


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type Monfichier | find /c /v ""
    pour moi ce.tte syntaxe..va créer un processus de plus:..en plus c'est la même chose que ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     find /c /v "" < Monfichier
    enfin Bonne Continuation

  14. #14
    Membre averti

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Points : 387
    Points
    387
    Billets dans le blog
    1
    Par défaut
    pour moi cette syntaxe va créer un processus de plus
    Ok, comment j'obtient ma liste de fichier alors dans ce cas présent ? Tu es sûr de toi lorsque tu affirmes que je crée un processus de plus ?

    Et ensuite, non ce n'est pas la même syntaxe : , dans un cas tu assigne le contenu d'un fichier dans une variable que tu traiteras dans la ligne suivante, dans l'autre aucune variable n'est déclarée et la commande est exécutée sur la même ligne.

  15. #15
    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,

    fonction :fileRev pour lire un fichier à l'envers

  16. #16
    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,

    petite fonction pour afficher les propriétés avancées d'un fichier:
    titre - catégorie - company - taille - commentaires ...etc


    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
    :AdvancedProp
    Setlocal EnableExtensions
    If Not Exist "%~f1" Exit /B 2
    For %%x In (
        "0:$Nom","1:$Taille","2:$Type","3:$Date.Modif","4:$Date.Create"
        "5:$Date.Access","6:$Attribut","7:$Etat","8:$Proprietaire","9:$Auteur"
        "10:$Titre","11:$objet","12:$Categorie","14:$Commentaire","15:$Copyright"
        "16:$Artist","17:$Titre.Album","18:$Annee","19:$Numero.Piste"
        "20:$Genre","21:$Duree","23:$Protege","26:$Dimension"
        "34:$Chaines","35:$Entreprise","36:$Description","37:$Version.Fichier"
        "38:$Nom.Produit","39:$Version.Produit","40:$Mots.Clefs" 
    ) Do For /F "Tokens=1* Delims=:" %%s In (%%x) Do (
       >$ Call :$Prop "%~1" %%s %%t 
         set "%%t="
         for /f "tokens=* delims=" %%a in ('
               "cscript -nologo -e:vbs $ & del $"
        ') Do %%a
         if defined %%t Set %%t
    )
    Endlocal & goto :EOF
    :$Prop
    echo Set o=createObject("shell.application").namespace("%~dp1")
    echo wsh.echo "set %3="^&o.getdetailsof(o.parsename("%~nx1"),%2)
    Exit /B 0
    et l'appel à cette fonction:

    par chemin absolu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Call :AdvancedProp "%windir%\explorer.exe"
    ou bien : par nom:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Call :AdvancedProp setup.exe

  17. #17
    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,

    une petite fonction pour extraire d'une chaîne de caractères uniquement les lettres ou les nombres:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    :Xtract  %1=chaîne de caractères  %2=paramètre optionnel [$str]
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    Setlocal enableExtensions
    If [%2]==[$str] Set "v1=-v" & set "v2=^"
    Set ism_elmilef=%~1
    For /F "Tokens=2 Delims=:" %%# In ('
      "%Comspec% /u /cEcho:%ism_elmilef%|More|FindStr -o .|FindStr %v1% ".*:[%v2%0-9]"
     ') do Call Set substr=%%substr%%%%#
    Endlocal & Set "substr=%substr%" & goto :eof
    l'appel de cet fonction se fait par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Call :xtract "45ds8f9558fr5r585f854447r"  
    echo %substr%

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    c:\> tst.bat
    
    45895585585854447
    si on ajoute un deuxième paramètre "$str" à la fonction alors on ne gardera de la chaîne que la sous-chaîne de type String (les nombres seront supprimés).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Call :xtract "45ds8f9558fr5r585f854447r"  $str
    echo %substr%
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    c:\> tst.bat
    
    dsffrrfr
    cas pratique:

    on peux utiliser cette fonction pour par exemple renommer des fichiers en ne gardant de ces dernier que les lettres ou les nombres uniquement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    c:\> dir /b
    
    test32.txt
    125file.txt
    te23tr.txt


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for %%a In (*.txt) Do Call :Xtract "%%a" 
    goto :eof
    
    :xtract  %1=chaîne de caractères  %2=paramètre optionnel [$str]
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    Setlocal enableExtensions
    If [%2]==[$str] Set "v1=-v" & set "v2=^"
    Set ism_elmilef=%~n1
    For /F "Tokens=2 Delims=:" %%# In ('
      "%Comspec% /u /cEcho:%ism_elmilef%|More|FindStr -o .|FindStr %v1% ".*:[%v2%0-9]"
     ') do Call Set substr=%%substr%%%%#
    If defined substr echo Rename %~s1 %substr%%~x1
    Endlocal & goto :eof

    le echo est ici seulement pour le débogage, enlèver le pour que le renommage prenne effet


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    c:\> dir /b
    
    32.txt
    125.txt
    23.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for %%a In (*.txt) Do Call :Xtract "%%a" $str
    goto :eof
    
    :xtract  %1=chaîne de caractères  %2=paramètre optionnel [$str]
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    Setlocal enableExtensions
    If [%2]==[$str] Set "v1=-v" & set "v2=^"
    Set ism_elmilef=%~n1
    For /F "Tokens=2 Delims=:" %%# In ('
      "%Comspec% /u /cEcho:%ism_elmilef%|More|FindStr -o .|FindStr %v1% ".*:[%v2%0-9]"
     ') do Call Set substr=%%substr%%%%#
    If defined substr echo Rename %~s1 %substr%%~x1
    Endlocal & goto :eof

    le echo est ici seulement pour le débogage, enlèver le pour que le renommage prenne effet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    c:\> dir /b
    
    test.txt
    file.txt
    tetr.txt

  18. #18
    Nouveau Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 90
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Août 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    hello,
    je cherche exactement ce genre de script, mais qui me permettrais de de convertir un caractère en un autre

    la variable %msg% contient du texte et doit être ajouter a une url exécutée dans un navigateur
    Le but serait de convertir les symboles #, %, &, ?, /, #, etc. contenu dans %msg% avec leur code url %23, %25, %26, %2F,%3F, etc.

    par exemple :

    %msg% = traitement(%msg);

    >start iexplorer "http://mondomaine.com/page.php?text=%msg%

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/03/2014, 18h35
  2. Réponses: 2
    Dernier message: 03/02/2014, 02h25
  3. [ASTUCES] fonctions utiles pour des chaînes de caractères
    Par I'm_HERE dans le forum FAQs Windows
    Réponses: 1
    Dernier message: 13/04/2010, 11h34
  4. Réponses: 2
    Dernier message: 11/10/2007, 17h36
  5. Réponses: 5
    Dernier message: 15/02/2005, 18h07

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