Question
Performance de gci ?
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 15 ans 2 mois #3813
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Performance de gci ?
Salut,
clem écrit:
clem écrit:
[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:
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
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:
Ne pas logger au fil de l'eau mais uniquement en fin de traitement.Ainsi les accès disques sont minimiser, par exemple :A quels améliorations pensais tu ?
[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:
Peut être en utilisant directement SMTP et pour le html cela reste un contenu comme un autre.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.
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 15 ans 2 mois #3814
par Laurent Dardenne
Tutoriels PowerShell
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.
- Jacques Barathon
- Hors Ligne
- Administrateur
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 15 ans 2 mois #3817
par Jacques Barathon
Réponse de Jacques Barathon 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 = \"*\",
[switch]$recurse = $false
)
switch ($recurse) {
$false {$searchOption = \"TopDirectoryOnly\"}
$true {$searchOption = \"AllDirectories\"}
}
[System.IO.Directory]::GetFiles($path,$searchPattern,$searchOption)
[/code:1]
Exemple d'usage :
[code:1]
PS> $programs = get-files \"c:\program files\" *.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
Un petit script pour encapsuler la méthode GetFiles() :
-- get-files.ps1
[code:1]
param (
$path = $pwd.path,
$searchPattern = \"*\",
[switch]$recurse = $false
)
switch ($recurse) {
$false {$searchOption = \"TopDirectoryOnly\"}
$true {$searchOption = \"AllDirectories\"}
}
[System.IO.Directory]::GetFiles($path,$searchPattern,$searchOption)
[/code:1]
Exemple d'usage :
[code:1]
PS> $programs = get-files \"c:\program files\" *.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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 15 ans 2 mois #3820
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Performance de gci ?
janel écrit:
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énarioset on revient donc à la solution d'origine consistant à enchaîner les recherches extension par extension
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 15 ans 2 mois #3825
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean 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
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
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.082 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Performance de gci ?