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 coller selon une liste excel


Sujet :

Scripts/Batch

  1. #1
    Membre habitué
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut Copier coller selon une liste excel
    Bonjour à tous,

    Mes connaissances en scripting étant très très limitées, et n'ayant pas réussi a trouver ce que je cherchais en écumant le net, je vous envoie cette bouteille à la mer.
    Mon besoin:
    je dois automatiser autant que possible la copie de fichiers .jpg contenu dans un dossier "source", vers un dossier "cible". Ces deux dossiers étant des partages réseau.
    Jusque là rien de compliqué, sauf que le dossier source contient environ 10000 fichiers, et que seules quelques centaines d'entre eux doivent être copiés dans la cible. La sélection de fichiers à copier varie régulièrement, et est basée sur une feuille excel, plus précisément une chaîne de caractère contenue dans une seule colonne.
    Pour faire plus clair, j'ai une colonne excel qui ressemble a ça :

    K01657S
    K01661K
    K01680L
    K01D46Q
    K01D47Q
    K02337Q
    K02345P
    K02446Q
    K02466R
    K024762
    K02D07I

    ces valeurs correspondent a des valeurs contenues dans les noms des fichiers que je dois copier, sachant que les noms peuvent être différents (mais contiennent toujours cette chaîne de 7 caractères)
    ex:
    K799181_ALT006.jpg
    K94633R.jpg
    K01D47Q_ALT009.tif

    A la main, ça prend un temps fou...

    Sur le net j'ai trouvé des choses qui se rapprochaient du résultat escompté, j'ai bien essayé de les adapter, mais jamais réussi a faire fonctionner mon script.
    Le plus proche de mon besoin étant ici:
    https://www.developpez.net/forums/d1...d-listing-txt/
    Mon souci c'est que comme la chaîne de caractères référence a une position variable dans le nom du fichier a copier, il faut insérer cette variable dans le script, et la je coince.

    Peut-être que ça n'est pas grand chose pour une âme charitable qui passera par là, qui sait.
    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Premièrement, le contenu de la colonne Excel qui nous intéresse devrait être enregistré dans un fichier texte ou csv.

    Exemple :
    FileCopy.txt
    K01657S
    K01661K
    K01680L
    K01D46Q
    K01D47Q
    K02337Q
    K02345P
    K02446Q
    K02466R
    K024762
    K02D07I
    Les chaînes de caractères à trouvé se trouvent elles toujours en début de fichier ?
    Si le fichier existe déjà dans la cible doit il être écrasé ?

  3. #3
    Membre habitué
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Merci d'avoir pris le temps de te pencher sur mon souci.
    Bien sur ces valeurs seront copiées dans un .txt
    Ensuite, la chaine de caractere est toujours composée de 7 caractères, mais son emplacement peut varier dans le nom du fichier recherché a copier, ce qui ajoute helas une complication supplémentaire.
    En theorie le dossier de destination sera vide au lancement du script, mais sinon y'a pas de problème a écraser un fichier de même nom déjà existant

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Voici un exemple simple

    Tu as ton :
    - fichier cop.bat
    - fichier FileCopy.txt (au même niveau que cop.bat)
    - dossier src (source)
    - dossier dst (destination)

    Le FileCopy.txt
    K01657S
    K01661K
    K01680L
    K01D46Q
    K01D47Q
    K02337Q
    K02345P
    K02446Q
    K02466R
    K024762
    K02D07I
    Le cop.bat
    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @echo off
     
    set src=C:\base\src
    set dst=C:\base\dst
    set file=%~dp0FileCopy.txt
     
    for /F "usebackq tokens=*" %%a in ("%file%") do xcopy "%src%\*%%~a*" "%dst%" /C /Q /H /R /K /Y 1>nul 2>nul
    pause

  5. #5
    Membre habitué
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Super ! Ca fonctionne ! Merci beaucoup, c'est exactement ce dont j'avais besoin.

    J'aimerais juste ajouter un bout de code pour créer un rapport.txt qui recap les fichiers copiés et les fichiers en erreur. Egalement un texte dans la fenetre du batch qui dirait "xxx fichiers copiés"
    J'ai trouvé ca, je vais essayer de l'adapter a mon cas, sans fichier config.ini.


    if %errorlevel% EQU 0 (
    echo Fichier IMG_%%i.jpg OK >>%chemin_rapport_txt%\rapport.txt
    ) else (
    echo Impossible de copier le fichier IMG_%%i.jpg >>%chemin_rapport_txt%\rapport.txt
    )
    ) else (
    echo Le fichier IMG_%%i.jpg est deja present dans le répertoire cible >>%chemin_rapport_txt%\rapport.txt
    )
    )

    rem --- on ouvre le rapport.txt

    start %windir%\system32\notepad.exe %chemin_rapport_txt%\rapport.txt

    question subsidiaire: Est-ce que le script cherche également dans un éventuel sous-dossier du repertoire src ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    question subsidiaire: Est-ce que le script cherche également dans un éventuel sous-dossier du repertoire src ?
    Non, mais tu peux faire le test c'est assez simple. C'est un besoin ?

    J'aimerais juste ajouter un bout de code pour créer un rapport.txt qui recap les fichiers copiés et les fichiers en erreur. Egalement un texte dans la fenetre du batch qui dirait "xxx fichiers copiés"
    J'ai trouvé ça, je vais essayer de l'adapter a mon cas, sans fichier config.ini.
    Si tu souhaite faire un rapport cela modifiera la structure du script. Nous devrons copier fichier par fichier afin de savoir si il est OK ou KO et ne plus utiliser les jokers dans xcopy.

  7. #7
    Membre habitué
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Bon, j'ai un script qui fait le job, copier coller une liste d'images d'un répertoire a un autre, selon une liste contenue dans un fichier .txt. Le contrat initial est rempli, maintenant j'aimerais juste améliorer un peu le concept, pour avoir un rapport afin que les utilisateurs puissent savoir combien de fichiers ont été trouvés/copiés. S'ils ont 5000 fichiers et que le script n'en copie que 4892, au moins qu'ils le sachent

    J'ai dentifié un autre problème, c'est que mon script ne peut pas créer de nouveau dossier dans le répertoire cible, il faut que je le crée manuellement a l'avance. Idéalement j'aurais aimé qu'il recopie l'arborescence du dossier source. Les options xcopy que j'ai testées ne le font pas. Idem pour la création d'un fichier rapport ou log, si je ne le crée pas a l'avance, le script n'arrive pas a le créer. Sans doute un problème de droits, sachant que tout ceci se déroule sur des partages réseau et non sur un disque local.

    voila a quoi ressemble mon script aujourd'hui

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    @echo off
     
     
    echo ------------------
    echo Copie de fichiers
    echo ------------------
    echo.
     
     
    SET /p src=%sChoice% Chemin Dossier Source:
    REM 'set src=x:\xxxxxxx\xxxxxxx\xxxxxxx\2018 SPRING SUMMER + HOLIDAY 17'
    set dst=x:\xxxxxx\Visuels Produits\SELECTION VISUELS\VISUELS
    set file=%~dp0Liste_articles_a_copier.txt
    SET log=P:\Outils de Vente\Visuels Produits\SELECTION VISUELS\rapport.log
     
     
    ECHO COPIE EN COURS....
     
     
    ECHO ----------------------------------------------------------------->>"%log%"
    ECHO Tâche lancée le %date% à %time% :>>"%log%"
    ECHO Recherche et copie des fichiers listés dans "%file%">>"%log%"
    ECHO depuis "%src%">>"%log%"
    ECHO vers "%dst%">>"%log%"
     
    for /F "usebackq tokens=*" %%a in ("%file%") do xcopy "%src%\*%%~a*" "%dst%" /C /Q /H /I /R /K /Y  
     
    echo ------------------
    echo FIN DE LA COPIE
    echo ------------------
    echo ------------------------------------
    echo FIN DE LA COPIE le %date% à %time%.>>"%log%
    echo ------------------------------------
    echo.
     
    pause


    Nom : 2017-11-13 10_51_39-C__Windows_system32_cmd.exe.jpg
