jeudi 12 septembre 2013

Fichiers non modifiés depuis x jours.

Dans l'exemple suivant, nous allons voir comment afficher les fichiers d'une arborescence qui n'ont pas été modifié depuis x jours. Ceci est parfois utile pour nettoyer les logs ou pour les dossiers publics "temporaire" :


 
#Affiche les fichiers non modifiées depuis plus de 30 jours.
$age = -30             #en jour.
$dossier = "C:\tmp1"   #dossier à traiter.

#J'utilise la commande Get-ChildItem pour récupérer tout
#les éléments d'un répertoires.
#L'option -Recurse permet le traitement de tout les sous-dossiers.
Get-ChildItem $dossier -Recurse |
  foreach {
            #Pour chaque élément je recupère la date de dernière modification,
            #puis je la compare à la date courante moins 30 jours.
            if ($_.LastWriteTime -le (Get-Date).AddDays($age))
              {
                #Si le fichier à été modifié il y plus de 30 jours,
                #je l'affiche dans la console.
                Write-Host $_.LastWriteTime "-" $_.Name "-" $_.FullName
              }
          }

#Fin.


L'exemple suivant est un peu plus complet. Il affiche une fenêtré qui permet de sélectionner le répertoire source et affiche le résultat dans la fenêtre. Les boutons en bas de la fenêtre permettent de supprimer ou de déplacer les fichiers trouvés :


 
#Ouvre une fenêtre qui afficher les fichiers non modifiées depuis plus de x jours.
#Vous pouvez alors les supprimer ou de les déplacer vers un nouveau répertoire.
#A noter : L'option "déplacer" ne conserve pas l'arborescence.

