[R] Sauvegarde ciblée automatique de fichiers

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Lems
Niveau 2
Niveau 2
Messages : 19
Enregistré le : mer. 13 févr. 2008 15:24
Status : Hors ligne

[R] Sauvegarde ciblée automatique de fichiers

#1

Message par Lems »

(Remis à jour pour le scripte)
Bonjour,

Je vous présente ici mon premier scripte UTILE ! Je dois faire une sauvegarde sur une machine. J'ai un certain nombre de fichiers et de dossiers à sauvegarder et ne pas les mélanger (d'où la structure en 4 boucles même si une fonction se serait justifié dans mon cas :roll: ).
La liste des adresses est fixée dans le fichier ini qui est joint. Je vais donc placer cet exe sur une clé usb avec sont fichier ini. Je la connecte au pc de la machine puis je lance la sauvegarde.
La structure est la même pour les 3 boucles fichiers. J'attends que vous me confirmiez que je ne vais pas cramer la machine en l'essayant pour le tester.
( :idea: Voir question au post suivant, merci. :idea: )

Voici mon scripte :

Code : Tout sélectionner

; -------------------- Déclarations --------------------
; Hotkey
MsgBox(0, "HotKey", "Vous pouvez quiter à tout moment en pressant la touche Echap (Esc)", 2)
HotKeySet("{ESC}", "Close")

; Déclaration des variables.
$Fini = @WorkingDir & "\Liste copie.ini"
Dim $Choix
Dim $Recherche, $WinActi
Dim $Nommachine

; -------------------- Algo --------------------

;Vérifier que la supervision est bien fermée
$WinActi = WinGetTitle("Wrapper Sup")
If WinExists($WinActi) Then
    $Choix = MsgBox(1, "Supervision ouverte", "La supervision est ouverte, voulez vous la fermer ?")
    If $Choix = 1 Then
        WinClose($WinActi)
        Sleep(5000)
        If WinExists($WinActi) Then
            MsgBox(0, "Erreur", "Le programme ne parvient pas à fermer la supervision, veuillez le faire amnuelement avant de relancer la sauvegarde.", 5)
            Exit
        EndIf
    Else
        MsgBox(0, "Info", "Veuillez fermer la supervision avant de relancer la sauvegarde", 5)
        Exit
    EndIf
EndIf

;Vérifier que le fichier ini est bien présent
If Not FileExists($Fini) Then
    MsgBox(0, "Fichier ini introuvable", "Le fichier ini portant toutes les adresses de copie est introuvable." & @CRLF & @CRLF & "Merci de la placer dans le même dossier que l'executable.", 5)
    Exit
EndIf

;Nom de la machine et date de sauvegarde

$Nommachine = InputBox("Nom machine", "Sur quel machine effectuez vous la sauvegarde ?" & @CRLF & "Ecrire : N° machine  N° Job", "MW XX  Job XXXX")

; Copie des fichiers ----------------------------------------------------------------------------------------

Dim $i = 0
$Adresse = @WorkingDir & "\Fichiers de " & $Nommachine & " au " & @MDAY & "_" & @MON & "_" & @YEAR & "\"
DirCreate($Adresse)
$Section = "Fichiers"
If IniRead($Fini, $Section, "Dir" & $i, "Fin") = "Fin" Then
Else ;Si la section est vide, on ne fait rien

    Do
        If FileExists(IniRead($Fini, $Section, "Dir" & $i, "Fin")) Then
            ;Fin représente la valeur par défaut quand il n'y a pas d'adresse entré dans le fichier ini

            FileCopy(IniRead($Fini, $Section, "Dir" & $i, "Fin"), $Adresse)
        Else
            $Choix = MsgBox(1, "Fichier introuvable", "Voulez vous chercher le fichier " & IniRead($Fini, $Section, "Nom" & $i, "Fin") & " à la main ?")
            If $Choix = 1 Then ;décide de le chercher à la main
                $Recherche = FileOpenDialog("Recherche du fichier ''" & IniRead($Fini, $Section, "Nom" & $i, "Fin") & "''", @HomeDrive, "All (*.*)")
                If @error Then ;ne l'a ps trouvé
                    MsgBox(0, "Info", "Le fichier ''" & IniRead($Fini, $Section, "Nom" & $i, "Fin") & "'' ne sera pas copié.", 5)
                Else
                    FileCopy($Recherche, $Adresse) ;il l'a trouvé
                EndIf
            Else
                MsgBox(0, "Info", "Le fichier ''" & IniRead($Fini, $Section, "Nom" & $i, "Fin") & "'' ne sera pas copié.", 5)
            EndIf
        EndIf
        $i = $i + 1 ;ajout pour la boucle

    Until IniRead($Fini, $Section, "Dir" & $i, "Fin") = "Fin" ;jusqu'à trouver mon marquer dans le fichier ini
