Partage
  • Partager sur Facebook
  • Partager sur Twitter

BATCH Resultat de lecture en variable

Utiliser le contenu d'un fichier comme variable

Sujet résolu
    9 novembre 2017 à 0:07:22

    Bonjour, bonsoir,

    Mon but: faire en sorte que dès qu'un dossier a une date de modification avec un écart de moins d'une minute (par rapport a l'heure actuelle) il soit copié collé ailleurs.

    Mon plan: faire tourner un batch en permanence qui vérifie les dates de modifications et qui les compare a l'heure actuelle et qui copie colle en fonction. Je parviens a copier coller ailleurs mais uniquement si je met le nom du dossier dans le code ce qui n'a pas d'interet. Je souhaiterai que cela se fasse automatiquement, j'imagine qu'il faut tout betement stocker le nom du dossier qui a été modifier il y a moins d'une minute dans une variable mais je ne sais pas comment m'y prendre.

    Mon soucis: Je ne sais pas comment verifier les dates de modifications de tous les dossiers présent dans le dossier parent et deplacer uniquement le dossier qui à une date de modification inferieure a 1 minute.

    Je me penche vers vous, si vous pouvez m'aiguiller, d'avance je vous en remercie.

    J’espère également être dans la bonne section.

    Merci de m'accorder votre temps.

    • Partager sur Facebook
    • Partager sur Twitter
      9 novembre 2017 à 9:47:52

      Bonjour,

      Peut-on avoir le code que tu as déjà fait ?

      Pour vérifier la date, je pense que la commande forfiles t'aidera.

      Oui tu es dans la bonne section ;)

      • Partager sur Facebook
      • Partager sur Twitter
        9 novembre 2017 à 20:35:45

        Je n'ai pas accès à l'ordinateur qui contient le code mais j'ai utilisé Xcopy pour copier les dossiers. Mais rien qu'en en parlant je me rends compte que je ne dois pas récupérer le nom de dossier mais leurs chemin si la date de modification est inférieure à une minute.

        Je vais me pencher sur le forfiles, merci de ton aide. Je pense reprendre de 0 pour que cela soit plus propre.

        • Partager sur Facebook
        • Partager sur Twitter
          10 novembre 2017 à 21:59:06

          J'ai utilisé forfiles et tant pis j'aurai une actualisation toutes les 24h ce n'est pas grave 

          Cependant je ne sais pas comment mettre en variable le nom du dossier qui répond au paramètre qui est "dater de moins d'un jour" dans la commande Xcopy du forfiles

          Xcopy c:\mondossier\nomdudossier c:\destinatiin\nomdudossier

          Merci d'avance !

          • Partager sur Facebook
          • Partager sur Twitter
            11 novembre 2017 à 11:21:09

            Bonjour,

            Puis-je avoir le code ? ça sera beaucoup plus simple pour t'aider

            • Partager sur Facebook
            • Partager sur Twitter
              13 novembre 2017 à 15:49:34

              Salut,

              j'ai presque terminé ce que je voulais, mon code est tout crado c'est pour ca que je ne l'envoie pas j'ai un peu honte ^^

              Le principal est fait

              J'ai listé le contenu du dossier, tout mis dans une variable et je n'ai pris que la 4 ème colonne pour n'avoir que les noms seul soucis les noms sont sous la forme "fichier.txt  " au lieu de "fichier.txt" Je cherche a enlever les espaces. Comme les noms sont sauvegardés dans un fichier je pensais supprimer tous les espaces de ce fichier. J'ai vu des solutions sur google mais je ne les comprends pas et ne veut pas copier sans comprendre.

              Si tu pouvais me l'expliquer ca serait tres aimable a toi, bonne soirée. 

              J'ai réussi a faire tout ce que je voulais je n'ai plus qu'a faire en sorte qu'un fichier soit copier si il comporte une chaine de caractere spécifique

              -
              Edité par AntoineThec 13 novembre 2017 à 16:44:46

              • Partager sur Facebook
              • Partager sur Twitter
                13 novembre 2017 à 16:58:25

                Salut,

                "J'ai réussi a faire tout ce que je voulais je n'ai plus qu'a faire en sorte qu'un fichier soit copier si il comporte une chaine de caractere spécifique"

                Regarde du côté de la commande findstr.

                Un truc comme ceci :

                findstr /C:"chaine de caractere a rechercher" "chemin\fichier.ext">nul 2>&1
                if %errorlevel% EQU 0 (xcopy "chemin\fichier.ext" "destination\fichier.ext)



                • Partager sur Facebook
                • Partager sur Twitter
                  13 novembre 2017 à 17:20:01

                  Super je jette un oeil sur ca, j'espere ne pas abuser en te posant une autre question, j'utilise forfile avec Xcopy mais la ! soucis ! en effet 

                  forfiles /p "C:\bla bla\blublu" /d -1 /c "Xcopy "chemin1" "chemin2"" je suis obligé d'utiliser des " car mes chemins comporte des espaces.

                  Cependant je ne peux pas mettre de guillemets elle interagissent avec les guillemets qui servent a delimiter la commande.

                  D'avance je te remercie

                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 novembre 2017 à 19:34:55

                    Bonjour,

                    Essaye ceci : 

                    forfiles /p "C:\bla bla\blublu" /d -1 /c "Xcopy 0x22chemin10x22 0x22chemin20x22"

                    0x22 représente un guillemet (") en héxadécimal.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 novembre 2017 à 14:21:16

                      Je ne parviens réellement pas a utiliser findstr, je pense que cela vient du fait que j'ai des espaces dans mon chemin mais meme avec des guillemets  ca ne le fait pas. Je vais essayer pour le forfiles mais finalement je n'en ai pas besoin car avec xcopy j'ai une option gere si l'element est plus ou moins recent finalement.

                      Le soucis c'est que meme si le mot clé n'est pas présent l'action est exécutée autant de fois qu'il y a de fichiers.

                      Merci d'avance

                      findstr /C:"motclef" "C:\blabla blublu\chemin\fichier.ext">nul 2>&1
                      if %errorlevel% EQU 0 (echo "motclef détecté")
                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 novembre 2017 à 19:32:51

                        Bonsoir,

                        chez moi ces deux lignes fonctionne, tu dois avoir une erreur autre part dans ton code.

                        Si le findstr est dans un "bloc" (plusieurs lignes entre parenthèse) dans ce cas il faut activer l'expansion retardée de variable

                        -
                        Edité par Zaibai 14 novembre 2017 à 19:33:54

                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 novembre 2017 à 18:58:58

                          oui le findstr est dans les commandes de la boucle, il me semble que j'ai déja ajouté la ligne mais je n'en suis pas certain je verifie demain, merci pour ton aide.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            3 décembre 2017 à 14:44:31

                            Bonjour,

                            Je remonte le sujet car j'ai réalisé ce que tu demande.

                            Les deux scripts ci-dessous, copie les dossiers ou fichiers qui ont été modifié le jour même à partir de %folder_source% (et ces sous-dossiers) vers %folder_destination%.

                            Pour les dossiers (lors de la copie d'un dossier, seul les fichiers sont copié, pas les sous dossiers) :

                            @echo off
                            setlocal EnableDelayedExpansion
                            Title Checks the last modified date of the folders for the copy
                            
                            ::::::::::::: VARIABLE A MODIFIER :::::::::::::
                            	REM Correspond au dossier source
                            	set folder_source=D:\test1
                            	
                            	REM Correspond au dossier de destination
                            	set folder_destination=D:\test2
                            ::::::::::::: VARIABLE A MODIFIER :::::::::::::
                            
                            REM enlève le "\" de fin des variables folder_source et folder_destination si présent
                            If "%folder_source:~-1%"=="\" set folder_source=%folder_source:~0,-1%
                            If "%folder_destination:~-1%"=="\" set folder_destination=%folder_destination:~0,-1%
                            
                            cd /D "%folder_source%"
                            echo.
                            
                            :loop
                            cls
                            set /a copieON=0
                            
                            REM récupère chemin/nom/dernière heure de modification des dossiers qui ont été modifié le jour même à partir de folder_source et de ces sous-dossiers (exclusions des dossiers et sous dossiers de %folder_destination%)
                            for /F "tokens=1,2,3 delims=||" %%a in ('forfiles /S /C "cmd /c If @isdir==TRUE echo @path^|^|@file^|^|@ftime" /D 0 2^>nul ^|findstr /B /V /C:"""%folder_destination%"') do (
                            	set actual_path_folder=%%a
                            	set actual_name_folder=%%b
                            	set actual_name_folder=!actual_name_folder:"=!
                            	set actual_ftime_folder=%%c
                            	set destination_copie=%folder_destination%\!actual_name_folder!
                            	
                            	REM Si une copie existe déjà dans la destination, on compare date/time de modification dans :Verify_folder
                            	If exist "!destination_copie!" (call :Verify_folder) else (set /a copieON=1)
                            	
                            	REM Si copieON vaut 1, copie le dossier actuel (/!\ les sous-dossiers ne sont pas inclus) dans %folder_destination% (ne copie pas si le dossier actuel est vide/sans fichier)
                            	If !copieON! EQU 1 (xcopy !actual_path_folder! "!destination_copie!" /C /I /F /G /H /Y |findstr /B /V /C:"0 fichier")
                            	set /a copieON=0
                            )
                            timeout /T 2 /NOBREAK >nul
                            goto :loop
                            exit
                            
                            :Verify_folder
                            REM récupère dernière heure de modification du dossier %actual_name_folder% dans %folder_destination% si le dossier a été modifié aujourd'hui
                            for /F %%d in ('forfiles /P "%folder_destination%" /C "cmd /c If @file==0x22%actual_name_folder%0x22 echo @ftime" /D 0 2^>nul') do (set destination_time=%%d)
                            
                            REM Si la copie/sauvegarde date d'aujourd'hui
                            If DEFINED destination_time (
                            
                            	REM On compare les heures de modification pour savoir si il s'agit d'une ancienne copie/sauvegarde
                            	If %actual_ftime_folder% GTR %destination_time% (rmdir /S /Q "!destination_copie!" &set /a copieON=1) else (set /a copieON=0)
                            ) else (
                            	rmdir /S /Q "!destination_copie!" &set /a copieON=1
                            )
                            set destination_time=
                            GOTO:EOF
                            

                            Pour les fichiers (plus pertinent que les dossiers) :

                            @echo off
                            setlocal EnableDelayedExpansion
                            Title Checks the last modified date of the files for the copy
                            
                            ::::::::::::: VARIABLE A MODIFIER :::::::::::::
                            	REM Correspond au dossier source
                            	set folder_source=D:\test1
                            	
                            	REM Correspond au dossier de destination
                            	set folder_destination=D:\test2
                            ::::::::::::: VARIABLE A MODIFIER :::::::::::::
                            
                            REM enlève le "\" de fin des variables folder_source et folder_destination si présent
                            If "%folder_source:~-1%"=="\" set folder_source=%folder_source:~0,-1%
                            If "%folder_destination:~-1%"=="\" set folder_destination=%folder_destination:~0,-1%
                            
                            cd /D "%folder_source%"
                            echo.
                            
                            :loop
                            cls
                            set /a copieON=0
                            
                            REM récupère chemin/nom.ext/dernière heure de modification des fichiers qui ont été modifié le jour même à partir de folder_source et de ses sous-dossiers (exclusions des fichiers se situant dans %folder_destination% et ses sous-dossiers)
                            for /F "tokens=1,2,3 delims=||" %%a in ('forfiles /S /C "cmd /c If @isdir==FALSE echo @path^|^|@file^|^|@ftime" /D 0 2^>nul ^|findstr /B /V /C:"""%folder_destination%"') do (
                            	set actual_path_file=%%a
                            	set actual_name_file=%%b
                            	set actual_name_file=!actual_name_file:"=!
                            	set actual_ftime_file=%%c
                            	set destination_copie=%folder_destination%\!actual_name_file!
                            	
                            	REM Si une copie existe déjà dans la destination, on compare date/time de modification dans :Verify_file
                            	If exist "!destination_copie!" (call :Verify_file) else (set /a copieON=1)
                            
                            	REM Si copieON vaut 1, copie le fichier actuel dans %folder_destination%
                            	If !copieON! EQU 1 (xcopy !actual_path_file! "%folder_destination%" /C /F /G /H /Y |findstr /B /V /C:"0 fichier")
                            	set /a copieON=0
                            )
                            timeout /T 2 /NOBREAK >nul
                            goto :loop
                            exit
                            
                            :Verify_file
                            REM récupère dernière heure de modification du fichier %actual_name_file% dans %folder_destination% si le fichier a été modifié aujourd'hui
                            for /F %%d in ('forfiles /P "%folder_destination%" /C "cmd /c If @file==0x22%actual_name_file%0x22 echo @ftime" /D 0 2^>nul') do (set destination_time=%%d)
                            
                            REM Si la copie/sauvegarde date d'aujourd'hui
                            If DEFINED destination_time (
                            
                            	REM On compare les heures de modification pour savoir si il s'agit d'une ancienne copie/sauvegarde
                            	If %actual_ftime_file% GTR %destination_time% (del /F /Q "!destination_copie!" &set /a copieON=1) else (set /a copieON=0)
                            ) else (
                            	del /F /Q "!destination_copie!" &set /a copieON=1
                            )
                            set destination_time=
                            GOTO:EOF
                            


                            Les deux codes sont très similaires et plutôt bien détaillé.
                            En espérant que cela pourra aider.

                            Cordialement,
                            Zaibai

                            -
                            Edité par Zaibai 3 décembre 2017 à 14:46:31

                            • Partager sur Facebook
                            • Partager sur Twitter
                              31 décembre 2017 à 15:21:49

                              Bonjour, 

                              J'ai finalement utilisé une autre technique, merci beaucoup pour ton retour. Je vais tenter de tout comprendre pour améliorer ce que j'ai fais.

                              Merci.

                              • Partager sur Facebook
                              • Partager sur Twitter

                              BATCH Resultat de lecture en variable

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown