Question Balayage d'une arborescence / Archives, Listing...

Plus d'informations
il y a 11 ans 2 semaines #19211 par Raphaël Turmeau
Bonjour,

Voici deux petits scripts de débutant. Le premier permet de réaliser la fonction suivante :
Balayer toute une arborescence en utilisant certains critères et archiver tous les fichiers/dossiers datant de plus de 3 ans à l’intérieur d’un certain répertoire appelé « Mesure ». Ce répertoire contient des millions de fichiers de calcul, ce qui n’est pas très volumineux mais c’est surtout le nombre qui pose problème.

En effet ce nombre important de fichiers découle une problématique intéressante basée l’optimisation des méthodes de recherches de fichiers (avec Get-ChildItem notamment) qui est évoquée sur le deuxième script.

L'arborescence se présente sous la forme Métrologie => 4 bancs de mesure différents => Plusieurs années par bancs => Mesure => Millions de fichiers/dossiers

Je débute tout juste donc ce script n’est sûrement pas optimisé mais est globalement fonctionnel :

[code:1]
Set-Alias sz \"H:\7z.exe\"
$nbArchiv = 0
cd Z:\
$CurrentDate = Get-date
echo \"`n`n`n #################################### `n`n DATE DU DERNIER ARCHIVAGE : $CurrentDate ##########################`n\" >> \"Z:\Archivage\logArchiv.txt\"

$bancList = Get-ChildItem -PATH \"\Métrologie\" | Where-Object {$_.Name -eq \"ELAN\" -or $_.Name -eq \"SISPEO\" -or $_.Name -eq \"NEWVIEW\" -or $_.Name -eq \"LUTIN\"}| ForEach-Object {$_.Name}

