.BAT > Recherche dossier et copie de fichier

Fermé
Albert49 - 6 août 2011 à 18:27
 habiteADurcy - 20 oct. 2021 à 11:58
Bonjour à tous,

Je cherche le code à écrire pour créer un fichier .bat qui ferait une recherche d'un dossier (qui peut être présent sur des lecteurs différents : soit le C, soit le D, soit ...)
Puis lorsqu'il me trouvera le dossier recherché, il me copiera un dossier (ou fichier) à l'intérieur de celui-là.

J'ai essayer plusieurs code trouvé sur internet mais rien n'a fonctionner comme je l'entendais.
J'avouerais que je ne vois pas bien comment écrire ce code, donc si quelqu'un pouvais prendre le temps de m'aider...

Je vous remercie d'avance !
A voir également:

17 réponses

cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
Modifié par cchristian le 17/08/2011 à 20:57
Bonjour,

Voici une nouvelle version du programme qui tient compte du problème relatif au dossier menu démarrer qu'il convient d'ignorer.
J'ai réalisé des tests qui m'ont semblé satisfaisants. Dis-moi ce que tu en penses de ton côté.

On a peut-être vaincu !

rem BUT DU PRESENT TRAITEMENT:        
rem RECHERCHER SUR DIFFERENTS LECTEURS UN DOSSIER AFIN D'Y MIGRER DES OBJETS        

rem SOUMISSION: Sous l'invite de commandes, après positionnement sur rem le répertoire qui le contient, taper le nom donné à ce fichier .bat, suivi    
rem des éventuels paramètresde passation; %1 à %n {voir plus bas}.        

  ECHO       OFF        
  SETLOCAL   ENABLEdelayedExpansion    ENABLEextensions        
  CLS        

  TITLE RECHERCHE DOSSIER ET COPIE DE FICHIERS.        
  ECHO _  &&   ECHO _        
  ECHO          RECHERCHE DOSSIER ET COPIE DE FICHIERS.        
  ECHO          --------------------------------------        
  ECHO _        
  ECHO %0      le %DATE%  a  %TIME%        
  ECHO _        

rem Préparation: Renseigner les variables :        
rem              Rep_a_Copier    avec le chemin du dossier à copier.        
rem  Si utilisation des paramètres %1 à %n ignorer ces 2 affectations:        
rem              Dos_Rech        avec le nom du dossier recherché.        
rem              Caracter_Lecteur avec les caractères identifiant les       
rem              lecteurs possibles.        

rem                      PARAMETRAGE DU TRAITEMENT.        
rem                      *************************        

rem Caractères identifiant chacune un lecteur possible:        
  SET "Caracter_Lecteur=ABCDEFGHIJKLMNOPQRSTUVWXYZ"        

rem Nom du dossier recherché {ici Mes documents}:        
  SET "Dos_Rech=Mes documents"        

rem Nom du dossier à copier:        
  SET "Rep_a_Copier=------------"        
  IF              "!Rep_a_Copier:~-1!"      ==       "\"            (        
       SET        "Rep_a_Copier=!Rep_a_Copier:~0,-1!"        )        

  SET          /A Nb_Exist         = 0        
  SET          /A Nb_Dos_Trouves   = 0        
  SET          /A Bypass_Dos       = 0        
  SET             "Bypass_nom_Dos="        
  SET          /A Indic_Pass_MD    = 0        

rem RECUPERATION DES EVENTUELS PARAMETRES DE PASSATION        
rem  {Si codés à la soumission}.        
rem **********************************************        

rem Récupération des caractères identifiant les lecteurs         
rem {Si codés en param. %1}.        
rem Ex: sous l'invite de commandes taper: Nom_de_ce_bat  CD        
rem     pour rechercher, sur les lecteurs C et D, le dossier "nom en dur" rem     dans ce pgm (ici Mes documents).        
rem     Pour une recherche sur tous les lecteurs "nom en dur" dans ce pgm        
rem      (ici Mes documents) taper: Nom_de_ce_bat  *        
  IF    NOT             "%1"      ==       ""                  (        
    IF  NOT             "%1"      ==       "*"               (        
     SET "Caracter_Lecteur=%1"                           ))        

rem Récupération du nom du dossier à rechercher         
rem {Si nom du dossier passé en        
rem paramètre{s} %2 à %n}.        
rem Ex: sous l'invite de commandes taper: Nom_de_ce_bat CD          
rem nom_entré_au_clavierpour rechercher, sur les lecteurs C et D,         
rem le dossier "nom entré auclavier" 
rem (par exemple: Nom_de_ce_bat  CD          
rem Mes documents).Pour une recherche sur tous les lecteurs définis         
rem taper: Nom_de_ce_bat *  nom_entré_au_clavier        

rem Récupération de l'éventuel 1er ou seul mot constituant le nom du         
rem dossier à rechercher (par exemple:  Mes   de Mes documents).        
  IF NOT    "%2"                  ==       ""                (        
     SET "Dos_Rech=%2"                                     )        
  SET     /A          Nb_PARAM     =      1        

rem Boucle de concaténation des éventuels mots suivants {max. 20}         
rem constituant le nom du dossier à rechercher (par exemple:        
rem documents   de Mes documents).        
:PROGRESS_PARAM        

  SHIFT        
  IF NOT    "%2"                  ==       ""                  (        
     SET             "Dos_Rech=!Dos_Rech! %2"           )        
  IF        !Nb_PARAM!            LSS     20                (        
     SET  /A          Nb_PARAM    +=      1        
     GOTO                               :PROGRESS_PARAM )        