[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

$pf = @()   #Mémorise la liste des fichiers trouvés.

$form = New-Object Windows.Forms.Form
$form.text = "Fichiers modifiés il y plus de x jours."
$form.Size = New-Object System.Drawing.Size(367,500)

#Création d'un label (Label).
$label1 = New-Object Windows.Forms.Label
$label1.Location = New-Object Drawing.Point 20,13
$label1.Size = New-Object Drawing.Point 70,16
$label1.text = "Source"

#Création d'une zone texte (TextBox).
$texte1 = New-Object Windows.Forms.TextBox
$texte1.Location = New-Object Drawing.Point 90,10
$texte1.Size = New-Object Drawing.Point 168,30
$texte1.Text = "C:\tmp1"

#Création d'un bouton parcourir (Button + OpenFileDialog).
$bouton1 = New-Object Windows.Forms.Button
$bouton1.Location = New-Object Drawing.Point 260,09
$bouton1.Size = New-Object Drawing.Point 80,22
$bouton1.text = "Parcourir"
$bouton1.add_click({
            #J'ouvre une fenêtre de dialogue pour sélectionner la source.
            $dossier1 = New-Object System.Windows.Forms.FolderBrowserDialog
            $retour1 = $dossier1.ShowDialog()
            if ($retour1 -eq "OK") { $texte1.Text = $dossier1.SelectedPath }
            else {  $texte1.Text = "C:\" }
                  })

#Création d'un label (Label).
$label2 = New-Object Windows.Forms.Label
$label2.Location = New-Object Drawing.Point 20,36
$label2.Size = New-Object Drawing.Point 70,16
$label2.text = "Destination"

#Création d'une zone texte (TextBox).
$texte2 = New-Object Windows.Forms.TextBox
$texte2.Location = New-Object Drawing.Point 90,33
$texte2.Size = New-Object Drawing.Point 168,30
$texte2.Text = "C:\tmp2"

#Création d'un bouton parcourir (Button + OpenFileDialog).
$bouton2 = New-Object Windows.Forms.Button
$bouton2.Location = New-Object Drawing.Point 260,32
$bouton2.Size = New-Object Drawing.Point 80,22
$bouton2.text = "Parcourir"
$bouton2.add_click({
             #J'ouvre une fenêtre de dialogue pour sélectionner la destination.
             $dossier2 = New-Object System.Windows.Forms.FolderBrowserDialog
             $retour2 = $dossier2.ShowDialog()
             if ($retour2 -eq "OK") { $texte2.Text = $dossier2.SelectedPath }
             else {  $texte2.Text = "C:\"  }
                  })

#Création d'un label (Label).
$label3 = New-Object Windows.Forms.Label
$label3.Location = New-Object Drawing.Point 20,59
$label3.Size = New-Object System.Drawing.Size(150,16)
$label3.text = "Fichiers modifiés il y plus de"

#Création d'une zone texte (TextBox).
$texte3 = New-Object Windows.Forms.TextBox
$texte3.Location = New-Object Drawing.Point 160,56
$texte3.Size = New-Object Drawing.Point 50,16
$texte3.text = "0"

#Création d'un label (Label).
$label4 = New-Object Windows.Forms.Label
$label4.Location = New-Object Drawing.Point 215,59
$label4.Size = New-Object System.Drawing.Size(30,16)
$label4.text = "jours."

#Bouton Chercher.
$bouton3 = New-Object Windows.Forms.Button
$bouton3.Location = New-Object Drawing.Point 260,55
$bouton3.Size = New-Object System.Drawing.Size(80,22)
$bouton3.text = "Chercher"
$bouton3.add_click({
             $afs = 0           #Efface la taille totale des fichiers trouvés.
             $texte4.text = ""  #Efface l'affichage des fichiers trouvés.
             $pf = @()          #Efface la mémoire.
             Get-ChildItem $texte1.Text -Recurse |
             foreach
              {
                if ($_.GetType().Name -eq "FileInfo")
                  {
                    if ($_.LastWriteTime -le (Get-Date).AddDays(-([int]$texte3.text)))
                     {
                       #J'affiche le fichier trouvé dans la fenêtre.
                       $texte4.text = $texte4.text + $_.LastWriteTime
                       $texte4.text = $texte4.text + "       " + $_.Name + "`r`n"
                       #Je mémorise le nom du fichier trouvé.
                       $pf += ,@($_.FullName)
                       #Je cumule les tailles des fichiers trouvés dans $afs.
                       $afs = $afs + $_.length
                     }
                  }
               }
             #Je récupère la taille totale des fichiers affichés (en octets),
             #et je converti le tout en Méga octet.
             $afs = [math]::round((($afs / 1024) / 1024), 2)
             #J'affiche une dernière ligne avec la taille total des fichiers.
             $texte4.text = $texte4.text + "Total size = " + $afs + " Mb"
                  })

#Création d'une zone texte (TextBox).
$texte4 = New-Object Windows.Forms.TextBox
$texte4.Location = New-Object Drawing.Point 20,80
$texte4.Size = New-Object Drawing.Point 318,340
$texte4.Multiline = $True
$texte4.WordWrap = $False
$texte4.ReadOnly = $True
$texte4.backcolor = "white"
$texte4.ScrollBars = "Both"

#Bouton déplacer.
$bouton4 = New-Object Windows.Forms.Button
$bouton4.Location = New-Object Drawing.Point 20,430
$bouton4.Size = New-Object System.Drawing.Size(80,22)
$bouton4.text = "Déplacer"
$bouton4.add_click({
                     foreach ($e in $pf)
                      {
                        #Je déplace les fichiers vers le dossier destination.
                        Move-Item $e $texte2.Text -force
                        #Et je réinitialiser l'affichage et la mémoire.
                        $texte4.text = ""
                        $pf = @()
                      }
                   })
#Bouton supprimer.
$bouton5 = New-Object Windows.Forms.Button
$bouton5.Location = New-Object Drawing.Point 260,430
$bouton5.Size = New-Object System.Drawing.Size(80,22)
$bouton5.text = "Supprimer"
$bouton5.add_click({
                     foreach ($e in $pf)
                      {
                        #Je supprime les fichiers trouvés.
                        Remove-Item $e -force
                        #Et je réinitialiser l'affichage et la mémoire.
                        $texte4.text = ""
                        $pf = @()
                      }
                   })

#Attache les contrôles à la fenêtre.
$form.controls.add($label1)
$form.controls.add($texte1)
$form.controls.add($bouton1)
$form.controls.add($label1)
$form.controls.add($texte2)
$form.controls.add($bouton2)
$form.controls.add($label2)
$form.controls.add($texte3)
$form.controls.add($texte4)
$form.controls.add($label3)
$form.controls.add($label4)
$form.controls.add($bouton3)
$form.controls.add($bouton4)
$form.controls.add($bouton5)

#Affiche le tout.
$form.ShowDialog()

#Fin.