for ($cpt1 = 0; $cpt1 -lt $bancList.Length; $cpt1++)
{
$banc = $bancList[$cpt1]
cd -PATH \"Z:\Métrologie\$banc\\"
echo \"`n`n___________ OPERATIONS D'ARCHIVAGE DANS $banc ________________`n\" >> \"Z:\Archivage\logArchiv.txt\"

$DateToCompare = ((Get-date).Year)-3
$anneeList = Get-ChildItem | Where-Object {$_.Attributes -match \"Directory\" -and $_.Name -like \"20*\" -and $_.Name -lt $DateToCompare}| ForEach-Object {$_.name}
for ($cpt2 = 0; $cpt2 -lt $anneeList.Length; $cpt2++)
{
$annee = $anneeList[$cpt2]
cd -PATH \"Z:\Métrologie\$banc\$annee\"

$nbRepAnn = (Get-ChildItem | Where-Object{$_.Attributes -match \"Directory\" -and ($_.Name -like \"*esure*\"«»)} | Measure).Count
if ($nbRepAnn -eq 0)
{
echo \"`n..\$annee\ -> Il n'y a pas de dossier mesure(s) !\" >> \"Z:\Archivage\logArchiv.txt\"
}
else
{
$Mesure = (Get-ChildItem | Where-Object{$_.Attributes -match \"Directory\" -and ($_.Name -like \"*esure*\"«»)}).Name
cd -PATH \"Z:\Métrologie\$banc\$annee\$Mesure\"

$nbRepMes = (Get-ChildItem | Where-Object{$_.Attributes -match \"Directory\"} | Measure).Count
echo \"`n..\$annee\$Mesure -> $nbRepMes sous-répertoire(s) à archiver`n\" >> \"Z:\Archivage\logArchiv.txt\"
if ($nbRepMes -eq 0)
{
echo \"Aucune opération d'archivage\" >> \"Z:\Archivage\logArchiv.txt\"
}
else
{
if ($nbRepMes -eq 1)
{
$1archive = (Get-ChildItem | Where-Object{$_.Attributes -match \"Directory\"}).Name
echo \"Archivage de '$1archive'\" >> \"Z:\Archivage\logArchiv.txt\"
sz a \"$1archive.zip\" \"Z:\Métrologie\$banc\$annee\$Mesure\$1archive\"
Remove-Item $1archive -recurse
$nbArchiv++
}
else
{
$archivList = Get-ChildItem | Where-Object{$_.Attributes -match \"Directory\"} | ForEach-Object {$_.name}
for ($cpt4 = 0; $cpt4 -lt $archivList.Length; $cpt4++)
{
$archives = $archivList[$cpt4]
echo \"Archivage de '$archives'\" >> \"Z:\Archivage\logArchiv.txt\"
sz a \"$archives.zip\" \"Z:\Métrologie\$banc\$annee\$Mesure\$archives\"
Remove-Item $archives -recurse
$nbArchiv++
}
}
}
}
}
}
echo \"`n______TOTAL______`n`n => Au total $nbArchiv sous-répertoire(s) ont été archivé\" >> \"Z:\Archivage\logArchiv.txt\"
echo \"`n #################################### `n`n FIN DU TRAITEMENT : $CurrentDate ##########################`n\" >> \"Z:\Archivage\logArchiv.txt\"
cd Z:\
echo \"###### FIN DU TRAITEMENT : $CurrentDate ############\" [/code:1]


D’ailleurs j’ai juste une erreur : je n’arrive pas à supprimer les fichiers cachés « Thumbs.db » par l’intermédiaire de ce script. Existe-t-il une option à mettre pour supprimer quand même ce type de fichier ?

J’utilise l’exécutable 7zip pour archiver les fichiers, il existe une méthode avec Powershell mais j’avoue que je n’ai pas eu le temps de m’y pencher d’autant plus que je travaillais sur Powershell 2.0 qui ne supporte pas encore l’archive de répertoire.


Le deuxième script réalise la fonction suivante :
Faire un listing de tous ces fichiers avec calcul de la taille avant et après archivage et c’est là que le nombre de fichiers et dossiers de l’arborescence posait problème étant donné que la méthode basique avec « get-childItem » prenait beaucoup trop de temps.
Une solution est expliquée dans ce sujet :
powershell-scripting.com/index.php?optio...id=19212&catid=5

Du coup voici le script qui est fortement inspiré de celui-ci-dessus pour calculer la taille des fichiers et sous-répertoires :

[code:1]$tailleTotale = 0
cd Z:\
$CurrentDate = Get-date
echo \"`n`n`n ********************************* `n`n DATE DU DERNIER CALCUL: $CurrentDate ********************************`n\" >> \"Z:\Archivage\ListingFichiers.txt\"
$bancList = Get-ChildItem -PATH \"\Métrologie\" | Where-Object {$_.Name -eq \"ELAN\" -or $_.Name -eq \"SISPEO\" -or $_.Name -eq \"NEWVIEW\" -or $_.Name -eq \"LUTIN\"}| ForEach-Object {$_.Name}
for ($cpt1 = 0; $cpt1 -lt $bancList.Length; $cpt1++)
{
$tailleBanc =0
$banc = $bancList[$cpt1]
cd -PATH \"Z:\Métrologie\$banc\\"
echo \"`n`n___________ $banc ________________`n\" >> \"Z:\Archivage\ListingFichiers.txt\"
$anneeList = Get-ChildItem | Where-Object {$_.Attributes -match \"Directory\" -and $_.Name -like \"20*\"}| ForEach-Object {$_.name}
for ($cpt2 = 0; $cpt2 -lt $anneeList.Length; $cpt2++)
{
$annee = $anneeList[$cpt2]
$tailleAnnee = 0

cd -PATH \"Z:\Métrologie\$banc\$annee\"
echo \"..\$annee\`n\" >> \"Z:\Archivage\ListingFichiers.txt\"
$nbRepAnn = (Get-ChildItem | Where-Object{$_.Attributes -match \"Directory\" -and ($_.Name -like \"*esure*\"«»)} | Measure).Count
if ($nbRepAnn -eq 0)
{
echo \"Il n'y a pas de dossier mesure(s) !\" >> \"Z:\Archivage\ListingFichiers.txt\"
}
else
{
$Mesure = (Get-ChildItem | Where-Object{$_.Attributes -match \"Directory\" -and ($_.Name -like \"*esure*\"«»)}).Name
cd -PATH \"Z:\Métrologie\$banc\$annee\$Mesure\"
$nbRepMes = (Get-ChildItem | Where-Object{$_.Attributes -match \"Directory\"} | Measure).Count

if ($nbRepMes -eq 0)
{
echo \"Aucun sous-répertoire\" >> \"Z:\Archivage\ListingFichiers.txt\"
}
else
{
if ($nbRepMes -eq 1)
{
$1archive = (Get-ChildItem | Where-Object{$_.Attributes -match \"Directory\"}).Name
$FSO = New-Object -com Scripting.FileSystemObject
$FolderPath = \"Z:\Métrologie\$banc\$annee\$Mesure\$1archive\"
$taille = [math]::Round(($FSO.GetFolder($FolderPath).Size)/1MB,2)
echo \"Répertoire '$1archive' : $taille Mo\" >> \"Z:\Archivage\ListingFichiers.txt\"
$tailleAnnee += $taille
$tailleBanc += $taille
$tailleTotale =+ $tailleBanc
}
else
{
$archivList = Get-ChildItem | Where-Object{$_.Attributes -match \"Directory\"} | ForEach-Object {$_.name}
for ($cpt3 = 0; $cpt3-lt $archivList.Length; $cpt3++)
{
$archives = $archivList[$cpt3]
$FSO = New-Object -com Scripting.FileSystemObject
$FolderPath = \"Z:\Métrologie\$banc\$annee\$Mesure\$archives\"
$taille = [math]::Round(($FSO.GetFolder($FolderPath).Size)/1MB,2)
$tailleAnnee += $taille
$tailleBanc += $taille
$tailleTotale =+ $tailleBanc
echo \"Répertoire '$archives' = $taille Mo \" >> \"Z:\Archivage\ListingFichiers.txt\"
}

}
}
}
echo \"`n => Taille $banc\$annee\ : $tailleAnnee Mo`n\" >> \"Z:\Archivage\ListingFichiers.txt\"
}
echo \"=> Total banc (années) : $tailleBanc Mo\" >> \"Z:\Archivage\ListingFichiers.txt\"
}
echo \"`n______TOTAL______`n`n => $tailleTotale Mo\" >> \"Z:\Archivage\ListingFichiers.txt\"
echo \"`n`n ********************************* `n`n FIN DU CALCUL: $CurrentDate ********************************`n\" >> \"Z:\Archivage\ListingFichiers.txt\"
cd Z:\[/code:1]


Pareil ce script n'est pas forcément très optimisé...

Si vous avez des améliorations en tête ou une piste pour l'erreur du premier script n'hésitez pas ! ;-)<br><br>Message édité par: rafistol, à: 6/03/15 23:04

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.039 secondes
Propulsé par Kunena