Affichages : 2604
Taille : 102,6 Ko

    question subsidiaire: quelle est l'option du xcopy qui permet de "scanner" également les sous-dossiers du repertoire source?

    Merki

  8. #8
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Voici une évolution

    Code batch : 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
    @echo off
     
     
    echo ------------------
    echo Copie de fichiers
    echo ------------------
    echo.
     
     
    SET /p src=Chemin Dossier Source : 
    set dst=x:\xxxxxx\Visuels Produits\SELECTION VISUELS\VISUELS
    set file=%~dp0Liste_articles_a_copier.txt
    SET log=P:\Outils de Vente\Visuels Produits\SELECTION VISUELS\rapport.log
     
    REM Création du dossier de log
    for %%a in (%log%) do md "%~dpa" >nul 2>nul
     
    ECHO COPIE EN COURS....
     
     
    ECHO ----------------------------------------------------------------->>"%log%"
    ECHO Tâche lancée le %date% à %time% :>>"%log%"
    ECHO Recherche et copie des fichiers listés dans "%file%">>"%log%"
    ECHO depuis "%src%">>"%log%"
    ECHO vers "%dst%">>"%log%"
     
    REM Ajout du paramètre /S pour les sous-dossiers. Suppression de /I
    for /F "usebackq tokens=*" %%a in ("%file%") do xcopy "%src%\*%%~a*" "%dst%" /C /Q /H /R /K /Y /S
     
    echo ------------------
    echo FIN DE LA COPIE
    echo ------------------
    echo ------------------------------------
    echo FIN DE LA COPIE le %date% à %time%.>>"%log%
    echo ------------------------------------
    echo.
     
    pause

  9. #9
    Membre habitué
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Merci Eric

    j'ai testé le /S, mais le nombre de dossiers est tellement important, multiplié par le nombre de fichiers a comparer, que le temps de traitement devient extrêmement long, donc je vais en rester a un niveau d'arborescence et mes utiilsateurs rejoueront le .bat en changeant le dossier source manuellement.

    Pour ce qui est de ton code
    REM Création du dossier de log
    for %%a in (%log%) do md "%~dpa" >nul 2>nul
    j'ai testé mais ca ne fait rien du tout
    J'ai également essayé d'ajouter un > rapport.txt a la fin de ma commande, mais il crée un fichier txt qui me dit "0 fichier(s) copiés"
    Bref, inutile.
    J'aurais aimé un txt qui me dise au moins " xx fichiers copiés ", ca ferait gagner beaucoup de temps a mes utilisateurs plutôt que de comparer manuellement le nombre de fichiers d'un répertoire a l'autre

    Je ne vois pas de solution, a part de m'en passer

  10. #10
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    REM Création du dossier de log
    for %%a in (%log%) do md "%~dpa" >nul 2>nul
    Ceci crée le dossier de log à savoir P:\Outils de Vente\Visuels Produits\SELECTION VISUELS si il n'existe pas.
    Tu me le confirme ?

    Je vais voir pour adapter afin d'avoir un log plus détaillé, nous restons donc au niveau d'un seul dossier je part la dessus.

  11. #11
    Membre habitué
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Si, ce dossier existe, c'est lui qui contient mon script, le fichier liste, le sous-dossier destination, et le fichier log. On est donc sur un seul dossier, qui contient un sous-dossier de destination des fichiers copiés

    SELECTION VISUELS
    | liste.txt
    | rapport.log
    | script.bat
    --> VISUELS (destination)
    |x.jpg
    |y.jpg....etc

    A la base, ma liste de valeurs a chercher se trouve dans la première colonne d'un fichier Excel. Pour que ce soit plus simple a coder, je suis parti sur l'idée de copier-coller cette colonne dans un fichier txt, qui sera lu par mon script.
    Est-il possible de faire lire directement la première colonne du fichier Excel, sans que ca ne donne un code hyper compliqué ? Ca supprimerait une étape de préparation avant d'exécuter le script, donc une source d'erreur potentielle.

    (J'etais parti sur l'idée d'une macro dans ce fichier excel d'origine, mais là le vba c'est juste du chinois pour moi, alors je me suis rabattu sur un .bat)

  12. #12
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Voici une évolution, je te laisse adapter le code je doit partir. Nous verrons ton code si il reste des questions.

    Code batch : 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
    @echo off
     
    set src=%USERPROFILE%\src
    set dst=%USERPROFILE%\dst
    set file=%~dp0FileCopy.txt
    set log=%~dp0Log.txt
     
    set total=0
    set fichierOK=0
    set fichierKO=0
     
    for /F "usebackq tokens=*" %%a in ("%file%") do for /F "tokens=*" %%b in ('dir "%src%\*%%~a*" /b 2^>nul') do (
    	echo copie de %%~b
    	set /a total+=1
    	xcopy "%src%\%%~b" "%dst%" /Q /H /R /K /Y 1>nul 2>nul && (
    		echo OK : %%~b>>"%log%"
    		set /a fichierOK+=1) || (
    		echo KO : %%~b>>"%log%"
    		set /a fichierKO+=1)
    )
     
    echo.
    echo %fichierOK% fichier copier sur %total%
    echo %fichierKO% erreur
     
    pause

  13. #13
    Membre habitué
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Merci Eric !
    Ca marche très bien, je viens de le faire tester par un utilisateur justement.
    Ton script remonte dans le fichier log la liste tous les fichiers qui ont bien été copiés, ce qui déjà est très bien, mais en fait l'utilisateur m'a fait remarquer que ce qui leur serait utile c'est plutôt la liste de tous les articles qui n'ont PAS été trouvés (car manquants dans le dossier source). Ca leur permettrait d'aller les rechercher dans un autre dossier.

  14. #14
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Le log affiche je aussi les fichiers qui n'ont pas pu être copie KO

  15. #15
    Membre habitué
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Bonjour Eric,

    je te confirme que non, le log affiche uniquement les fichiers copiés. Il marque également 0 erreurs, c'est qu'il doit considérer qu'un fichier non trouvé dans le dossier source n'est pas une erreur.
    Dans ma precedente version du script, la fenetre affichait les articles introuvables, plus maintenant, elle affiche désormais le nom des fichiers copiés en clair.

    ancien script
    Nom : 2017-11-13 10_51_39-C__Windows_system32_cmd.exe.jpg
Affichages : 2502
Taille : 102,6 Ko

    nouveau script
    Nom : 2017-11-14 09_18_28-C__Windows_system32_cmd.exe.jpg
Affichages : 2503
Taille : 71,4 Ko

    Le top ce serait que les codes "introuvables" soient exportés dans le log final

Discussions similaires

  1. Copier coller onglets en les nommant selon une liste
    Par manue87 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/07/2017, 18h27
  2. [AC-2010] erreur lors d'un copier-coller dans une liste déroulante d'un formulaire
    Par freeman3869 dans le forum Access
    Réponses: 11
    Dernier message: 19/05/2015, 14h59
  3. [AC-2007] Problème copier/coller d'une ligne excel
    Par christophe31 dans le forum VBA Access
    Réponses: 8
    Dernier message: 09/03/2010, 14h50
  4. Réponses: 8
    Dernier message: 11/12/2008, 19h10
  5. [VBA] Pb avec Copier/coller d'une feuille Excel
    Par sebastien_oasis dans le forum Excel
    Réponses: 3
    Dernier message: 14/12/2007, 11h08

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