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 :

Compter et comparer le nombre de fichiers d'un répertoire [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    779
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 779
    Points : 178
    Points
    178
    Par défaut Compter et comparer le nombre de fichiers d'un répertoire
    Bonjour,

    J'aimerai faire un script qui me permettra à son lancement de compter les fichiers d'un répertoire, comparer si ce nombre et égale au nombre de fichiers figurant sur une ligne du dernier log. Si le nombre est différent ça lance la sauvegarde.

    Le script suivant permet de calculer le nombre de fichiers dans le répertoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @echo off
    cls
    set repertoire="C:\Users\Public\"
    dir %repertoire% /A-D /B /S | find %repertoire% /C
    set compte=dir %repertoire% /A-D /B /S | find %repertoire% /C
    rem n'affiche pas le nb de fichiers dans echo renvoi zéro ??
    echo le repertoire %repertoire% comptient %compte% fichiers 
    pause
    Mais malgré mes recherches, je n'ai pas trouvé de réponse concernant la comparaison.

    Un peu d'aide svp, merci d'avance.

  2. #2
    Membre éclairé Avatar de devilsnake88
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2013
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 453
    Points : 809
    Points
    809
    Par défaut
    Bonjour,
    Un petit indice rapide:
    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @echo off & cls
    for /f "tokens=*" %%A in ('dir /b /s "%repertoire%\*.*"') do echo Trouve: %%A
    pause
    exit
    ________________________________________________________________
    N'oublie pas de faire une sauvegarde avant d'exécuter des scripts...
    Si j'ai ton problème, un petit fait toujours plaisir!
    ________________________________________________________________

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

    Tu ne peux pas setter une variable par une commande set val=commande, mais grâce à FOR /f tu peux récupèrer la sortie d'une commande
    et setter la variable avec cette valeur.

    VOici le code qui fait ce que tu veux :

    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
    @echo off
    set "$repertoire=C:\Users\Public\"
    
    ::On récupère la valeur dans test.log
    <test.log set /p "$ValLog="
    
    ::On récupère le nombre de fichier dans le répertoire
    for /f %%a in ('dir /a-d-s-h /b "%$repertoire%" ^| find /v /c ""') do set $NbFichier=%%a
    
    ::On test les 2 valeurs
    
    if "%$NBFichier%" NEQ "%$ValLog: =%" goto:Save
    echo Tout est OK, Pas besoin de sauvegarde !
    exit/b
    pause
    
    
    :Save
    echo Nb Fichier = -%$NBFichier%-
    echo Val Log = -%$ValLog%-
    echo Valeurs differentes on sauvegarde !
    pause
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    779
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 779
    Points : 178
    Points
    178
    Par défaut
    Bonjour et merci pour vos réponses.

    devilsnake88, j'ai testé ton code, il liste les fichiers, alors qu'il faut les compter.

    sachadee, si j'ai bien compris il faut saisir la donnée, c'est pas mal, mais finalement le plus simple serait de comparer le nombre de fichiers dans la source avec le nombre de fichiers dans la destination en précisant que les fichiers *.tmp, *.bak et *.db sont exclus lors de la sauvegarde.

  5. #5
    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
    la première fois il faut mettre la valeur manuellement mais ensuite tu peux très bien faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >test.log echo %$NBfichier%
    et ça sera 100% automatique

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

  6. #6
    Membre éclairé Avatar de devilsnake88
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2013
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 453
    Points : 809
    Points
    809
    Par défaut
    Mon commentaire n'avait pour but que de te montrer qu'il fallait passer par une boucle FOR pour effectuer ton DIR mais super Sachadee a été on ne peut plus concis ^^
    ________________________________________________________________
    N'oublie pas de faire une sauvegarde avant d'exécuter des scripts...
    Si j'ai ton problème, un petit fait toujours plaisir!
    ________________________________________________________________

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    779
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 779
    Points : 178
    Points
    178
    Par défaut
    Bonjour,

    J'ai progressé dans mon batch, encore merci à vous.

    Pour comparer le nombre de fichiers dans la source avec le nombre de fichiers dans la destination
    Voici mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if "%$NBSource%" NEQ "%$NBDestination%" …
    Une question de débutant, comment exclure dans le calcul du nombre de fichiers du répertoire source les fichiers *.tmp, *.bak et *.db.

    Par contre le code suivant renvoi 1 au lieu du nombre total de fichiers, pourriez-vous me donner une petite explication
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @echo off & cls
    set $repertoire="C:\Users\Public\"
    ::On récupère le nombre de fichier dans le $repertoire
    for /f %%a in ('dir /a-d-s-h /b "%$repertoire%" ^| find /v /c ""') do set $NbFichier=%%a
    echo %$NBfichier%
    pause

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    779
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 779
    Points : 178
    Points
    178
    Par défaut
    Boujour,

    J'ai fait des recherches complémentaires et j'ai trouvé une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set /a Compteur=0
    for /f %%a in ('dir %repertoire% /A-D /B /S ') do set /a Compteur+=1
    echo Le repertoire %repertoire% contient %Compteur% fichiers 
    pause
    Je vais cherché comment exclure dans le calcul du nombre de fichiers du répertoire source les fichiers *.tmp, *.bak et *.db.

  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
    Fait une autre boucle pour les compter :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set "$Ext_Nul=*.tmp,*.bak,*.db" 
    
    for /f %%a in ('dir %repertoire% %$Ext_Nul% /A-D /B /S ') do set /a Compteur1+=1
    et au final tu soustrait compteur1 de compteur

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

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    779
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 779
    Points : 178
    Points
    178
    Par défaut
    Bonjour &

    Tout simplement un grand merci pour votre réponse.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    779
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 779
    Points : 178
    Points
    178
    Par défaut
    Bonsoir,

    Je reviens vers vous, car je rencontre un petit problème avec mon code
    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
    @echo off & cls
    setlocal ENABLEDELAYEDEXPANSION
    
    ::set source="C:\Users\TITI\"
    ::set destination="W:\Save_TITI\robocopy_save_TITI_destination_passeport"
    
    set source="C:\Users\Public\"
    set destination="W:\Save_Public_TITI\robocopy_save_public_TITI_destination_passeport\"
    
    ::set source="H:\" & rem clé USB nom de volume Transcend
    ::set destination="W:\Save_Transcend_TITI\robocopy_Transcend_destination_passeport\"
    
    Rem récupère le nombre de fichier dans source
    set /a Compteur=0
    for /f %%a in ('dir %source% /A-D /B /S ') do set /a Compteur+=1
    
    Rem récupère le nombre de fichier dans destination
    set /a Compteur_1=0
    for /f %%a in ('dir %destination% /A-D /B /S ') do set /a Compteur_1+=1
    
    echo Le repertoire %source% contient %Compteur% fichier(s)
    echo.
    echo Le repertoire %destination% contient %Compteur_1% fichier(s)
    
    if "%source%" NEQ "%destination%" goto:Save else goto:NotSave
    
    :Save
    echo Lance la sauvegarde
    
    :NotSave
    echo Pas besoin de sauvegarde
    pause
    En principe il doit renvoyer "Lance la sauvegarde" si "%source%" <> "%destination%" et "Pas besoin de sauvegarde" si "%source%" = "%destination%".

    Cependant dans tous les cas il revoie "Lance la sauvegarde" et "Pas besoin de sauvegarde", certainement que mon code contient une bourde, pourriez-vous corriger svp.

    Petite remarque, si je spécifie le chemin "C:\Users\TITI\" ou ="H:\" dans la variable rien n'est renvoyé, avez-vous une explication ?

    Pour mémoire, je veux planifier une sauvegarde si le nombre de fichiers dans la source et différent de la destination.

  12. #12
    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
    Premierement %source% et %destination% ne seront jamais egal vu que ce sont des chemins.

    Ce que tu veux tester ce sont les compteurs :

    if "%compteur%" NEQ "%Compteur_1%" goto:Save else goto:NotSave

    Ensuite pour ton 2éme problème, n'oublie pas que c'est du script donc si tu l'envoie sur :save

    il ira sur :Notsave automatiquement. Pour éviter cela mets simplement un goto eof ou exit/b :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    :Save
    echo Lance la sauvegarde
    exit/b
    
    :NotSave
    echo Pas besoin de sauvegarde
    pause
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    779
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 779
    Points : 178
    Points
    178
    Par défaut
    Bonjour sachadee

    Premierement %source% et %destination% ne seront jamais egal vu que ce sont des chemins.

    Ce que tu veux tester ce sont les compteurs :

    if "%compteur%" NEQ "%Compteur_1%" goto:Save else goto:NotSave

    Ensuite pour ton 2éme problème, n'oublie pas que c'est du script donc si tu l'envoie sur :save

    il ira sur :Notsave automatiquement. Pour éviter cela mets simplement un goto eof ou exit/b :
    Je me suis mélangé les crayons, vous avez parfaitement raison.

    Concernant la deuxième question : avec le chemin "C:\Users\TITI\" ou ="H:\" dans la variable rien n'est renvoyé, mème en lançant le bat en tant qu'administrateur.

    Je ne comprends pas, avez-vous une explication ?

    Merci d'avance pour votre réponse, @+.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    779
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 779
    Points : 178
    Points
    178
    Par défaut
    Bonjour sachadee

    Je me suis obstiné à chercher et j'ai trouvé la solution avec la fonction Runas et l'aide Dos.

    Pour lancer le bat en tant qu'administrateur il faut inclure la ligne de commande suivante après Echo Off :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RUNAS /noprofile/user:nom du PC\nom utilisateur cmd & rem exécuté en tant qu'administrateur (noprofile) sans saisi du mdp !
    cls
    Cela permet de compter le nombre de dossiers, de fichiers et la taille totale des répertoires "C:\Users\...\" ou "C:\Users\Public\" ou "Lettre lecteur:\" sur une clé USB ou un disque externe.

    Merci pour ton aide.

    A prime abord la discussion est résolue.

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 26/11/2008, 16h41
  2. Compter nombre de fichier dans un répertoire
    Par Jeanvaljean44 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/02/2008, 11h57
  3. Réponses: 1
    Dernier message: 30/10/2007, 00h07
  4. Réponses: 7
    Dernier message: 10/10/2007, 19h23
  5. compter le nombre de fichiers dans un répertoire !
    Par lehic dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 20/11/2005, 17h59

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