rem AFFICHAGE A LA CONSOLE DES PARAMETRES DU TRAITEMENT.        
rem **********************************************        

  ECHO Nom du dossier recherche           : !Dos_Rech!        
  ECHO Lecteur{s} selectionne{s}          : !Caracter_Lecteur!        
  ECHO Nom du repertoire a copier         :        
  ECHO       !Rep_a_Copier!        
  ECHO _  &&   ECHO _        

rem                        RECHERCHE DU DOSSIER.        
rem                        ********************        

rem Boucle de validation des lecteurs concernés par la recherche.        
  FOR          /L         %%I   IN  (0, 1, 26)      DO               (        
     IF NOT         "!Caracter_Lecteur:~%%I,1!"    ==    ""     (        
        IF  EXIST   "!Caracter_Lecteur:~%%I,1!:\"                (        
           SET  /A    Nb_Exist         += 1        
           SET "Lecteur=!Caracter_Lecteur:~%%I,1!:\"        
           ECHO _  &&   ECHO _        
           ECHO Recherche du dossier: !Dos_Rech! sur Lecteur !Lecteur!        
           ECHO_____________________________________________        
           ECHO _        
           CD      /D  "!Lecteur!"        

           rem Boucle de recherche du dossier dans l'arborescence de       
           rem chaque lecteur validé.        
           FOR             /R            %%F  IN  (.)         DO   (        

rem          Recherche du libellé exact "Menu Démarrer": Pb. avec         
rem          accent é.        
rem ----------------------------------------------------------------     
rem  Le caractère "é" entré au clavier pour constituer la chaîne        
rem  "Menu démarrer" n'est semble-t-il pas identique à celui         
rem  constituant le nom "Menu Démarrer" du dossier à ignorer dans         
rem  l'arborescence. J'ai dû utiliser cet artifice afin de récupérer       
rem  le libellé "Menu démarrer" tel qu'il existe dans le nom des        
rem  dossiers à ignorer..        
             IF                !Indic_Pass_MD!        ==    0      (        
                 SET           "Prefix_Menu_D=%%~nF"        
                 SET           "Suffix_marrer=!Prefix_Menu_D:~-6!"        
                 SET           "Prefix_Menu_D=!Prefix_Menu_D:~0,-7!"        
                 IF            "!Prefix_Menu_D!"      ==    "Menu D"   (        
                    IF         "!Suffix_marrer!"      ==    "marrer" (        
                       SET     "Bypass_nom_Dos=%%~nF"        
                       SET /A   Indic_Pass_MD   =    1          ) ) )        
rem -------------------------------------------------------------------rem AUTRE POSSIBILITE:    
rem    Où bien tu peux renseigner la variable "Bypass_nom_Dos"    
rem    comme ci-dessous:    
rem     SET     "Bypass_nom_Dos=Menu D,marrer"    
rem     en procédant de la façon suivante:    
rem     Taper sur les touches du clavier correspondant aux    
rem      lettres: M e n u  D é{qui se traduira par une virgule}    
rem      m a r r e r. Dans ce cas la séquence précédente doit    
rem      être mise en commentaires {rem}.    
rem      SET "Bypass_nom_Dos=Taper ici le libellé: Menu Démarrer"    
rem      après avoir débloqué la ligne {retrait de rem}.    
rem -----------------------------------------------------------------    
        
rem     Localisation du dossier recherché.        
             IF            /I   "%%~nF"            ==  "!Dos_Rech!"   (        
                 SET       /A   Bypass_Dos       =    2        

rem     Recherche du dossier/répertoire à éliminer: "Menu démarrer".        
                 FOR       /F            %%J  IN   (        
                   'ECHO "%%F" ^| FIND "!Bypass_nom_Dos!"')   DO   (        
                    SET    /A   Bypass_Dos             =    1    )        

rem     Préservation du répertoire contenant le dossier recherché.        
                 IF             !Bypass_Dos!           ==   2       (        
                    SET    /A   Nb_Dos_Trouves    +=   1        
                    SET        "Chemin_Dos=%%F"        
                    SET        "Chemin_Dos=!Chemin_Dos:~0,-2!"        
                    ECHO        *** !Chemin_Dos!                 )        
                            
                 SET       /A   Bypass_Dos      =   0              )        
                                                                        ))))        

  ECHO _  &&   ECHO _        
          
rem              TRAITEMENT DES CAS D ANOMALIES ELEMENTAIRES.        
rem              *******************************************        

  IF        "!Caracter_Lecteur!"    ==      ""                     (        
     ECHO _        
     ECHO Aucun Lecteur n'a ete selectionne pour effectuer la recherche.        
     ECHO _        
     ECHO ******** TRAITEMENT IMPOSSIBLE *********        
     GOTO                                                  :FIN_TRT )        

  IF        "!Dos_Rech!"          ==      ""                        (        
     ECHO _        
     ECHO Aucun dossier de recherche n'a ete selectionne.        
     ECHO _        
     ECHO ******** TRAITEMENT IMPOSSIBLE *********        
     GOTO                                                  :FIN_TRT )        

  IF        !Nb_Dos_Trouves!      ==       0                        (        
   IF       !Nb_Exist!            ==       0                        (        
     ECHO _        
     ECHO Aucun lecteur: !Caracter_Lecteur! n'est connu du systeme.        
     ECHO _        
     ECHO ******** TRAITEMENT IMPOSSIBLE *********        
     GOTO                                                  :FIN_TRT )        
   IF  NOT  "!Dos_Rech!"          ==      ""                        (        
     ECHO _        
     ECHO Aucun dossier ne repond au patronyme: !Dos_Rech! :        
     ECHO _        
     ECHO ******** POURSUITE DU TRAITEMENT IMPOSSIBLE *********     ))        

  IF        !Nb_Dos_Trouves!      GTR      1                        (        
     ECHO _        
     ECHO !Nb_Dos_Trouves! dossiers repondent au patronyme: !Dos_Rech!        
     ECHO _        
     ECHO ******** POURSUITE DU TRAITEMENT IMPOSSIBLE *********     )        

