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 :

Enchaînement de tests sur des extensions [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 37
    Points : 14
    Points
    14
    Par défaut Enchaînement de tests sur des extensions
    Bonjour,

    Je travaille sur un script qui est exécuté via clic droit "Envoyer vers" (raccourci dans le répertoire SendTo). Il travaille donc sur une sélection de fichiers.

    Je dois envoyer des commandes différentes en fonction de l'extension des fichiers et dans le cas précis des PDF, faire une recherche dans le contenu pour savoir quelle commande exécuter.

    La méthode que j'ai imaginée consiste à :
    - compter le nombre d'arguments (fichiers sélectionnés) => variable argC
    - compter le nombre de fichiers qui n'ont pas d'extension PDF => variable eleC
    - compter le nombre de fichier PDF avec un errorlevel à 1 => variable scanC

    La première variable (argC) ne me pose pas de soucis, j'ai bien le nombre total de fichiers sélectionnés. Mais je dois mal imbriquer mes tests derrière, je n'ai rien qui apparaisse ensuite...

    Le code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @echo off
    
    set eleC = 0
    set scanC = 0
    set argC = 0
    for %%x in (%*) do (set /a argC+=1)
    msg %username% %argC%
    for	%%~xI in (*.pdf) do (
    if "%~xI" == "pdf" (findstr /r /i "texte recherché" "%~I") 
    if %errorlevel%==0 (set /a eleC+=1) else (set /a scanC+=1)
    if "%~xI" <> "pdf" (set /a eleC+=1)
    )
    msg %username% %eleC%
    Pour le moment, j'essaye juste de compter et d'afficher le résultat. L'idée au final sera bien entendu de comparer les compteurs pour savoir quelle commande envoyer.

    Merci d'avance pour vos lumières !

  2. #2
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Salut,

    voilà pour le comptage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @echo off
    for %%a in (*.*) do (if "%%~xa"==".pdf" set /a #pdf+=1
                           set /a #all+=1)
    
    set #
    En sortie tu as 2 variables :

    %#all% qui contient le nombre de fichier total
    %#pdf% qui contient le nombre de ".Pdf"

    Tu peut naturellement rajouter un test "IF" de la même manière pour compter n'importe quel autre extension.

    J'ai pas compris ce que tu cherches à faire avec l'errorlevel....

    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  3. #3
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Bonjour,

    Il y a effectivement des erreurs dans ta boucle FOR.
    Déjà je ne comprends pas pourquoi tu boucles uniquement sur *.pdf et qu'ensuite tu testes l'extension (qui sera donc forcément pdf ici).

    Sinon en se limitant aux pdf la boucle devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for	 %%I in (*.pdf) do (
    	if "%%~xI" == "pdf" (findstr /r /i "texte recherché" "%%I") 
    	if %errorlevel%==0 (set /a eleC+=1) else (set /a scanC+=1)
    )
    Tu ne dois pas mettre le %%~xI dans le for, ta déclaration de boucle c'est bien uniquement %%IEt ensuite il faut bien doubler les % (car tu es dans un script, en ligne de commande pas la peine).

    Enfin si tu changes ta boucle en *.* pour prendre en compte tous les fichiers, attention comme tu n'as pas d'imbrication sur tes deux premiers if, le if %errorlevel% va être aussi évalué même si tu n'as pas fait de findstr avant ce qui va pourrir tes compteurs.
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 37
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par sachadee Voir le message
    Salut,

    voilà pour le comptage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @echo off
    for %%a in (*.*) do (if "%%~xa"==".pdf" set /a #pdf+=1
                           set /a #all+=1)
    En sortie tu as 2 variables :

    %#all% qui contient le nombre de fichier total
    %#pdf% qui contient le nombre de ".Pdf"

    Tu peut naturellement rajouter un test "IF" de la même manière pour compter n'importe quel autre extension.

    J'ai pas compris ce que tu cherches à faire avec l'errorlevel....

    Merci pour ton aide

    Ce que je cherche à faire avec le errorlevel, c'est savoir si findstr a bien trouvé ce que je lui demande de chercher. S'il trouve, j'alimente un compteur, s'il ne trouve pas, un autre.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 37
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Drizzt [Drone38] Voir le message
    Bonjour,

    Il y a effectivement des erreurs dans ta boucle FOR.
    Déjà je ne comprends pas pourquoi tu boucles uniquement sur *.pdf et qu'ensuite tu testes l'extension (qui sera donc forcément pdf ici).

    Sinon en se limitant aux pdf la boucle devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for	 %%I in (*.pdf) do (
    	if "%%~xI" == "pdf" (findstr /r /i "texte recherché" "%%I") 
    	if %errorlevel%==0 (set /a eleC+=1) else (set /a scanC+=1)
    )
    Tu ne dois pas mettre le %%~xI dans le for, ta déclaration de boucle c'est bien uniquement %%IEt ensuite il faut bien doubler les % (car tu es dans un script, en ligne de commande pas la peine).

    Enfin si tu changes ta boucle en *.* pour prendre en compte tous les fichiers, attention comme tu n'as pas d'imbrication sur tes deux premiers if, le if %errorlevel% va être aussi évalué même si tu n'as pas fait de findstr avant ce qui va pourrir tes compteurs.
    Merci pour ces infos !
    Grâce à vous deux, je comprends mieux comment se servir de la variable dans un FOR.

    En synthétisant et adaptant vos codes, j'ai quelque chose qui commence à prendre. Mais comme prévu, mes compteurs me donnent n'importe quoi, puisque mes if ne sont pas imbriqués.

    Quand je fais une boucle dans mon IF, je dois me planter dans les variable, ça m'explose les compteurs.

    Pour l'instant, j'en suis là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    set eleC = 0
    set scanC = 0
    set argC = 0
    
    for %%I in (%*) do (
    set /a argC+=1
    if "%%~xI" == ".pdf" (findstr /r /i "texte recherché" "%%I")
    if %errorlevel%==0 (set /a eleC+=1) else (set /a scanC+=1)
    if "%%~xI" NEQ ".pdf" (set /a eleC+=1)
    echo %argC%
    echo %eleC%
    echo %scanC%
    )

  6. #6
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    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
    @echo off & cls
    
    :::Le string à rechercher
    
    set $cherche="Output"
    
    
    set #1trouv=0
    set #2pastrouv=0
    set #3total=0
    
    for %%a in (*.*) do (if "%%~xa"==".pdf" (echo %%a | find /i %$cherche%>nul && set /a #1trouv+=1 || set /a #2Pastrouv+=1)
                         set /a #3total+=1)
    set #
    
    pause
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 37
    Points : 14
    Points
    14
    Par défaut
    Merci ! Je vais tester ça de suite !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 37
    Points : 14
    Points
    14
    Par défaut Solution !
    Avec votre aide, voici le code auquel j'arrive (et qui fait ce que je souhaitais) :
    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
    @echo off & cls
    
    set $cherche="Chaine recherchee"
    
    set #trouve=0
    set #pastrouve=0
    set #selectionFichier=0
    
    for %%a in (%*) do (if "%%~xa" NEQ ".pdf" set /a #trouve+=1)
    for %%a in (%*) do (if "%%~xa"==".pdf" (echo %%a | findstr /r /i %$cherche% %%a>nul && set /a #trouve+=1 || set /a #pastrouve+=1)
                         set /a #selectionFichier+=1)
    set #
    
    ::Commandes de test
    if %#selectionFichier% == %#pastrouve% ( echo commande scan )
    if %#selectionFichier% == %#trouve% ( echo commande autre )
    if not %#pastrouve% == 0 if not %#trouve% == 0 ( msg %username% Message d erreur.)
    Une question encore, cependant : à quoi sert le ? Si je le désactive, ça n'a pas d'impact sur le résultat de mes tests !

    Merci à vous !

  9. #9
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Non, je l'ai juste mis pour t'afficher les variables créer.

    Mais dans d'autres cas on peut l'utiliser dans une boucle FOR pour faire un tri par exemple trier par ordre alphabètique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @echo off
    set "$liste=Sachadee toto tata amanda citronized"
    for %%a in (%$liste%) do set #%%a=%%a
    set #
    Résultat :

    C:\test>test.bat
    #amanda=amanda
    #citronized=citronized
    #Sachadee=Sachadee
    #tata=tata
    #toto=toto
    On affiche les variables créer et vous voyez qu'elle sont classée par ordre alphabètique.
    et non par ordre de création. C'est une des carctèristique du CMD. Il retourne les variables par ordre alphabètique.

    donc pour avoir notre classement en clair, on rajoute ceçi à notre code précedent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cls&echo Liste tri‚ par orde alphabètique :
    echo.
    for /f "tokens=2 delims==" %%a in ('set #') do echo %%a
    Résultat :

    C:\test>test.bat

    Liste trié par orde alphabetique :

    amanda
    citronized
    Sachadee
    tata
    toto
    Cela fonctionne également avec des numéro, mais ATTENTION il doivent tous avoir la même longeur car sinon 100 sera placé avant 1000 et 999 après dans la liste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for %%a in (1000 100 999 1001) do set #%%a=%%a
    set #
    Résultat :

    C:\test\test.bat
    #100=100
    #1000=1000
    #1001=1001
    #999=999
    Donc on peut utiliser cette méthode avec des valeur qui on toujours le même nombre de chiffre.

    Exemple trouver la date la plus ancienne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @echo off&cls
    setlocal enabledelayedexpansion
    
    set "$date=22/04/2012 15/06/2003 12/12/2005 13/08/2014"
    
    for %%a in (%$date%) do (set $date=%%a
               set #!$date:~6,4!!$date:~3,2!!$date:~0,2!=%%a)
    set #
    
    for /f "tokens=2 delims==" %%a in ('set #') do (echo La date la plus ancienne est  : %%a
                                                    exit /b)
    endlocal

    Résultat :

    C:\test\test.bat

    #20030615=15/06/2003
    #20051212=12/12/2005
    #20120422=22/04/2012
    #20140813=13/08/2014
    La date la plus ancienne est : 15/06/2003
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 37
    Points : 14
    Points
    14
    Par défaut
    Merci encore pour tes explications

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

Discussions similaires

  1. Test sur des extension de fichiers
    Par arnaud036 dans le forum Linux
    Réponses: 1
    Dernier message: 05/05/2010, 20h36
  2. test sur des extensions de fichiers script CSH
    Par Ferzed dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 16/06/2009, 10h58
  3. Problèmes Test sur des dates
    Par guigui11 dans le forum ASP
    Réponses: 1
    Dernier message: 11/12/2006, 16h18
  4. Test sur des records
    Par Tchaill39 dans le forum Delphi
    Réponses: 3
    Dernier message: 18/09/2006, 15h51
  5. [JUnit] Les tests sur des interfaces graphiques
    Par adilo dans le forum Tests et Performance
    Réponses: 5
    Dernier message: 01/02/2006, 14h27

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