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 :

Trier fichiers par extension


Sujet :

Scripts/Batch

  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Par défaut Trier fichiers par extension
    Bonjour

    J'ai un dossier : C:\Temp\Recup avec plus de 30'000 fichiers à l'intérieur, avec des extensions différentes, .mp3, .JPG, .png, .dll, .exe ...

    Je souhaite faire un script qui copie tous les fichiers .mp3 dans un dossier MP3, .JPG dans un dossier JPG, et ainsi de suite en automatique. Le dossier aurait simplement le nom de l'extension des fichiers qui y sont en automatique !

    Pouvez-vous m'aider ?

    Merci.

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Une piste :
    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
    $Source='C:\Temp'
    $Destination='C:\Temp'
    
    $grp=Dir $Source -File |Group-Object -Property Extension
    $grp[0].Name
    $grp[0].Group
    
    $NewDirectory="$Destination\$($grp[0].Name)"
    MD $NewDirectory 
    
    $grp[0].Group|Copy-Item $NewDirectory -WhatIf
    #ou
    #$grp[0].Group|Move-Item $NewDirectory -WhatIf
    
    #Next ...
    # Dir $Source -File |
    #    Group-Object -Property Extension|
    #    Foreach {
    #      $_|
    #       Foreach {
    #         Write-verbose "Copie les fichiers d'extension '$($_.Name)'"
    #         ....
    #       }
    #    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Par défaut
    Un grand merci pour ton aide !

    Cependant j'ai une petite erreur :

    Copy-Item : L'objet d'entrée ne peut être lié à aucun paramètre de la commande, soit parce que cette commande
    n'accepte pas l'entrée de pipeline, soit parce que l'entrée et ses propriétés ne correspondent à aucun des paramètres
    qui acceptent l'entrée de pipeline.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:11 : 17
    + $grp[0].Group | Copy-Item $NewDirectory
    + ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidArgument : (f6628495.xmlSObject) [Copy-Item], ParameterBindingException
    + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.CopyItemCommand

    Le code :

    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
    $Source='C:\Temp\Test'
    $Destination='C:\Temp\Test\Tri'
    
    $grp=Dir $Source -File |Group-Object -Property Extension
    $grp[0].Name
    $grp[0].Group
    
    $NewDirectory="$Destination\$($grp[0].Name)"
    MD $NewDirectory 
    
    #$grp[0].Group | Copy-Item $NewDirectory -WhatIf
    $grp[0].Group|Move-Item $NewDirectory -WhatIf
    
    Dir $Source -File |
        Group-Object -Property Extension|
        Foreach {
          $_|
           Foreach {
             Write-verbose "Copie les fichiers d'extension '$($_.Name)'"
           }
        }
    EDIT : ça fonctionne avec ce code, j'ai rajouté -Destination au Move-Item :

    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
    $Source='C:\Temp\Test'
    $Destination='C:\Temp\Test\Tri'
    
    $grp=Dir $Source -File |Group-Object -Property Extension
    $grp[0].Name
    $grp[0].Group
    
    $NewDirectory="$Destination\$($grp[0].Name)"
    MD $NewDirectory 
    
    #$grp[0].Group | Copy-Item $NewDirectory -WhatIf
    $grp[0].Group | Move-Item -Destination $NewDirectory -Verbose
    
    Dir $Source -File |
        Group-Object -Property Extension|
        Foreach {
          $_|
           Foreach {
             Write-verbose "Copie les fichiers d'extension '$($_.Name)'"
           }
        }
    Par contre ça ne me le fait pas pour toutes les extensions mais que pour le premier fichier

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par steve15 Voir le message
    Cependant j'ai une petite erreur :
    Oui, il faut ajouter -Destination. J'ai testé le déplacement, mais pas la copie...
    Ceci dit, la réponse est dans l'aide en ligne

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Par défaut
    Oui c'est en ordre ! par contre, je suis bloqué il me fait que la première extension de la liste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $grp[0].Name
    $grp[0].Group
    C'est la valeur 0 qui dit qu'il prend le premier fichier, si je met 1 il me prend la seconde extension, comment être dynamique et le faire pour tous en automatique ?

    Je pense qu'il faudrait mettre tout ce morceau de code dans une boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $grp=Dir $Source -File |Group-Object -Property Extension
    $grp[0].Name
    $grp[0].Group
    
    $NewDirectory="$Destination\$($grp[0].Name)"
    MD $NewDirectory 
    
    #$grp[0].Group | Copy-Item $NewDirectory -WhatIf
    $grp[0].Group | Move-Item -Destination $NewDirectory -Verbose
    mais je suis pas sûr et pas encore assez expérimenté !! Merci.

    merci.

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par steve15 Voir le message
    par contre, je suis bloqué il me fait que la première extension de la liste.
    Oui le code traite le premier groupe. C'était juste pour 'détailler' l'approche, à priori il te faudrait bien plus de détails
    Dans le code de test cité la seconde partie commentée est une approche possible pour traiter toute la collection. J'utilise le pipeline, mais tu peux utiliser des variables intermédiaires et des boucles Foreach pour aérer le code.

    En passant, le nom de répertoire $NewDirectory contient le '.' de l'extension, il faut donc le supprimer.
    Citation Envoyé par steve15 Voir le message
    mais je suis pas sûr et pas encore assez expérimenté
    Avec un jeux de test et l'usage du paramètre Whatif, aucun risque. Et c'est en forgeant que l'on devient forgeron

  7. #7
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Par défaut
    Ok merci

    Mais en gros, Est-ce que tu peux m'aider à compléter mon code pour que ça traite toutes les extensions ?? je sais vraiment pas de quel côté chercher ... merci

    EDIT :

    J'ai fait une boucle de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    While($i -le 10){
    $grp=Get-ChildItem $Source -File | Group-Object -Property Extension
    $grp[0].Name
    $grp[0].Group
    
    $NewDirectory="$Destination\$($grp[0].Name)"
    MD $NewDirectory
    
    #$grp[0].Group | Copy-Item -Destination $NewDirectory -WhatIf
    $grp[0].Group | Move-Item -Destination $NewDirectory -Verbose
    i++
    }
    Donc ça fonctionne nickel ! Par contre la boucle continue à l'infini en rouge j'obtiens :

    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
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:16 : 1
    + $grp[0].Group | Move-Item -Destination $NewDirectory -Verbose
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    
    i++ : Le terme «i++» n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou programme
    exécutable. Vérifiez l'orthographe du nom, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est correct
    et réessayez.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:17 : 1
    + i++
    + ~~~
        + CategoryInfo          : ObjectNotFound: (i++:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
    
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:9 : 1
    + $grp[0].Name
    + ~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:10 : 1
    + $grp[0].Group
    + ~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    Avec une do While aussi une erreur :

    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
    MD : Il existe déjà un élément avec le nom spécifié C:\Temp\Test\Tri\.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:13 : 1
    + MD $NewDirectory
    + ~~~~~~~~~~~~~~~~
        + CategoryInfo          : ResourceExists: (C:\Temp\Test\Tri\:String) [New-Item], IOException
        + FullyQualifiedErrorId : DirectoryExist,Microsoft.PowerShell.Commands.NewItemCommand
    
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:16 : 1
    + $grp[0].Group | Move-Item -Destination $NewDirectory -Verbose
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    
    i++ : Le terme «i++» n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou programme
    exécutable. Vérifiez l'orthographe du nom, ou si un chemin d'accès existe, vérifiez que le chemin d'accès est correct
    et réessayez.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:17 : 1
    + i++
    + ~~~
        + CategoryInfo          : ObjectNotFound: (i++:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
    Mon problème est certainement que je mets 10 dans le paramètre ($i -le 10)
    Du coup , avec cette ligne je mets dans une variable $j le nombre de lignes ($i -le $j) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $j=Get-ChildItem | Sort-Object -Property extension | Group-Object -Property extension | Measure-Object-Line
    Le problème est que cette ligne me retourne pas "7", mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                            Lines Words                         Characters                    Property
                            ----- -----                         ----------                    --------
                                7
    Comment mettre que la value Line Words ?

  8. #8
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Par défaut
    Voilà mon code complet :

    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
    $Source='C:\Temp\Test\'
    $Destination='C:\Temp\Test\Tri'
    $i=1
    $j=0
    
    Get-ChildItem $Source -include *.html,*.txt,*.riff,*.swf,*.gz,*.xml,*.h,*.swc,*.java,*.gif,*.exe,*.ogg,*.sqlite,*.png,*.dll,*.mui,*.cp_,*.plist,*.wmf,*.ttf,*.iec -Recurse | Remove-Item -Verbose
    
    
    $j=(Get-ChildItem | Sort-Object -Property extension | Group-Object -Property extension | Measure-Object -Line).lines
    
    Do{
    	$grp=Get-ChildItem $Source -File | Group-Object -Property Extension
    	$grp[0].Name
    	$grp[0].Group
    
    	$NewDirectory="$Destination\$($grp[0].Name)"
    	
    	if(Test-Path -Path $NewDirectory)
    		{
    			Write-Host "* Dossier déjà existant"  -ForegroundColor Red
    		}
    	else
    		{
    			Write-Host "* Dossier à créer"  -ForegroundColor Red
    			MD $NewDirectory
    		}
    
    	#$grp[0].Group | Copy-Item -Destination $NewDirectory -WhatIf
    	$grp[0].Group | Move-Item -Destination $NewDirectory -Verbose
    	$i++
    } While ($i -le $j)
    
    Get-ChildItem $Source -File |
        Group-Object -Property Extension |
        Foreach {
          $_|
           Foreach {
             Write-verbose "Copie les fichiers d'extension '$($_.Name)'"
           }
        }
    J'ai tester si le répertoire existe déjà pour pas qu'il fasse une erreur inutile lorsqu'il boucle pour recréer le répertoire alors qu'il existe déjà
    Cependant j'ai encore une erreur :

    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
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:13 : 2
    +     $grp[0].Name
    +     ~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:14 : 2
    +     $grp[0].Group
    +     ~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:16 : 32
    +     $NewDirectory="$Destination\$($grp[0].Name)"
    +                                   ~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    
    * Dossier déjà existant
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:29 : 2
    +     $grp[0].Group | Move-Item -Destination $NewDirectory -Verbose
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:13 : 2
    +     $grp[0].Name
    +     ~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:14 : 2
    +     $grp[0].Group
    +     ~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:16 : 32
    +     $NewDirectory="$Destination\$($grp[0].Name)"
    +                                   ~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    
    * Dossier déjà existant
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:29 : 2
    +     $grp[0].Group | Move-Item -Destination $NewDirectory -Verbose
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:13 : 2
    +     $grp[0].Name
    +     ~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    
    Indexation impossible dans un tableau Null.
    Au caractère H:\Scripts\Tri_par_extensions.ps1:14 : 2
    +     $grp[0].Group
    +     ~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray
    Merci

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Une autre approche simple sans gestion d'erreur :
    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
    $VerbosePreference='Continue'
    $ExtensionGroupes= Dir $Source -File | Group-Object -Property Extension
    Foreach ($Groupe in $ExtensionGroupes) {
       Write-verbose ('Copie les fichiers d''extension "{0}" ({1})' -F $Groupe.Name,$Groupe.Count)
      
       if ($Groupe.Name.Length -eq 0) 
       {Write-Error "Extension inexistante";Continue} #TODO fichiers sans extension 
       $Name=$Groupe.Name -replace '^\.',''
       $NewDirectory="$Destination\$Name"
       
       if (-not (Test-Path -LiteralPath $NewDirectory)) 
       { MD $NewDirectory > $null }  
       
       Foreach ($Fichier in $Groupe.Group) {
         #TODO Supprimer -Whatif
         #-Force écrase les fichiers en RO, sinon erreur
         #-LiteralPath copie les fichiers 'Nom[1].txt'
        Copy-Item  -LiteralPath $Fichier -Destination $NewDirectory -WhatIf # -Force 
       }#Group
    }#ExtensionGroupes

Discussions similaires

  1. Shell script pour compter le nombre de fichiers par extension
    Par andress33 dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 30/03/2015, 01h26
  2. [PHP 5.1] Trier fichiers par type apres les avoirs lister
    Par ketaaa dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2009, 21h47
  3. Réponses: 1
    Dernier message: 11/05/2009, 13h47
  4. Sélectionner un fichiers par extension
    Par Michaël dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 24/06/2006, 22h42
  5. [apache] .htaccess -> bloquer fichiers par extensions
    Par yann_441 dans le forum Apache
    Réponses: 2
    Dernier message: 01/07/2005, 18h14

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