rem                 COPIE DES OBJETS FICHIER OU DOSSIER.        
rem                 ***********************************        

  IF        !Nb_Dos_Trouves!      ==       1                        (        
     ECHO _        
     ECHO Copie du dossier :        
     ECHO    !Rep_a_Copier!        
     ECHO dans :        
     ECHO    !Chemin_Dos!        
     ECHO _        
rem  Dans le cas où un fichier seul serait à copier l'option /E ou     
rem  l'option /S créesraient une anomalie à l'exécution de      
rem  la commande XCOPY.        
rem  La séquence qui suit pallie à ce problème:        
     SET      "Opt_XCOPY=/E"        
     FOR             %%I       IN ("!Rep_a_Copier!")  DO            (        
        IF  NOT "%%~xI"              ==   ""                        (        
            SET  "Opt_XCOPY="                                       ))        
rem  Taper  HELP XCOPY  sous l'invite de commandes pour plus       
rem  d'informations.        
     XCOPY    "!Rep_a_Copier!"   "!Chemin_Dos!"   /F   /Y   !Opt_XCOPY!        
                                                                     )        
  ECHO _  &&   ECHO _        

:FIN_TRT        

  ENDLOCAL        
  PAUSE     
  GOTO                                                                   :EOF


Cordialement.
Cchristian.
3
habiteADurcy
20 oct. 2021 à 11:58
cool meme si tu parle pu sur cette appli
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
9 août 2011 à 01:37
Bonsoir,

Peux-tu apporter quelques éclaicissements sur ce que tu souhaites réaliser ?

Je cherche le code à écrire pour créer un fichier .bat qui ferait une recherche d'un dossier (qui peut être présent sur des lecteurs différents : soit le C, soit le D, soit ...)
Est-ce toujours le même dossier (le même nom) qui est recherché => Nom "en dur" ou nom entré en paramètre dans le programme ?
Ce dossier (ce nom de dossier) peut-il exister sur plusieurs lecteurs ? Ou est-il forcément unique tout lecteurs confondus ?

Puis lorsqu'il me trouvera le dossier recherché, il me copiera un dossier (ou fichier) à l'intérieur de celui-là.
Est-ce un fichier et un dossier qu'il convient de migrer alternativement où bien les deux conjointement dans le dossier cible (dossier précédemment recherché et trouvé ) ?
Là aussi, est-ce toujours le même dossier et/ou fichier (de même nom chacun) qui doit(vent) être migré(s) dans le dossier cible .
Dans le cas de copie d'un dossier, faut-il créer un sous-dossier dans le dossier cible ?

0
Bonjour cchristian,

Voilà les détails, j'espère que cela sera assez précis, dans tous les cas merci de ton aide !

1- Il s'agit toujours d'un même dossier (qui porte toujours le même nom) et qui peut être seulement dans un seul lecteur à la fois, soit le C soit le D, soit le F, ... Donc il est forcément unique dans tous les lecteurs confondus (hormis le CD-rom qui permet l''installation)

2- Ce qu'il faut migrer est un dossier qui contient plusieurs sous-dossier et/ou fichiers dans le dossier précedemment recherché et trouvé (voir 1). Evidemment il faudra copier le dossier et tout se qu'il contient.

3- Ce sera toujours le même dossier et tout se qu'il contient qu'il faudra copier. Rien ne changera de nom.

4- Il faudra créer le dossier et se qu'il contient comme tel dans le dossier désigné en 1.

-----

En image peut-être cela est plus parlant, je schématise se que j'entend :

I) Sur un DVD ou Clef USB je souhaite copier le dossier :
X:\Dossier 0\Dossier à copier\...

*(le "Dossier 0" étant un sous-dossier que je ne souhaite pas créer mais où se trouve juste après le dossier que je souhaite créer et tout se qu'il contient.)

II) Le dossier contenu dans le DVD ou clef USB doit être copier dans un dossier spécifique du disque dur C ou D ou Z,... :

D (ou C, ou Y) :\Dossier 4\Dossier receveur\...

