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 :

Problème sur effacement de dossiers


Sujet :

Scripts/Batch

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Problème sur effacement de dossiers
    Bonjour,

    J'ai crée un petit script qui me permet de supprimer tous les dossiers présents dans une arborescence SAUF ceux que je passe dans un tableau.

    Voici le script :

    @REM initialisation de l'expansion retardée
    setlocal enableDelayedExpansion

    @REM A modifier si la racine des repertoires à supprimer change
    set rep = "C:\Documents and Settings\g1598253\Desktop\test script"

    @REM Initialiser un fichier à ne pas supprimer par ligne
    set tab0 = "tutu"
    set tab1 = "toto"

    for /f %%G In ('dir /b /ad %rep%') DO (

    set var=%%G

    @REM Ici, modifier le dernier paramètre en fonction du nombre de tab
    for /L %%j in (0,1,2) do (

    if /I %var% == !tab%%j! (
    set suppr="false"
    )
    )

    if /I not %suppr% == "false" (
    rmdir %%G /s /q

    )
    )

    J'ai l'impression que ça bloque au niveau du "for" qui parcourt l'ensemble du dossier racine.

    Pourriez-vous me donner un coup de main svp ?

    Merci d'avance,

    Kill@

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Points : 25
    Points
    25
    Par défaut
    Salut,

    Je pense que le problème (ou un des problèmes) est dans la non initialisation de plusieurs variables, entre autres :
    - suppr
    - tab2

    Du coup, sur des lignes telles que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if /I %var% == !tab%%j!
    quand "%%j" vaut 2, ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if /I not %suppr% == "false"
    on va avoir une des opérandes qui s'évalue en une chaîne vide, ce qui risque de résulter en une sortie du programme

    Deux solutions possibles :

    - "protéger" les comparaisons
    => par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if /I @%var%==@!tab%%j!
    assure qu'il y aura toujours quelque chose à droite de l'opérateur "=="

    - initialiser les variables
    => cela me semble de toutes façons indispensable d'initialiser "suppr" au début de la 1ère boucle "for", par exemple après le "set var=...", sinon il ne perd jamais sa valeur "false" après avoir rencontré le premier dossier à ne pas supprimer


    A+
    Cédric

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse Cédric.

    J'ai fait ce que tu m'as reccomandé, mais j'échappe toujours le script à la 1ère boucle "for".

    Voici ce que j'obtiens en execution pas-à-pas :

    ╔════════════════════════════════════════════════════╗
    ║ Pressez une touche pour exécuter la ligne 1 ║
    ╚════════════════════════════════════════════════════╝
    * Valeur de la ligne : @REM initialisation de l'expension retardÚe
    ╔════════════════════════════════════════════════════╗
    ║ Pressez une touche pour exécuter la ligne 2 ║
    ╚════════════════════════════════════════════════════╝
    * Valeur de la ligne : setlocal enableDelayedExpansion
    ╔════════════════════════════════════════════════════╗
    ║ Pressez une touche pour exécuter la ligne 4 ║
    ╚════════════════════════════════════════════════════╝
    * Valeur de la ligne : @REM A modifier si la racine des repertoires Ó supprimer
    change
    ╔════════════════════════════════════════════════════╗
    ║ Pressez une touche pour exécuter la ligne 5 ║
    ╚════════════════════════════════════════════════════╝
    * Valeur de la ligne : set rep = "C:\Documents and Settings\g1598253\Desktop\test script"
    ╔════════════════════════════════════════════════════╗
    ║ Pressez une touche pour exécuter la ligne 7 ║
    ╚════════════════════════════════════════════════════╝
    * Valeur de la ligne : @REM Initialiser un fichier Ó ne pas supprimer par ligne
    ╔════════════════════════════════════════════════════╗
    ║ Pressez une touche pour exécuter la ligne 8 ║
    ╚════════════════════════════════════════════════════╝
    * Valeur de la ligne : set tab0 = "tutu"
    ╔════════════════════════════════════════════════════╗
    ║ Pressez une touche pour exécuter la ligne 9 ║
    ╚════════════════════════════════════════════════════╝
    * Valeur de la ligne : set tab1 = "toto"
    ╔════════════════════════════════════════════════════╗
    ║ Pressez une touche pour exécuter la ligne 11 ║
    ╚════════════════════════════════════════════════════╝
    * Valeur de la ligne : for /f %G In ('dir /b /ad ') DO (
    Et j'échappe du script à partir de cette ligne. Je constate qu'elle est différente de celle inscrite dans mon code. Le chemin du dossier à parcourir n'apparait pas.


    Voici mon code avec les modifications proposées :

    @REM initialisation de l'expension retardée
    setlocal enableDelayedExpansion

    @REM A modifier si la racine des repertoires à supprimer change
    set rep = "C:\Documents and Settings\g1598253\Desktop\test script"

    @REM Initialiser un fichier à ne pas supprimer par ligne
    set tab0 = "tutu"
    set tab1 = "toto"

    for /f %%G In ('dir /b /ad %rep%') DO (

    set var=%%G
    set suppr="true"

    @REM Ici, modifier le dernier paramètre en fonction du nombre de tab
    for /L %%j in (0,1,1) do (

    if /I @%var%==@!tab%%j! (
    set suppr="false"
    )
    )

    if /I not %suppr% == "false" (
    rmdir %%G /s /q

    )
    )

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Points : 25
    Points
    25
    Par défaut
    Je pense que ta variable "rep" est vide car mal initialisée : la syntaxe pour une affectation est :
    sans espaces autour de l'opérateur "=" !

    Tu peux le vérifier avec le petit code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set rep = "C:\Documents and Settings\g1598253\Desktop\test script"
    echo.%rep%
    set rep="C:\Documents and Settings\g1598253\Desktop\test script"
    echo.%rep%

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Re,

    Bon, j'ai réussi à me débrouiller, j'ai un code qui fonctionne.

    Par contre, je suis embêté par le nombre d'itérations que cela produit.

    En fait, l'utilisateur peut éditer le fichier pour entrer les dossiers à ne pas supprimer dans un "tableau", par exemple :

    set tab[0]="f"
    set tab[1]="n"
    set tab[2]="h"
    set tab[3]="FIN_TAB"
    J'arrive à exploiter ces enregistrements, mais je me retrouve confronté au fait que par exemple, le "n" soit après le "h" dans l'alphabet, et ça me gène.

    J'aimerai pouvoir faire un tri sur la valeur de la variable, mais je ne sais pas comment faire (a part comparer chaque tab un par un) ?
    N'existe t'il pas un équivalent de SORT pour des chaines de caractères ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Points : 25
    Points
    25
    Par défaut
    Tu pourrais peut-être limiter les itérations en mettant la liste des sous-dossiers à ne pas supprimer dans un fichier texte, et en utilisant "find" ou "findstr" pour vérifier que le sous-dossier à supprimer n'est pas dans la liste

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par cedricchaillou Voir le message
    Tu pourrais peut-être limiter les itérations en mettant la liste des sous-dossiers à ne pas supprimer dans un fichier texte, et en utilisant "find" ou "findstr" pour vérifier que le sous-dossier à supprimer n'est pas dans la liste
    Tu pourrais m'en dire plus ?
    Ce système permettrait de tester chaque sous-dossier un à un, ou tous dans la même boucle ?

    Ma contrainte principale est que l'utilisateur doit pouvoir entrer le nom de son dossier sans se soucier de l'ordre alphabétique.

    Si cela t'interesse, voilà mon code, qui fonctionne bien.

    Code : 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    REM initialisation de l'expension retardée
    setlocal enableDelayedExpansion
    
    REM Initialisation des variables, ne pas toucher
    REM Compteur
    set /A X=0
    REM Flag de suppression
    set suppr="true"
    REM Variable "globale" du dossier courant
    set comp=
    
    
    REM \\\\\\\\\\\\\\\\\\\\\\\\\\\
    REM \\\\\\\\ A CONFIGURER \\\\\
    REM \\\\\\\\\\\\\\\\\\\\\\\\\\\
    
    REM Racine des repertoires à supprimer
    set rep=C:\Documents and Settings\g1598253\Desktop\test script\
    
    REM Repertoire temporaire contenant les fichiers à ne pas supprimer
    set rep_temp=C:\Documents and Settings\g1598253\Desktop\test script temp\
    
    REM Créer une ligne par dossier à ne pas supprimer, laisser le dernier
    REM indice en "FIN_TAB"
    set tab[0]="f"
    set tab[1]="n"
    set tab[2]="h"
    
    
    
    
    set tab[3]="FIN_TAB"
    
    REM \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    REM \\\\\\\\ /A CONFIGURER \\\\\\\\
    REM \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    
    
    
    md "%rep_temp%"
    
    @echo off
    echo Initialisation du fichier temporaire de sauvegarde OK !
    
    @echo off
    echo Demarrage de la suppression des dossiers utilisateurs.
    
    goto Bouclefor
    
    
    
    
    REM \\\\\\\\\\\\\\\\\\\\\\\\\\\\
    REM \\\\\\\\ ETIQUETTES \\\\\\\\
    REM \\\\\\\\\\\\\\\\\\\\\\\\\\\\
    
    
    :Supprimer
    REM Suppression du dossier courant. 
    REM Sauvegarde temporaire des dossiers à garder 
    if /I %suppr%=="true" (
    	rmdir "%rep%%comp%" /s /q
    
    	@echo off
    	echo Suppression du repertoire "%comp%" OK !
    
    	set suppr="true"
    	set /A X=0	
    	goto :Bouclefor
    )
    
    xcopy "%rep%%comp%" "%rep_temp%%comp%" /H /T /E /I
    rmdir "%rep%%comp%" /s /q
    
    @echo off
    echo Copie du repertoire "%comp%" dans le repertoire temporaire OK !
    
    set suppr="true"
    set /A X=0	
    
    goto Bouclefor
    
    
    :Boucleif
    REM Comparaison du dossier courant avec les dossier à garder
    REM Boucle sur l'ensemble des dossiers
    if /I "%comp%"==!tab[%X%]!  goto Egal
    set /A X=!X!+1
    
    REM Si on est en fin de tableau, goto Suppression
    if !tab[%X%]!=="FIN_TAB" goto Supprimer
    
    REM Sinon, on boucle pour le prochain dossier recherché
    goto Boucleif
    
    
    :Egal
    REM Préparation à la suppression
    set suppr="false"
    goto Supprimer
    
    
    
    :End
    REM Copie des fichiers sauvegardés du dossier temporaire vers le dossier racine
    REM Suppression du dossier temporaire.
    for /f %%G In ('dir /b /ad "%rep_temp%"') do xcopy "%rep_temp%%%G" "%rep%%%G" /H /T /E /I
    
    @echo off
    echo Restauration des dossiers sauvegardes OK !
    
    rmdir "%rep_temp%" /s /q
    
    @echo off
    echo Suppression du repertoire temporaire OK !
    
    @echo off
    echo Fin du programme
    pause
    
    
    
    
    REM \\\\\\\\\\\\\\\\\\\\\\
    REM \\\\\\\\ MAIN \\\\\\\\
    REM \\\\\\\\\\\\\\\\\\\\\\\
    
    
    REM Listage de tous les repertoires présents dans le dossier racine
    :Bouclefor
    for /f %%G In ('dir /b /ad "%rep%"') do (
    	set comp=%%G
    	goto :Boucleif
    )
    
    goto :End

    Mais je ne suis pas satisfait, je me retrouve obligé de supprimer le dossier courant à sauvegarder que j'enregistre dans un dossier temporaire, car sinon le retour sur le :Bouclefor du main oblige le batch à relancer le parcours du dossier racine... Il revient donc sur le premier dossier trouvé... Celui là même que je testais et que je devais conserver.
    Une fois le dossier racine scanné, je copie les dossiers enregistrés du fichier temporaire vers le dossier racine.

    Si tu as une solution moins barbare à me proposer ?

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    UP

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Cedric ?

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/09/2010, 17h21
  2. problème de droits sur fichiers ou dossiers créés
    Par speedev dans le forum Réseau
    Réponses: 0
    Dernier message: 19/11/2009, 12h34
  3. Effacer un dossier et réécrire sur son emplacement
    Par andreditdd dans le forum Langage
    Réponses: 3
    Dernier message: 06/06/2009, 11h28
  4. Réponses: 8
    Dernier message: 09/05/2007, 00h35
  5. problème sur le parcours d'un dossier
    Par cyrill.gremaud dans le forum Langage
    Réponses: 16
    Dernier message: 04/05/2006, 14h17

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