Partage
  • Partager sur Facebook
  • Partager sur Twitter

attendre la fin de la copie d'un fichier

    8 avril 2022 à 18:51:26

    Bonjour a tous,

    J'ai un petit soucis, j'ai un script en boucle qui archive des fichiers .txt (les fichiers arrivent via un google drive, le seul soucis c'est que quand le script tourne alors que le fichier n'est pas finie de copier en local l'archive n'est bonne. 

    je dois donc attendre que le fichier soit complétement arrivé, pour ça je pensais vérifier ça taille dans une boucle jusqu'à ce que la taille ne bouge plus. 

    mais je ne sais pas si c'est la meilleur façon et je n'arrive pas a faire fonctionner mon code... 

    :loop
    
    for /R %Folder% %%f in (*.txt) do (
    	set SizeF=0
    	if exist "%%f.7z" (
    		echo %%f already compressed
    	) else (
    		rem la lige suivante affiche "Size: "
                    @echo Size: %~z1 
    		
    		if %~z1 GTR %SizeF% (
    			SizeF=%~z1
    		)
    		else (
    			7z a -mx1 "%%f.7z" "%%f"
    		)
    		timeout /t 1 /nobreak
    	)
    )
    timeout /t 5 /nobreak
    goto loop


    merci pour votre aide !! 

    Simon

    • Partager sur Facebook
    • Partager sur Twitter
      8 avril 2022 à 22:52:05

      Bonsoir,

      Quel est le message d'erreur ?

      D'où sort la variable '%~z1' ? (en tout cas il lui manque un '%')

      Une autre idée serait peut-être de regarder la dernière date d'écriture via un dir /TW "fichier.txt" :

      /T          Contrôle le champ d'heure affiché ou utilisé pour le tri timefield
                    C  Création
                    A  Dernier accès
                    W  Dernière écriture



      -
      Edité par Zaibai 8 avril 2022 à 22:56:32

      • Partager sur Facebook
      • Partager sur Twitter
        9 avril 2022 à 7:01:56

        Merci pour ta réponse, 

        il n'y a pas de message d'erreur, voici l'output : 

        C:\Users\**********\Google Drive\Documents\dossiertest\timetable.txt already compressed
        Size:
        Size:
        Size:
        Waiting for 3 seconds, press CTRL+C to quit ...

        :/ pas facile... 

        //D'où sort la variable '%~z1' ? (en tout cas il lui manque un '%')

        j'ai trouvé ça sur internet, il manquerai ou le % ? apparemment ça sert a récupérer le 1er fichier de ce que j'ai compris.

        merci

        Simon

        • Partager sur Facebook
        • Partager sur Twitter
          9 avril 2022 à 14:10:53

          @echo off
          setlocal ENABLEDELAYEDEXPANSION
          set folder="Lecteur:\Dossier\Sous_Dossier"
          
          :loop
          for /R %Folder% %%f in (*.txt) do (
              set /a SizeF=0
              if exist "%%f.7z" (
                  echo %%f already compressed
              ) else (
          		set /a size=%%~zf
          		echo Size: %%~zf
                  if !size! GTR !SizeF! (
                      set /a SizeF=!size!
                  ) else (
          			echo compression %%f
                      7z a -mx1 "%%f.7z" "%%f"
                  )
                  timeout /t 1 /nobreak>nul
              )
          )
          timeout /t 5 /nobreak>nul
          goto :loop
          exit
          

          Quelques corrections/modifications dans le code ci-dessus.

          Pour comprendre la boucle for (notamment la partie "substitution de variable") -> https://docs.microsoft.com/fr-fr/windows-server/administration/windows-commands/for
          Dans une invite de commande (cmd) pour afficher une variable de la boucle for : %f
          Dans un script (extension .bat/.cmd) pour afficher une variable de la boucle for on double le signe pourcent : %%f

          -
          Edité par Zaibai 9 avril 2022 à 14:11:31

          • Partager sur Facebook
          • Partager sur Twitter
            9 avril 2022 à 18:40:34

            Merci pour cette réponse ça m'a déjà fait bien avancé mais j'ai pas du bien comprendre tout ... 
            j'ai tester pleins de choses mais j'y arrive pas... 

            @echo off
            set PATH=%PATH%;C:\Program Files\7-Zip;
            setlocal ENABLEDELAYEDEXPANSION
            set folder="C:\Users\*****\Google Drive\dossiertest"
             
            :loop
            for /R %Folder% %%f in (*.txt) do (
                set /a SizeF=0
                if exist "%%f.7z" (
                    echo %%f already compressed
                ) else (
                    set /a size=%%~zf
                    echo Size: %%~zf
            		:verfifSize
                    if !size! GTR !SizeF! (
                        set /a SizeF=!size!
            			timeout /t 1 /nobreak > nul
            			goto :verfifSize
                    ) else (
                        echo compression %%%f
                        7z a -mx1 "%%%f.7z" "%%%f"
                    )
                    timeout /t 1 /nobreak>nul
                )
            )
            timeout /t 5 /nobreak>nul
            goto :loop
            exit

            la j'ai l'impression que y'a des choses qui marchent mais pas du tout comme je veux lol ça compresse tous les fichier en une seule archive a l'endroit de mon .bat... 

            au lieu de me faire une archive de chaque fichier txt qui n'a pas encore d'archive...

            c'est en train de me monter en tension ^^ je vais craquer et le faire avec un autre langage si ça continue, j'y connais rien en shell... 

            allez persévérons un peu, si tu as une idée je suis preneur,

            Merci beaucoup.

            Simon

            • Partager sur Facebook
            • Partager sur Twitter
              9 avril 2022 à 22:36:19

              Bonsoir,

              Ce n'est pas du shell mais du MS-DOS -> https://www.quora.com/What-is-difference-between-DOS-and-shell-command

              Ton problème doit venir de la ligne 21 je pense ' 7z a -mx1 "%%%f.7z" "%%%f" ' -> https://info.nrao.edu/computing/guide/file-access-and-archiving/7zip/7z-7za-command-line-guide

              D'ailleurs pourquoi les variables des lignes 20 et 21 ont trois '%' à la suite ?

              A tester : ' 7z a -mx=1 "%%f.7z" "%%f" '. %%f change de nom à chaque tour de la boucle, donc tu ne devrait pas avoir qu'une archive normalement.

              • Partager sur Facebook
              • Partager sur Twitter
                10 avril 2022 à 6:54:41

                Salut, 

                en fait c'était avec 2 % au début, mais dans le CMD ca m'affiche Size: %~zf

                Donc je me suis dit pour qu'il voit %%~zf et non pas %~zf je lui rajoute un % pour voir... et la magie ça a marché il voyait bien le nom de mon fichier..

                je ne pense pas que le problème soit cette ligne car mon code (sans le fait d'attendre que la taille du fichier soit figée) marche très bien : 

                @ECHO OFF
                set PATH=%PATH%;C:\Program Files\7-Zip;
                 pause
                @echo off
                set Folder="C:\Users\******\Google Drive\dossiertest"
                
                
                :loop
                
                for /R %Folder% %%f in (*.txt) do (
                
                if exist "%%f.7z" (
                    echo %%f already compressed
                ) else (
                    echo file doesn't exist
                	
                	2>nul (
                		>>"%%f" echo off
                		) && (7z a -mx1 "%%f.7z" "%%f") || (echo file is locked)
                	
                	
                	
                )
                )
                timeout /t 5 /nobreak
                goto loop
                


                mais le truc c'est que ça ça marche mais que quand le fichier est utilisé par quelqu'un il créé pas l'archive... et les fichiers qui arrivent sont ouvert par un autre programme donc ça compresse pas. 

                snif

                • Partager sur Facebook
                • Partager sur Twitter

                attendre la fin de la copie d'un fichier

                × 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