* (le "Dossier receveur" étant là ou le dossier et se qu'il contient doit finir, tel quel et sans changement de nom ou autre)


Voilà en espérant que cela soit relativement clair...

Merci encore !
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
Modifié par cchristian le 10/08/2011 à 03:05
Bonsoir,

Je te propose ce qui suit qui je l'espère répondra à ton attente. Dis moi ce que tu en penses, il y a certainement des choses à préciser. J'ai pas mal testé cette procédure mais je ne prétends pas avoir tout cerné. Bon courage !

rem BUT DU PRESENT TRAITEMENT:
rem RECHERCHER SUR DIFFERENTS LECTEURS UN DOSSIER
rem AFIN D'Y MIGRER DES OBJETS

rem SOUMISSION: Sous l'invite de commandes, après positionnement sur
rem le répertoire qui le contient, taper le nom donné à ce fichier .bat, suivi
rem des éventuels paramètresde passation; %1 à %n {voir plus bas}.

ECHO OFF
SETLOCAL ENABLEdelayedExpansion ENABLEextensions
CLS

TITLE RECHERCHE DOSSIER ET COPIE DE FICHIERS.
ECHO _ && ECHO _
ECHO RECHERCHE DOSSIER ET COPIE DE FICHIERS.
ECHO --------------------------------------
ECHO _

rem Préparation: Renseigner les variables :
rem Dos_a_Copier avec le chemin du dossier à copier.
rem Si utilisation des paramètres %1 à %n ignorer ces 2 affectations:
rem Dos_Rech avec le nom du dossier recherché.
rem Caracter_Lecteur avec les caractères identifiant les lecteurs
rem possibles.

rem PARAMETRAGE DU TRAITEMENT.
rem *************************

rem Caractères identifiant chacun un lecteur potentiel:
SET "Caracter_Lecteur=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
rem test effectué avec un seul lecteur :
rem SET "Caracter_Lecteur=C"
rem test effectué avec deux lecteurs :
rem SET "Caracter_Lecteur=CD"
rem ect........

rem Nom du dossier recherché {ici Mes documents}:
rem + Tests effectués avec divers noms de dossiers.
SET "Dos_Rech=Mes documents"

SET "Dos_a_Copier=*****"
rem Test effectué sur un dossier AAA avec 1 niveau d'arborescence :
rem SET "Dos_a_Copier=C:\Docum... and ...\utilis..\Mes documents\AAA\"
rem Test effectué sur 1 dossier a1 avec plusieurs niveaux d'arborescence :
rem SET "Dos_a_Copier=C:\Documents and ..\utilis...\Mes documents\a1"
rem Test effectué sur un fichier seul :
rem SET "Dos_a_Copier=C:\Doc... and ..\utilis...\Mes documents\fich.doc"
rem Test effectué sur le lecteur E:\
rem BAT est constitué de plusieurs fichiers:
rem SET "Dos_a_Copier=E:\BAT"

IF "!Dos_a_Copier:~-1!" == "\" (
SET "Dos_a_Copier=!Dos_a_Copier:~0,-1!" )

SET /A Nb_Exist = 0
SET /A Nb_Dos_Trouves = 0


rem RECUPERATION DES EVENTUELS PARAMETRES DE PASSATION
rem {Si codés à la soumission}.
rem **************************************************

rem Récupération des caractères identifiant les lecteurs
rem {Si codés en param. %1}.
rem Ex: sous l'invite de commandes taper: Nom_de_ce_bat CD
rem pour rechercher, sur les lecteurs C et D, le dossier "nom en dur" rem dans ce pgm (ici Mes documents).
rem Pour une recherche sur tous les lecteurs "nom en dur" dans ce pgm
rem (ici Mes documents) taper: Nom_de_ce_bat *
IF NOT "%1" == "" (
IF NOT "%1" == "*" (
SET "Caracter_Lecteur=%1" ))

rem Récupération du nom du dossier recherché {Si nom du dossier passé en
rem paramètre{s} %2 à %n}.
rem Ex: sous l'invite de commandes taper: Nom_de_ce_bat CD
rem nom_entré_au_clavier
rem pour rechercher, sur les lecteurs C et D, le dossier "nom entré au
rem clavier" (par exemple: Nom_de_ce_bat CD Mes documents).
rem Pour une recherche sur tous les lecteurs définis taper:
rem Nom_de_ce_bat * nom_entré_au_clavier

rem Récupération de l'éventuel 1er ou seul mot constituant le nom du
rem dossier à rechercher (par exemple: Mes de Mes documents).
IF NOT "%2" == "" (
SET "Dos_Rech=%2" )
SET /A Nb_PARAM = 1

rem Boucle de concaténation des éventuels mots suivants {max. 20}
rem constituant le nom du dossier à rechercher
rem (par exemple: documents de Mes documents).
:PROGRESS_PARAM

SHIFT
IF NOT "%2" == "" (
SET "Dos_Rech=!Dos_Rech! %2" )
IF !Nb_PARAM! LSS 20 (
SET /A Nb_PARAM += 1
GOTO :PROGRESS_PARAM )


rem AFFICHAGE A LA CONSOLE DES PARAMETRES DU TRAITEMENT.
rem ***********************************************

ECHO Nom du dossier recherche : !Dos_Rech!
ECHO Lecteurs possibles : !Caracter_Lecteur!
ECHO Nom du repertoire/fichiers a copier:
ECHO !Dos_a_Copier!
ECHO _ && ECHO _

rem RECHERCHE DU DOSSIER.
rem ********************
rem Boucle de validation des lecteurs concernés par la recherche.
FOR /L %%I IN (0, 1, 26) DO (
IF NOT "!Caracter_Lecteur:~%%I,1!" == "" (
IF EXIST "!Caracter_Lecteur:~%%I,1!:\" (
SET /A Nb_Exist += 1
SET "Lecteur=!Caracter_Lecteur:~%%I,1!:\"
ECHO _ && ECHO _
ECHO Recherche du dossier: !Dos_Rech! sur le Lecteur valide !Lecteur!
ECHO ___________________________________________________
ECHO _
CD /D "!Lecteur!"
rem Boucle de recherche du dossier dans chaque lecteur validé.
FOR /R %%F IN (.) DO (
IF /I "%%~nF" == "!Dos_Rech!" (
SET /A Nb_Dos_Trouves += 1
SET "Chemin_Dos=%%F"
SET "Chemin_Dos=!Chemin_Dos:~0,-2!"
ECHO *** !Chemin_Dos! )))))

ECHO _ && ECHO _

rem TRAITEMENT DES CAS D'ANOMALIES ELEMENTAIRES.
rem ***************************************

IF "!Caracter_Lecteur!" == "" (
ECHO _
ECHO Aucun Lecteur n'a ete selectionne pour effectuer la recherche.
ECHO _
ECHO ******** TRAITEMENT IMPOSSIBLE *********
GOTO :FIN_TRT )

IF "!Dos_Rech!" == "" (
ECHO _
ECHO Aucun dossier de recherche n'a ete selectionne.
ECHO _
ECHO ******** TRAITEMENT IMPOSSIBLE *********
GOTO :FIN_TRT )

IF !Nb_Dos_Trouves! == 0 (
IF !Nb_Exist! == 0 (
ECHO _
ECHO Aucun lecteur: !Caracter_Lecteur! n'est connu du systeme.
ECHO _
ECHO ******** TRAITEMENT IMPOSSIBLE *********
GOTO :FIN_TRT )
IF NOT "!Dos_Rech!" == "" (
ECHO _
ECHO Aucun dossier ne repond au patronyme: !Dos_Rech! :
ECHO _
ECHO ******** POURSUITE DU TRAITEMENT IMPOSSIBLE ))

IF !Nb_Dos_Trouves! GTR 1 (
ECHO _
ECHO !Nb_Dos_Trouves! dossiers repondent au patronyme: !Dos_Rech!
ECHO _
ECHO ******** POURSUITE DU TRAITEMENT IMPOSSIBLE )

rem COPIE DES OBJETS FICHIER OU DOSSIER.
rem ***********************************

IF !Nb_Dos_Trouves! == 1 (
ECHO _
ECHO Copie du dossier :
ECHO !Dos_a_Copier!
ECHO dans :
ECHO !Chemin_Dos!
ECHO _
rem Dans le cas où un fichier seul serait à copier l'option /E ou l'option /S
rem créeraient une anomalie à l'exécution de la commande XCOPY.
rem La séquence qui suit pallie à ce problème:
SET "Opt_XCOPY=/E"
FOR %%I IN ("!Dos_a_Copier!") DO (
IF NOT "%%~xI" == "" (
SET "Opt_XCOPY=" ))
rem Taper HELP XCOPY sous l'invite de commandes pour plus
rem d'informations.
XCOPY "!Dos_a_Copier!" "!Chemin_Dos!" /F /Y !Opt_XCOPY!
)
ECHO _ && ECHO _

:FIN_TRT

ENDLOCAL
GOTO :EOF


Cordialement.
Cchristian.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour CChristian,

Tout d'abord un grand merci à toi ! Je n'aurais jamais songé à un code aussi difficile et aussi long. Sans ton aide je n'aurais jamais pu l'écrire. Chapeau l'artiste !

Donc avec impatience j'ai testé ce petit bout de code et il s'avère fonctionnel !

Il me cherche sur tous les lecteurs le dossier cible et me copie les dossiers et fichiers du dossier que je lui ai indiqué.

Il y a juste 3 points à régler, mais celà est de ma faute car j'ai omis d'en parler (à vrai dire je n'y avais pas pensé sur le moment, c'est lors des tests que je me suis rendu compte) :

1) Lorsque je lance le ".bat" il me repère également le dossier présent dans le menu programme du menu démarré. Celui-ci ayant été créé préalablement, est-il possible de désactiver la prise en compte des dossiers du menu démarré ?

2) Ainsi en rapport avec le problème 1, il me repère le dossier également présent dans le dossier où se trouve le dossier à installer : par exemple le DVD ou la clef USB, qui porte le même nom de dossier que celui à installer. Je suis d'accord que celà n'est qu'un problème de nom, mais par un soucis de repérage je préfèrerais régler ces 2 premiers problèmes, d'autant plus si cela est possible...

3) Ce n'est pas un réel problème, disons plutôt que c'est la cerise sur le gâteau pour atteindre le Nirvana : Comment fait-on pour que le dossier à copier du DVD ou de la clef USB sois pris en compte dès sa rascine ? Par exemple dans le dossier "X1" soit copier tel quel avec tout se qu'il contient ? Dans mes tests il copiait se qu'il y avait à l'intérieur mais pas le fichier contenant avec. Celà n'est réellement pas un problème, mais je préfère en parler...

Dans tout les cas : encore merci de ta patience et de ton ingéniosité !
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
11 août 2011 à 03:47
Bonsoir,

3) Ce n'est pas un réel problème, disons plutôt que c'est la cerise sur le gâteau pour atteindre le Nirvana : Comment fait-on pour que le dossier à copier du DVD ou de la clef USB sois pris en compte dès sa rascine ? Par exemple dans le dossier "X1" soit copier tel quel avec tout se qu'il contient ? Dans mes tests il copiait se qu'il y avait à l'intérieur mais pas le fichier contenant avec. Celà n'est réellement pas un problème, mais je préfère en parler...
Je ne suis pas bien certain de comprendre ce que tu veux dire par:
Par exemple dans le dossier "X1" soit copier tel quel avec tout se qu'il contient ? Dans mes tests il copiait se qu'il y avait à l'intérieur mais pas le fichier contenant avec

Si on raisonne sur l'exemple présent dans ton second message:
I) Sur un DVD ou Clef USB je souhaite copier le dossier :
X:\Dossier 0\Dossier à copier\...

Je présume que pour obtenir la copie de "dossier à copier" tu aurais renseigné dans le .bat la variable "Dos_a_Copier" de la façon suivante:
SET "Dos_a_Copier=X:\Dossier 0\Dossier à copier\"
Le résultat aurait eu pour effet de copier le contenu de "Dossier à copier" (fichiers et arborescence éventuelle) dans le dossier "recherché/trouvé" sans qu'apparaisse le nom "Dossier à copier" dans l'arborescence du dossier "recherché/trouvé".
C'est ce que tu sembles regretter si j'ai bien compris.

Mais tu écris :
2) Ainsi en rapport avec le problème 1, il me repère le dossier également présent dans le dossier où se trouve le dossier à installer : par exemple le DVD ou la clef USB, qui porte le même nom de dossier que celui à installer...........
Je ne comprends plus, apparemment ils ont le même nom. Ce qui ne règle pas le problème no 2 je suis d'accord mais puisque les noms sont identiques le problème no 3 semble tomber de fait. A charge de régler le problème no 2 bien entendu.
Pour le régler ce problème no 2 il suffit de retirer de la liste des lettres identifiant les lecteurs soit:
SET "Caracter_Lecteur=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
celles qui correspondent au lecteur DVD et à la clé USB.
Une fois ces lettres retirées la recherche ignorera ces deux lecteurs et donc ce qu'ils contiennent.

En ce qui concerne le premier problème cela fait quatre heures que je planche dessus et je n'ai toujours pas de solution.

Merci pour les éloges, mais je ne sais pas si je les mérite............
0
Bonjour,

Merci pour tes réponses toujours aussi rapides.
Pour les points 2 et 3 j'ai eu mes réponses. Désolé d'avoir du mal à exprimer ce que je souhaiterais, je commence depuis peu à manipuler les .bat. C'est très interessant et vraiment utile, mais lorsque l'on ne peut pas mettre la main sur le code à taper on taperait bien sur quelque chose d'autre...

Pour le problème du nom dans le menu démarrer, j'ai fait des recherches sur internet mais je n'ai rien trouvé là dessus... Mais j'ai pensé, si tu ne trouves pas un moyen pour exclure automatiquement les dossiers du menu démarré, peut être est-ce possible d'avoir un menu de choix lorsque que le .bat trouve différents fichiers identiques? Dans notre cas, soit on installe dans le menu démarrer soit on installe dans le dossier présent sur le disque dur.
Ce n'est pas l'idéal, mais c'est une solution. Sans cela la fenêtre se ferme et rien n'est copier...

Nous vaincrons !

Merci encore pour se fastidieu travail...
0
HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016 1 608
12 août 2011 à 02:19
Bonsoir,

Pour repérer un dossier du menu démarrer, pourquoi ne pas filtrer sur le dossier du menu démarrer, justement ? (de mémoire dans Documents and Settings sur XP - possibilité de récupérer dans une variable le type d'OS et adapter la localisation du menu démarrer en fonction de cela)
0
Bonjour HostOfSeraphim,

Merci pour ton conseil, je vais faire des recherches là dessus : je ne m'y connais pas encore beaucoup en .bat, mais à force d'en manipuler ça va finir par passer...
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
Modifié par cchristian le 12/08/2011 à 16:01
Bonjour HostOfSeraphim

C'est ce que j'ai fait; Filtrage des dossiers sur le critère "menu démarrer" susceptible d'être présent dans chaque répertoire accédé avec cette commande:

FOR /F %%I IN (' ECHO "%%F" ^| FINDSTR /I "!Bypass_nom!" ') DO (

. Outre un problème de test d'égalité lié à l'accent aigü du é du libellé "Menu démarrer" entré au clavier (libellé contenu dans la variable Bypass_nom) et le même ? ? ? libellé ("Menu démarrer") identifiant un dossier faisant partie d'un répertoire à ignorer (répertoire Menu démarrer donc) lu par la commande,
FOR /R %%F IN (.) DO (
le temps d'exécution déjà long sans la commande FOR ...... FINDSTR ci dessus a été multiplié au bas mot par 10 et je n'exagère pas. J'ai soumis une exécution sur un seul lecteur il y a plus de 15 mn et je n'ai toujours pas le résultat)

Merci sincèrement pour ton intervention, Si tu as d'autres idées n'hésite surtout pas.

Nous vaincrons comme l'écrit si bien Albert49.

Cordialement,
Cchristian.
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
12 août 2011 à 01:18
Bonsoir,

Désolé mais je n'ai rien trouvé de satisfaisant concernant le problème lié au dossier présent dans le menu démarrer qu'il convient d'ignorer. Je continue à chercher de mon côté. Je te tiens informé.

Nous vaincrons, certes mais ce ne sera pas dans l'immédiat.
0
Bonjour CChristian,

Pas de soucis, ce n'est pas dans l'immédiat, tu m'as déjà beaucoup aidé.
J'ai beau surfé sur le net, il y a peu de page qui parle de la manière à s'y prendre...
Tu cherches par toi même où tu a des références quelque part ?

Bon weekend.
A bientôt.
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
Modifié par cchristian le 12/08/2011 à 22:18
Bonjour Albert49,

Le problème est peut-être un peu trop spécifique pour le trouver sur Internet. En fait il s'agit d'ignorer toute une (ou plutôt tout le reste d'une) arborescence d'un répertoire constitué de plusieurs dossiers dont l'un à pour nom "Menu démarrer".
Les dossiers constituant les répertoires sont organisés de manière hiérarchique (parent - enfants). la commande DOS de lecture :
FOR /R %%F IN (.) DO (
parcourt l'arborescence en délivrant un à un les noms de répertoires représentés par une concaténation progressive des noms des dossiers le constituant (un chemin hiérarchique en fait):
C:\......................?.......................
C:\dossier1\...............?...................
C:\dossier1\dossier2\........?.............

|C:\   lecture1:     C:\.?....................... 
| 
|___dossier1  lecture2:     C:\dossier1\.?................... 
|    | 
|    |___dossier2   lecture3: C:\dossier1\dossier2\.?............. 
|          | 
|          |........?.............  
| 
|___...... 

ce qui fait qu'à l'issue de chaque nouvelle lecture (FOR) la logique d'exécution du programme ne peut connaître les dossiers éventuellement restants dans l'arborescence du répertoire en cours de traitement.
Une fois identifié le dossier recherché (en l'occurrence le dossier "Menu démarrer") il serait aisé pour le programme d'ignorer les dossiers éventuellement restants:
|C:\                    lecture1:      
| 
|___dossier1        lecture2:       
|    | 
|    |___dossier2   lecture3:       
|          | 
|          |___Menu démarrer   lecture4: 
|                | 
|                |........?.............  
| 
|___...... 
si une indication (une valeur d'un code retour) existait pour formaliser la fin d'une arborescence.

comme il semble qu'il n'existe pas de code retour indiquant, après chaque la lecture, un changement de niveau hiérarchique (parent - enfants) il m'apparaît bien difficille de régler le problème de manière satisfaisante en programmation (Voir ci-dessus la réponse faite à HostOfSeraphim) MAIS.....
nous vaincrons !

Je profite de l'occasion pour interpeler la sagacité des membres de CCM sur ce sujet.

BON WEEK END.

Cordialement.
Cchristian.
0
Bonjour Cchristian,

Désolé de répondre aussi tard, j'ai dû m'absenter pendant quelques jours.

Je test le nouveau programme que tu viens de me transmettre et te donne les nouvelles !

Merci encore !
0
Re-bonjour Cchristian,

Je crois bien que tu as vaincu !

J'ai testé ton programme et il semble effectuer ce que je rêvais.
Cependant, lorsqu'il cherche des dossiers ou fichiers, il indique :

Recherche du dossier : XXX sur lecteur C:\
'ECHO________________________________________________' n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes.

...cela à chaque fois qu'il cherche sur un lecteur.
Est-ce normal ou est-ce une erreur de ma part ?
Mais cela n'empêche pas le programme d'être fonctionnel, donc rien d'important.

Vraiment du joli travail... j'espère que cela ne t'as pas donné quelques migraines !

Par ailleurs, comment fait-on pour mettre ce sujet sur résolu ? Ca pourra certainement servir à d'autres...
0
Logitux Messages postés 102 Date d'inscription lundi 30 mai 2011 Statut Membre Dernière intervention 28 septembre 2011 8
Modifié par Logitux le 17/08/2011 à 09:08
Bonjour,
Il manque un espace après ECHO
Pour marquer résolu, tu remontes sur ton premier message du topic et tu as un lien "marquer comme résolu" juste en dessous du titre.
0
Salut Logitux,
Je n'ai pas accès au lien "marquer comme résolu", cela est sans doute dû au faite que je suis un utilisateur non enregistré...
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
17 août 2011 à 15:14
Bonjour Albert49,

Je vois que toi aussi tu es un couche tard (ou tôt). Hier j'étais fatigué, à deux heures (du matin) j'étais déjà au lit. Mais non, aucune migraine le sujet était intéressant et je n'avais encore jamais eu l'occasion de traiter un problème concernant l'identification des dossier en DOS.

Finalement la solution au problème était simple (Je coinçais sur un problème d'optimisation du temps de traitement):
Puisque, dans chaque répertoire/chemin contenant le dossier recherché, le dossier à éliminer se trouve situé nécessairement AVANT celui recherché (puisque le dossier à éliminer contient celui recherché) , il suffisait, dans un premier temps, de localiser les dossiers recherchés dans les répertoires/chemins concernés (répertoires Menu démarrer et le seul valide (ou d'autres si anomalie)). Une fois un dossier recherché localisé une recherche dans la partie générique (ensemble des dossiers situés dans le répertoire/chemin AVANT celui recherché/trouvé) doit s'effectuer afin de localiser la présence éventuelle d'un (nom de) dossier à éliminer
(ici "Menu Démarrer"). Si ce dossier existe le répertoire est ignoré.

En ce qui concerne la commande ECHO et le message d'anomalie qui l'accompagne, il manque en effet un espace après ECHO comme Logitux l'a écrit. J'ai dû remanier plusieurs lignes de code et de commentaire dont le texte apparaissait coupé sur deux lignes. Je ne suis d'ailleurs pas parvenu à régler tous les problèmes de mise en page comme tu as dû certainement t'en apercevoir.

A bientôt peut-être sur CCM, bon courage !
0
Bonjour Cchristian,

Oui, j'aime errer dans la nuit, c'est calme et cela me permets de me concentrer sur ce que je fais.

J'ai testé à le programme à plusieurs reprises : Il fonctionne à merveille.
Je l'ai décortiqué afin d'essayer d'en comprendre un bout, ainsi je me cultive sur la création de .bat. Cependant, je ne vois pas bien l'utilisation des parenthèses en fin de ligne dans le programme. Je n'ai jamais vu cela auparavant : elles ont quelles fonctions ?

Merci.
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
Modifié par cchristian le 19/08/2011 à 02:08
Bonjour Albert49,

A chaque parenthèse ouvrante "(" d'une commande DOS doit correspondre une parenthèse fermante ")" ex. d'un IF :

IF   !....!               ==       ...    ( 
      SET  /A   rien =  .  
      ....................... 
      .......................                )

Elles délimitent la portée de la commande. En d'autres termes elles encadrent une séquence d'instructions subordonnées à la commande.
J'ai pris pour habitude de positionner les parenthèses en bout de ligne afin qu'elles soient plus (l)(v)isibles. En conséquence, si pour une même commande (le IF précédent par exemple) il existe d'autres commandes fonctionnellement subordonnées à la commande de niveau supérieur (ici la condition posée par le test) et utilisant aussi dans leur syntaxe des parenthèses "( et )" elles s'inscriront dans le corps de la (ou des) commande(s) de niveau supérieur. Il y aura donc deux parenthèses supplémentaires par commande( à insérer dans notre IF) dont la syntaxe requiert des parenthèses.

IF   !....!               ==       ...    ( 
      SET  /A   rien =  .  
      FOR   /F     %%I        IN         (.........)   DO   ( 
           .................... 
           ....................                                      ) 
     .......................                )


Dans le cas qui nous intéresse:

  FOR          /L         %%I   IN  (0, 1, 26)      DO        1( 
     IF NOT         "!Caracter_Lecteur:~%%I,1!"    ==    ""        2( 
        IF  EXIST   "!Caracter_Lecteur:~%%I,1!:\"                   3( 
           SET  /A    .......... 
             FOR             /R            %%F  IN  (.)         DO       4( 
             SET      .......... 
             IF            /I   "%%~nF"               ==  "!Dos_Rech!"   5( 
                 SET       ........... 
                 FOR       /F            %%J  IN   ( 
                   'ECHO   .....   "%%F" ^| FIND "......."')   DO  6( 
                    SET    ...........                             6) 
                 IF             !Bypass_Dos!           ==   2         6( 
                    ECHO   ............                                    6) 

                 SET       ...........                                             5) 
                                                               4)3)2)1)


Désolé pour la mise en page !
Dans la séquence de commandes DOS ci-dessus, j'ai numéroté de 1 à 6 les couples de parenthèses ouvrantes et fermantes en fonction du niveau hiérarchique (niveau d'imbrication) occupé dans l'algorithme par la commande à laquelle est associé chaque couple de parenthèses. Le chiffre 1 correspond au niveau hiérarchique le plus élevé, alors que le chiffre 6 correspondant au niveau hiérarchique le plus bas.
(niveau 6) : il y a 2 commandes de même niveau)
Je me rappelle un texte écrit il y a quelques temps déjà, j'en insère, de mémoire, une partie remanié dans cette petite explication :
Sur le plan fonctionnel/pratique ce que j'appelle un niveau hiérachique ne doit pas être évalué en termes de supériorité ni d'infériorité, relativement à un autre niveau hiérachique compris dans un même algorithme, mais bien plutôt en termes d'ascendance ou de descendance donc de complémentarité.

Est-ce que tout ceci répond à ton interrogation ?

Cordialement.
Cchristian.
0
CLBO Messages postés 1 Date d'inscription lundi 20 janvier 2014 Statut Membre Dernière intervention 20 janvier 2014
20 janv. 2014 à 17:39
Bonjour
je viens de consulter l'échange avec Albert et le petit programme que vous avez fait est a peu prêt ma recherche mais je viens de me rendre compte que j'ai bien perdu en programmation dos .
Une véritable catastrophe !!!!!!!!!!. peut être pouvez vous m'aider
j'aimerai rechercher un fichier dans l'ensemble des disques dur qui se nomme pour mon cas
GestC.mdb et le copier dans un répertoire qui vient d'être créer au lancement du .bat .
Pour exemple : MD SAUVEGARDE

Le 1er problème que je rencontre et l'arrêt de la recherche si une lettre du lecteur n'existe pas et il faut faire continuer sous win xp.

le 2eme problème est qu'il peut exister plusieurs fichier recherchés GestC.mdb .Est il possible de les renommer en GestC.mdb.1 GestC.mdb.2 a la copie dans SAUVEGARDE .
Je viens de faire des essais durant 3 heures mais le résultat est nul .

Pouvez vous m'aider car depuis 2011 que date vos échanges vous avez peut être abandonné le dos .

merci d'avance
claude
0
Merci bien,
Je pense avoir compris l'utilisation de ces signes. Ton programme est une mine d'or, j'en aurai appris avec tes lumières !

Allez, je ne te monopolise pas plus, en tout cas merci encore pour toutes tes aides fort utiles !

A bientôt, enfin pas trop vite, car cela voudra dire que j'aurais encore des problèmes.
0
bonjour.
je souhaite poser un problème qui me pertube. en effet j'ai un script batch que je souhaite lancer en tant qu'administrateur mais lorsque j'execute le schell en mode admin il ne trouve plus le lien des différents fichiers du Script.
je souhaite savoir s'il existe une commande pour récupérer le l'endroit de location d'un fichier?
0