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 :

Batch compression répertoires en fonction de leur taille


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut Batch compression répertoires en fonction de leur taille
    salut a tous,

    je suis pas un expert en batch et j'aurais besoin d'aide pour un script de compression de répertoire.

    enfaîte j'ai dans un répertoire, cinq sous répertoires pleins de fichiers *.txt (et pas de sous sous répértoire.

    j'aimerais faire un batch qui me compresse les sous répertoire une fois qu'ils dépassent une certaine taille.

    j'ai réussi a faire un batch qui me fait ça pour des fichiers et j'aimerais savoir ce que je dois changer pour le faire avec des répertoires.
    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
    set fichier="C:\test22\*.*" 
    for %%a in (%fichier%) do call :OKDOK "%%a" 
    goto :EOF 
    
    :OKDOK 
    set taille=%~z1 
    echo %1	%taille% 
    if %taille% LSS 10000 ( 
    echo fichier %1 trop petit. taile=%taille% >> tst.txt 
    ) else ( 
    echo fichier %1 correct. taille=%taille% >> tst.txt 
    REM 
    REM del /F /Q %1
    set nom=%~n1
    "C:\Program Files\7-Zip\7z.exe" a "c:\test22\%nom%.zip" %1 -mx9

    merci d'avance

  2. #2
    Membre éprouvé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Par défaut
    Bonjour,

    en gros ton code a juste besoin d’être modifié pour traiter les dossiers.
    Il faut faire une boucle for dans une commande dir sur ton sous dossier pour récupérer la taille du sous-dossier.

  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Citation Envoyé par Cmanix Voir le message
    Bonjour,

    en gros ton code a juste besoin d’être modifié pour traiter les dossiers.
    Il faut faire une boucle for dans une commande dir sur ton sous dossier pour récupérer la taille du sous-dossier.
    ok bon va falloir que je cherche un peu plus sur la commande FOR pour faire ca, parce que la je vois pas trop comment faire

  4. #4
    Membre éprouvé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Par défaut
    dir t'affiche a la fin une ligne du type "56 fichier(s) 952 325 octets"

    pour récupérer cette taille en octet:

    for /f "tokens=1,2,3,4" %%i in ('dir "%chemin%"') do if "%%j"=="fichiers(s)" set taille_dossier=%%k

  5. #5
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Citation Envoyé par Cmanix Voir le message
    dir t'affiche a la fin une ligne du type "56 fichier(s) 952 325 octets"

    pour récupérer cette taille en octet:

    for /f "tokens=1,2,3,4" %%i in ('dir "%chemin%"') do if "%%j"=="fichiers(s)" set taille_dossier=%%k
    a ok j'avais pas compris ca.

    enfaîte oui tu récupère la taille en délimitant ce qu'il doit prendre comme infos et tu la balance dans le reste de la commande.

    après faut juste que la commande soit exécute dans chaque sous répertoires.

  6. #6
    Membre éprouvé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Par défaut
    après si tu a encore des sous-répertoire derrière il faut s'y prendre autrement. tu peut faire une boucle for /r (retourne tous les fichiers d'une arborescence) et tu additionne la taille de tous tes fichiers.


    ou sinon tu passe par un vbscript. exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo>"tmp.vbs" set fso=CreateObject("Scripting.FileSystemObject")
    echo>>"tmp.vbs" fso.OpenTextFile("tmp", 2,true).write (fso.GetFolder("%dossier%").Size)
    tmp.vbs
    for /f %%i in ('type "tmp"') do set taille=%%i
    del tmp&del tmp.vbs

  7. #7
    Membre expérimenté Avatar de plopi
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mars 2011
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2011
    Messages : 191
    Par défaut
    Citation Envoyé par davzell Voir le message

    j'ai réussi a faire un batch qui me fait ça pour des fichiers et j'aimerais savoir ce que je dois changer pour le faire avec des répertoires.
    pour obtenir la taille de dossiers/sous dossiers en batch il y a la commande FORFILES :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    forfiles /P "Chemin" /S  /C "cmd /c if @isdir==TRUE echo @fname @fsize"
    Dans ce cas la, affiche en sortie de commande le nom de tous les sous-dossiers suivit de de la taille en octets

  8. #8
    Membre éprouvé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Par défaut
    la commande forfiles ne gère pas les taille de dossier (uniquement pour les fichiers). de plus si le nom de dossier contient un point la commande le prend pour une extension et ne l'affiche pas.
    forfiles=pourfichiers
    il aurait falu une commande forfolders

  9. #9
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Citation Envoyé par Cmanix Voir le message
    après si tu a encore des sous-répertoire derrière il faut s'y prendre autrement. tu peut faire une boucle for /r (retourne tous les fichiers d'une arborescence) et tu additionne la taille de tous tes fichiers.


    ou sinon tu passe par un vbscript. exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo>"tmp.vbs" set fso=CreateObject("Scripting.FileSystemObject")
    echo>>"tmp.vbs" fso.OpenTextFile("tmp", 2,true).write (fso.GetFolder("%dossier%").Size)
    tmp.vbs
    for /f %%i in ('type "tmp"') do set taille=%%i
    del tmp&del tmp.vbs

    le script VBS a l'air parfait merci

    bon par contre faut que j'arrive a modifier le code de base.


    EDIT:

    bon j'ai réussi tout fonctionne ou presque

    enfaîte on va dire que mon arbo est comme ça:

    TEST (dossier de base)
    --------------TEST1
    --------------TEST2
    --------------TEST3

    Actuellement il faut que je lance mon batch dans un des sous dossier (TEST1, TEST2,...) pour que ça fonctionne

    Ce que je voudrais c'est mettre mon batch dans le dossier TEST
    Qu'il me contrôle le dossier TEST1, ensuite qu'il passe a TEST2 et ainsi de suite.

    comment je pourrais faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    echo>"tmp.vbs" set fso=CreateObject("Scripting.FileSystemObject")
    echo>>"tmp.vbs" fso.OpenTextFile("tmp", 2,true).write (fso.GetFolder("c:\test22\test").Size)
    tmp.vbs
    for /f %%i in ('type "tmp"') do set taille=%%i
    del tmp&del tmp.vbs
    if %taille% LSS 100 ( 
    echo fichier %1 trop petit. taile=%taille% 
    ) else ( 
    echo fichier %1 correct. taille=%taille% 
    set nom=%~n1
    "C:\Program Files\7-Zip\7z.exe" a "c:\test22\%nom%.zip" c:\test22\test -mx9
    )

  10. #10
    Membre éprouvé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Par défaut
    Que tu mette ou non le script dans le dossier traité n'a pas d'importance.

    apparemment tu a un script qui fonctionne par sous-dossier. donc il faut rajouter une boucle qui exécute ton script actuel pour chaque sous-dossier de ton dossier principale (uniquement à 1 niveau en dessous de ton dossier et pas toute l'arborescence). Donc il te faut une boucle qui récupère le chemin des sous-dossier.il te suffira ensuite de placer ton code dans cette boucle.tu devra utiliser la commande setlocal enabledelayedexpansions et remplacer les variables %var% par !var! pour qu'elles fonctionnent à l’intérieur de ta boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for /f "skip=2 tokens=1,2,3,*" %%i in ('dir "%dossier_1%" /A:D ^|find "/"') do (echo [%dossier_1%\%%l])
    nb: si ton script est exécuté très souvent il peut être intéressant de limiter les écriture/suppression du vbscript et du fichier tmp pour pas fatiguer inutilement ton lecteur.

Discussions similaires

  1. [Batch] Suppression de répertoire en fonction de leur date
    Par renowep dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 17/01/2014, 21h23
  2. Réponses: 6
    Dernier message: 15/10/2009, 12h14
  3. Batch et répertoire avec accent
    Par krfa1 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 28/10/2005, 10h31
  4. Affichage d'évènements en fonction de leur date ?
    Par swirtel dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/05/2005, 10h30
  5. fonction réduisant la taille d'un fichier
    Par Harry_polin dans le forum C
    Réponses: 22
    Dernier message: 27/11/2003, 13h56

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