EndIf
MsgBox(0, "Chec point", "Tous les fichiers de la section Fichiers sont copiés.", 3)


;Copie des dossiers de supervision ---------------------------------------------------------------
;La structure est à peux près la même

$i = 0
$Section = "Dossiers"

If IniRead($Fini, $Section, "Dir" & $i, "Fin") = "Fin" Then
Else ;Si la section est vide, on ne fait rien
    Do
        $Poids = DirGetSize(IniRead($Fini, $Section, "Dir" & $i, ""))
        ;Je n'ai pas trouvé mieux pour tester l'existence :s
        If $Poids < 0 Then
            $Choix = MsgBox(1, "Dossier introuvable", "Voulez vous chercher le dossier " & IniRead($Fini, $Section, "Nom" & $i, "Fin") & " à la main ?")
            If $Choix = 1 Then ;décide de le chercher à la main
                $Recherche = FileSelectFolder("Recherche du dossier ''" & IniRead($Fini, $Section, "Nom" & $i, "Fin") & "''", @HomeDrive, "All (*.*)")
                If @error Then ;ne l'a ps trouvé
                    MsgBox(0, "Dossier absent", "Le dossier ''" & IniRead($Fini, $Section, "Nom" & $i, "Erreur") & "'' n'a pas été trouvé." & @CRLF & "Il ne sera donc pas copié.", 5)
                Else
                    DirCopy($Recherche, $Adresse & IniRead($Fini, $Section, "Nom" & $i, "") & "\", 1)
                EndIf
            Else
                MsgBox(0, "Info", "Le fichier ''" & IniRead($Fini, $Section, "Nom" & $i, "Fin") & "'' ne sera pas copié.", 5)
            EndIf
            
            
        Else
            DirCopy(IniRead($Fini, $Section, "Dir" & $i, ""), $Adresse & IniRead($Fini, $Section, "Nom" & $i, "") & "\", 1)
        EndIf

        $i = $i + 1

    Until IniRead($Fini, $Section, "Dir" & $i, "Fin") = "Fin"
EndIf

MsgBox(0, "Chec point", "Tous les fichiers de la section Dossiers sont copiés.", 3)

;Copie des fichiers de windows ---------------------------------------------------------------------------------------------

$i = 0
$Adresse = $Adresse & "\Windows"
DirCreate($Adresse)

$Section = "Windows"

If IniRead($Fini, $Section, "Dir" & $i, "Fin") = "Fin" Then
Else ;Si la section est vide, on ne fait rien

    
    Do
        If FileExists(IniRead($Fini, $Section, "Dir" & $i, "Fin")) Then
            ;Fin représente la valeur par défaut quand il n'y a pas d'adresse entré dans le fichier ini

            FileCopy(IniRead($Fini, $Section, "Dir" & $i, "Fin"), $Adresse)
        Else
            $Choix = MsgBox(1, "Fichier introuvable", "Voulez vous chercher le fichier " & IniRead($Fini, $Section, "Nom" & $i, "Fin") & " à la main ?")
            If $Choix = 1 Then ;décide de le chercher à la main
                $Recherche = FileOpenDialog("Recherche du fichier ''" & IniRead($Fini, $Section, "Nom" & $i, "Fin") & "''", @WindowsDir, "All (*.*)")
                If @error Then ;ne l'a ps trouvé
                    MsgBox(0, "Info", "Le fichier ''" & IniRead($Fini, $Section, "Nom" & $i, "Fin") & "'' ne sera pas copié.", 5)
                Else
                    FileCopy($Recherche, $Adresse) ;il l'a trouvé
                EndIf
            Else
                MsgBox(0, "Info", "Le fichier ''" & IniRead($Fini, $Section, "Nom" & $i, "Fin") & "'' ne sera pas copié.", 5)
            EndIf
        EndIf
        $i = $i + 1 ;ajout pour la boucle

    Until IniRead($Fini, $Section, "Dir" & $i, "Fin") = "Fin" ;jusqu'à trouver mon marquer dans le fichier ini
EndIf

MsgBox(0, "Chec point", "Tous les fichiers de la section Windows sont copiés.", 3)
;Copie des fichiers de system -----------------------------------------------------------------------------------------------

$i = 0
$Adresse = $Adresse & "\System"
DirCreate($Adresse)
$Section = "System"

If IniRead($Fini, $Section, "Dir" & $i, "Fin") = "Fin" Then
Else ;Si la section est vide, on ne fait rien

    
    Do
        If FileExists(IniRead($Fini, $Section, "Dir" & $i, "Fin")) Then
            ;Fin représente la valeur par défaut quand il n'y a pas d'adresse entré dans le fichier ini

            FileCopy(IniRead($Fini, $Section, "Dir" & $i, "Fin"), $Adresse)
        Else
            $Choix = MsgBox(1, "Fichier introuvable", "Voulez vous chercher le fichier " & IniRead($Fini, $Section, "Nom" & $i, "Fin") & " à la main ?", 5)
            If $Choix = 1 Then ;décide de le chercher à la main
                $Recherche = FileOpenDialog("Recherche du fichier ''" & IniRead($Fini, $Section, "Nom" & $i, "Fin") & "''", @SystemDir, "All (*.*)")
                If @error Then ;ne l'a ps trouvé
                    MsgBox(0, "Info", "Le fichier ''" & IniRead($Fini, $Section, "Nom" & $i, "Fin") & "'' ne sera pas copié.", 5)
                Else
                    FileCopy($Recherche, $Adresse) ;il l'a trouvé
                EndIf
            Else
                MsgBox(0, "Info", "Le fichier ''" & IniRead($Fini, $Section, "Nom" & $i, "Fin") & "'' ne sera pas copié.", 5)
            EndIf
        EndIf
        $i = $i + 1 ;ajout pour la boucle

    Until IniRead($Fini, $Section, "Dir" & $i, "Fin") = "Fin" ;jusqu'à trouver mon marquer dans le fichier ini
EndIf

MsgBox(0, "Chec point", "Tous les fichiers de la section System sont copiés.", 3)

;Marqueur de fin -------------------------------------------------------------------------------------------------------
MsgBox(0, "Fin", "La copie est terminée.")

; Fonction pour la hot key
Func Close()
    MsgBox(0, "Arret", "Vous avez pressé Esc, le programme va se fermer.", 2)
    Exit
EndFunc   ;==>Close
Modifié en dernier par Lems le jeu. 21 févr. 2008 18:30, modifié 12 fois.
Les cons osent tout ! C'est d'ailleurs à ça qu'on les reconnait ;)
Avatar du membre
Lems
Niveau 2
Niveau 2
Messages : 19
Enregistré le : mer. 13 févr. 2008 15:24
Status : Hors ligne

Re: [..] Sauvegarde de fichiers

#2

Message par Lems »

Voila ! Je l'ai testé sur mon poste et elle fonctionne. :D

Maintenant les remarques et questions que j'ai à vous soumettre :

1/ Le Pc sur lequel je vais l'executer est sous Windows 98, y a t'il quelque chose que je doives faire en plus de :
[autoit]; Utiliser pour la compatibilité avec Win98 (Y).
#AutoIt3Wrapper_UseAnsi=Y[/autoit]

2/ J'aimerai que l'on puisse chercher le dossier à la main en cas d'absence comme c'est fait pour les fichiers mais j'ai pas trouvé de fonction DirOpenDialog :s

3/ Existe t il l'équivalent d'un While Not pour remplacer mes If .. Else .. Do ?

4/ Je suis ouvert à toute suggestion (simple étant donné que je débute :wink: ).

Merci beaucoup de m'avoir lu ! :)
Les cons osent tout ! C'est d'ailleurs à ça qu'on les reconnait ;)
Avatar du membre
Lems
Niveau 2
Niveau 2
Messages : 19
Enregistré le : mer. 13 févr. 2008 15:24
Status : Hors ligne

Re: [..] Sauvegarde ciblée automatique de fichiers

#3

Message par Lems »

Encore moi :lol:
Pour tester le scripte précédent, il vous faut un fichier ini avec un contenu spécifique. Vous pouvez faire un copier collé de celui ci :

[Fichiers]

Nom0=___ Mettre un nom repère qui vous permette de vous y retrouver
Dir0=___ Mettre la cible à copier
Nom1=Fin
Dir1=Fin
Nom2=Fin
Dir2=Fin
Nom3=Fin
Dir3=Fin
Nom4=Fin
Dir4=Fin


[Dossiers]

Nom0=Fin
Dir0=Fin
Nom1=Fin
Dir1=Fin
Nom2=Fin
Dir2=Fin


[Windows]

Nom0=Fin
Dir0=Fin
Nom1=Fin
Dir1=Fin
Nom2=Fin
Dir2=Fin
Nom3=Fin
Dir3=Fin


[System]

Nom0=Fin
Dir0=Fin
Nom1=Fin
Dir1=Fin
Nom2=Fin
Dir2=Fin
Nom3=Fin
Dir3=Fin
Les cons osent tout ! C'est d'ailleurs à ça qu'on les reconnait ;)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Sauvegarde de fichiers

#4

Message par Tlem »

Lems a écrit :1/ Le Pc sur lequel je vais l'executer est sous Windows 98, y a t'il quelque chose que je doives faire en plus de :
[autoit]; Utiliser pour la compatibilité avec Win98 (Y).
#AutoIt3Wrapper_UseAnsi=Y[/autoit]
A première vue ca doit suffire.

Lems a écrit :2/ J'aimerai que l'on puisse chercher le dossier à la main en cas d'absence comme c'est fait pour les fichiers mais j'ai pas trouvé de fonction DirOpenDialog :s
Si vous regardez bien l'aide de FileOpenDialog, dans la section Related, vous trouverez une référence à : FileSelectFolder
Lems a écrit :3/ Existe t il l'équivalent d'un While Not pour remplacer mes If .. Else .. Do ?
Vous n'utilisez pas toujours les fonctions de la bonne manière.
Au lieu de

Code : Tout sélectionner

If .. Then
 ...
Else
...
Endif
faites plutot :

Code : Tout sélectionner

If Not ... Then
...
Endif
Lems a écrit :4/ Je suis ouvert à toute suggestion (simple étant donné que je débute)
J'ai lu votre script rapidement, et je le trouve très compliqué (Il m'a donné mal au crane à la lecture ;) ).
Il serait peut être judicieux de simplifié son code et ses fonctions.
Le mieux, est de décrire pour commencer en détail le but du script, le nom des fichiers/répertoires(récursif ou non), voir si une liste simple ne ferait pas l'affaire ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Lems
Niveau 2
Niveau 2
Messages : 19
Enregistré le : mer. 13 févr. 2008 15:24
Status : Hors ligne

