Question Performance de gci ?

Plus d'informations
il y a 11 ans 7 mois #3813 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Performance de gci ?
Salut,
clem écrit:

Je viens de lancer le script avec tes modifs et le temps de traitement est passé à 1h15 environ, c'est déja mieux !

:)
clem écrit:

A quels améliorations pensais tu ?

Ne pas logger au fil de l'eau mais uniquement en fin de traitement.Ainsi les accès disques sont minimiser, par exemple :
[code:1]
#variable contenant les types de fichiers à rechercher
$ext_pattern_All=\"*.mp3\",\"*.wma\",\"*.wav\",\"*.aac\",\"*.ogg\",\"*.avi\",\"*.mpg\",\"*.mpeg\",\"*.wmv\",\"*.mov\",\"*.divx\",\"*.mp4\",\"*.rm\",\"*.mkv\",\"*.jpg\",\"*.jpeg\",\"*.bmp\"
del -Path c:\*.txt -include \"Video.txt\",\"Audio.txt\",\"Photo.txt\" -force -ea silentlycontinue
#Liste de log contenant les répertoires utilisateurs supérieure au quota de recherche fixé
$AudioLog=new-object System.Text.StringBuilder 4096
$VideoLog=new-object System.Text.StringBuilder 4096
$PhotoLog=new-object System.Text.StringBuilder 4096

Get-ChildItem -Path \"C:\Documents and Settings\Dardenne\Mes documents\"|where {$_.PSIsContainer}|Foreach {
#Initialisations
$SizeofAudioFile=0
$SizeofVideoFile=0
$SizeofPhotoFile=0
$NbAudio=0
$NbVideo=0
$NbPhoto=0

$CurrentDir=$_
#afficher le nom du dossiers en cours de traitement
Write-Host $CurrentDir.fullname

Get-ChildItem $CurrentDir.fullname -Recurse -include $ext_pattern_All|Foreach {
$CurrentFile=$_
Switch -Regex ($CurrentFile.Extension) {
\"\.mp3|\.wma|\.wav|\.aac|\.ogg\" {
$sizeofaudiofile+=$CurrentFile.length
$NbAudio++
}

\"\.avi|\.mpg|\.mpeg|\.wmv|\.mov|\.divx|\.mp4|\.rm|\.mkv\" {
$sizeofvideofile+=$CurrentFile.length
$NbVideo++
}

\"\.jpg|\.jpeg|\.bmp\" {
$sizeofphotofile+=$CurrentFile.Length
$NbPhoto++
}

}#Switch
} #$CurrentFile
# Arrondi la taille à 2 décimale
$SizeofAudioFile = [math]::round(($SizeofAudioFile/1MB ), 2)
$SizeofVideoFile = [math]::round(($SizeofVideoFile/1MB ), 2)
$SizeofPhotoFile = [math]::round(($SizeofPhotoFile /1MB ), 2)


if ($SizeofVideoFile -gt 5)
{ [void]$VideoLog.Append( (\"{0} {1} Mo`r`n\" -F $CurrentDir.FullName,$SizeofVideoFile) )}
if ($SizeofAudioFile -gt 5)
{ [void]$AudioLog.Append( (\"{0} {1}Mo`r`n\" -F $CurrentDir.fullname,$SizeofAudioFile) )}
if ($SizeofPhotoFile -gt 5)
{ [void]$PhotoLog.Append( (\"{0} {1}Mo`r`n\" -F $CurrentDir.fullname,$SizeofPhotoFile) )}

Write-Host \"audio: $NbAudio fichiers $SizeofAudioFile Mo\"
Write-Host \"video: $NbVideo fichiers $SizeofVideoFile Mo\"
Write-Host \"photo: $NbPhoto fichiers $SizeofPhotoFile Mo`r`n\"
} #$CurrentDir

if ($VideoLog.Length -gt 0 ) {$VideoLog.ToString()>>c:\Video.txt}
if ($AudioLog.Length -gt 0 ) {$AudioLog.ToString()>>c:\Audio.txt}
if ($PhotoLog.Length -gt 0 ) {$PhotoLog.ToString()>>c:\Photo.txt}
[/code:1]
Mais cela dépend de la taille du log, si tu as qq centaines ou plusieurs milliers de comptes utilisateurs. Dans ce cas l'occupation mémoire peut être importante. A vérifier donc.

clem écrit:

Seulement voila, je ne sais pas si la classe net.mail de framework me permet d'envoyer des mails sous exchange, ni si elle gere les mails html.

Peut être en utilisant directement SMTP et pour le html cela reste un contenu comme un autre.
Pour Outlook effectivement c'est une sécurité qu'il n'est pas possible de désactiver.

Tu peux rechercher sur le forum ou sur Google autour de \"C# smtp Mail\" par exemple. Ensuite on regarde si le portage est possible.
Voir aussi utiliser des cmdlets dédiés payants.<br><br>Message édité par: Laurent Dardenne, à: 26/01/09 14:08

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 7 mois #3814 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Performance de gci ?
Pour info j'ai modifié le second script joint.

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 7 mois #3817 par janel
Réponse de janel sur le sujet Re:Performance de gci ?
Pour améliorer les perfs en lecture sur de grands volumes, on peut aussi remplacer le gci par un appel direct à des méthodes .NET, comme [System.IO.Directory]::GetFiles(). Avec cette méthode on perd la possibilité de passer plusieurs filtres en une seule commande (et on revient donc à la solution d'origine consistant à enchaîner les recherches extension par extension) mais le gain en performance peut être substantiel.

Un petit script pour encapsuler la méthode GetFiles() :

-- get-files.ps1
[code:1]
param (
$path = $pwd.path,
$searchPattern = \&quot;*\&quot;,
[switch]$recurse = $false
)

switch ($recurse) {
$false {$searchOption = \&quot;TopDirectoryOnly\&quot;}
$true {$searchOption = \&quot;AllDirectories\&quot;}
}

[System.IO.Directory]::GetFiles($path,$searchPattern,$searchOption)
[/code:1]
Exemple d'usage :
[code:1]
PS&gt; $programs = get-files \&quot;c:\program files\&quot; *.exe -rec
[/code:1]
J'ai fait des tests très sommaires sur mon poste et j'ai constaté des temps de traitement au moins divisés par deux, voire plus. A voir sur de plus grands volumes si le gain est similaire.

Attention, la méthode GetFiles() peut retourner une exception si on n'a pas accès à un répertoire ou un fichier, auquel cas toute la recherche s'arrête (alors qu'avec gci on peut dire à PowerShell de continuer avec le répertoire ou le fichier suivant).

Janel

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

Plus d'informations
il y a 11 ans 7 mois #3820 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Performance de gci ?
janel écrit:

et on revient donc à la solution d'origine consistant à enchaîner les recherches extension par extension

Même pas puisque qu'on récupère un tableau contenant tous les fichiers, l'instruction switch effectuant le calcul sur les éléments du tableau. Encore faut-il avoir le temps de tester les différents scénarios :S

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 7 mois #3825 par Arnaud
Réponse de Arnaud sur le sujet Re:Performance de gci ?
Salut !,

Pour améliorer les performances, peut-être que le mieux serait d'éxécuter le script directement sur le serveur via une tâche planifiée par exemple ?

Arnaud

Créateur du forum de la communauté PowerShell Francophone

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

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