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 :

Copier X Fichiers dans différents répertoires


Sujet :

Scripts/Batch

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Copier X Fichiers dans différents répertoires
    Bonjour,

    je galère un peu sur un batch, n'étant pas un pro en la matière, je viens chercher un peu d'aide.
    J'aimerais faire un script qui, à partir d'un répertoire contenant 50.000 fichiers, copie les 10.000 premiers fichiers dans un répertoire, les 10.000 suivant dans un autre etc.

    J'ai commencé à écrire ça mais je m'en sors pas :

    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
    set compteur=1 
    for %%i in (c:\ImgTotal\\*.*) do (
    	set /A compteur+=1 
    	set compteur
    	if compteur GEQ 1 if compteur LSS 10000 (
    		copy %%i c:\img01\
    	)
    	if compteur GEQ 10000 if compteur LSS 20000 (
    		copy %%i c:\img02\
    	)
    	if compteur GEQ 20000 if compteur LSS 30000 (
    		copy %%i c:\img03\
    	)
    	if compteur GEQ 30000 if compteur LSS 40000 (
    		copy %%i c:\img04\
    	)
    	if compteur GEQ 40000 if compteur LSS 50000 (
    		copy %%i c:\img05\
    	)
    )
    Quelqu'un aurait une idée ?
    Merci d'avance =)

  2. #2
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    un truc comme ca pourrait t'aider peut etre


    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
    Setlocal EnableDelayedExpansion
    
    set compteur = 0 
    
    for %%i in (./*) do (
    	set /a compteur += 1
    	if !compteur! LSS  10 (
    		echo dossier1
    	) else (
    		if !compteur! LSS  20 (
    			echo dossier2
    		) else (
    			if !compteur! LSS  30 (
    				echo dossier3
    			)
    		)
    	)
    	
    )

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Salut bstevy, merci pour ta réponse.
    Ça fonctionne effectivement très bien, je te remercie.

    Par contre, vu la lourdeur des traitements, je me retrouve avec un batch qui s'arrête sur un "mémoire insuffisante"... Existe-il une commande pour vider la mémoire ou une astuce du genre ?

    Encore merci.

    edit : à noter que je travaille sur un dossier avec 350.000 fichiers dedans, peut-être que la variable compteur ne dépasse pas 65.000 ou autre ?

  4. #4
    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
    Une autre idée avec 2 compteurs.

    et création automatique des réepertoires.

    Je n'ai pas testé (fait depuis mon tablet...)


    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    setlocal enabledelayedexpansion
     
    set "$compteur1=1"
    set "$compteur2=1"
     
    for %%i in (c:\ImgTotal\*.*) do (
       if not exist "c:\img!$compteur1!"  md "c:\img!$compteur1!"
       copy "%%i" "c:\img!$compteur1!"
       if !$compteur2!==10000 (
            set /a $compteur1+=1
            set $compteur2=1
       )
       set /a $compteur2+=1
     
    )

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

  5. #5
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    LOL

    t'aurais pu le faire avec un seul compteur et un modulo ^^

  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


    Citation Envoyé par bstevy Voir le message
    LOL

    t'aurais pu le faire avec un seul compteur et un modulo ^^
    Dans ce cas Effectivement, mais il faut penser au autres situations.
    Si quelqu'un à le même problème mais avec 3245 fichiers.

    Soyons générique...... Et par la même essayons d'être constructif. (LOL)

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

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Merci sachadee, j'ai pu tester ça.
    J'ai le même souci de mémoire, le message exact :
    "Espace insuffisant pour traiter cette commande.
    Mémoire insuffisante."

    A noter qu'il s'arrête au même endroit que l'autre, au 16179ème fichier, mais surtout à exactement 512mo copiés....
    J'ai essayé d'augmenter le cache attribué à cmd via system.ini (en changeant la valeur de
    MaxFileCache) mais à priori ce sont des choses qu'on fait pour les anciens windows, plus besoin maintenant... et effectivement ça ne marche pas mieux.

    Je suis toujours coincé à ce niveau, il n'existe pas de commande pour vider le cache ? Ou une astuce pour relancer le cmd ?
    J'ai essayé de faire un .bat qui fait une boucle qui lance d'autres .bat mais ça ne compile pas... Si quelqu'un a une idée...

    Merci !

  8. #8
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    Essaie comme ça

    Code bat : 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
    setlocal enabledelayedexpansion
     
    set /a "CounterDir=1"
     
    for /r "C:\ImgTotal\" %%a in (*) do (
      set /a "CounterFile+=1"
      if not exist "C:\Img!CounterDir!" md "C:\Img!CounterDir!"
      if !CounterFile! gtr 10000 (
        set /a "CounterDir+=1"
        set /a "CounterFile=1"
      )
      copy /v "%%a" "C:\Img!CounterDir!\%%~nxa"
    )
     
    pause
    exit /b
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Merci InitSreen pour ta solution.

    J'ai malheureusement le même souci, mais il ne s'arrête pas au même endroit, il s'arrête à peu près au même endroit...
    Je précise que j'ai 8go de mémoire, largement assez de place sur le disque etc.

  10. #10
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    Tu es sur quel système (XP, non)?
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Oui, windows XP (ok les 8go ne servent à rien, mais c'était histoire de dire que j'suis assez large...)

  12. #12
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    Je vais regarder mais je suis pas sûr qu'il soit possible de supprimer la limitation
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Arf mince...
    Sinon j'ai essayé de lancer un batch qui appelle un autre batch en boucle en lui passant les paramètres de numéro de fichier + numéro de dossier. En me disant qu'ainsi ça serait un nouveau batch qui serait lancé tous les 10k fichiers et donc on réinitialiserait cette limite mais j'arrive à rien...

    Un truc du genre :

    BatchCopierXVersDossierY :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Pour i = 1 à Nombre de Fichiers du répertoire {
    	si i >= X ET i < X+10000 {
    		copier le fichier numéro i dans le répertoire Y
    	}
    }

    BatchPrincipal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CompteurDossier = 1
    
    Pour i = 1 à Nombre de Fichiers du répertoire {
    	si modulo(i,10000) = 0 {
    		BatchCopierXVersDossier(i,CompteurDossier)
    		CompteurDossier++
    	}
    }

    C'est bien évidemment un peu stupide, mais je rappelle que c'est pour éviter de toutes les copies dans une seule boucle... Mais je n'ai pas pu tester car je n'ai pas réussi à compiler un truc dans le genre... Si quelqu'un veut bien jeter un oeil ça serait sympa.

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bon au final j'ai codé ça en C.

    Merci à ceux qui ont répondu, je ne mets pas en résolu car ça ne l'est pas si quelqu'un a le même besoin initial.

Discussions similaires

  1. copier un fichier dans un répertoire différents
    Par THIB46 dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 11/06/2015, 11h07
  2. Stocker ses fichiers dans différents répertoires
    Par dtthierry dans le forum Langage
    Réponses: 1
    Dernier message: 22/09/2008, 17h05
  3. Réponses: 4
    Dernier message: 21/08/2007, 10h40
  4. Copier un fichier dans un répertoire?
    Par jbjweb dans le forum C
    Réponses: 5
    Dernier message: 05/09/2006, 15h34
  5. Copier un fichier dans un répertoire
    Par soft damsel dans le forum Langage
    Réponses: 2
    Dernier message: 14/02/2006, 16h02

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