Re: [R] Sauvegarde ciblée automatique de fichiers

#5

Message par Lems »

Merci beaucoup Tlem, il marche parfaitement maintenant !

J'ai laissé tombé les If Not, je ne maitrise pas encore :oops:
Les cons osent tout ! C'est d'ailleurs à ça qu'on les reconnait ;)
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [R] Sauvegarde ciblée automatique de fichiers

#6

Message par tolf »

Tlem a écrit :Il serait peut être judicieux de simplifié son code et ses fonctions.
Lems, je pense que tu devrais créer une fonction rassemblant toute la partie sur la recherche à la main du fichier/dossier inexistant, étant donné que tu le fais 4 fois dans ton script.
Lems a écrit :J'ai laissé tombé les If Not, je ne maitrise pas encore
Dans ton code, il y a un très bel exemple donc je ne vois pas ce qui est gênant :
Lems a écrit :

Code : Tout sélectionner

;Vérifier que le fichier ini est bien présent
If Not FileExists($Fini) Then
Donc tu peux remplacer ceci :

Code : Tout sélectionner

If IniRead($Fini, $Section, "Dir" & $i, "Fin") = "Fin" Then
Else ;Si la section est vide, on ne fait rien
par ceci :

Code : Tout sélectionner

If Not IniRead($Fini, $Section, "Dir" & $i, "Fin") = "Fin" Then
;Else ;Si la section est vide, on ne fait rien
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
Répondre