Question
Comment optimiser un script - gestion d'exceptions
- Florent
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 26
- Remerciements reçus 0
il y a 10 ans 2 mois #21600
par Florent
Comment optimiser un script - gestion d'exceptions a été créé par Florent
Bonjour !
Tout d'abord, je me réjouis de rejoindre votre communauté... ma découverte de Powershell est récente, je suis donc débutant.
Entrons dans le vif du sujet ! alors voilà. J'ai concu un script pour qu'a l'ouverture d'une session windows, il collecte les infos reliées aux imprimantes utilisées par l'utilisateur, pour les poster ensuite à un Webservice.
[code:1]
$WebSvcURL = xxxService.svc'
$proxy = New-WebServiceProxy -Uri $WebSvcURL
$Printers = Get-WmiObject -Query \"Select ServerName,Name,Location,Default from Win32_Printer\" -ComputerName $machine
$PrinterCfgs = Get-WmiObject -Query \"select Name,Orientation,Color from Win32_PrinterConfiguration\" -ComputerName $machine
[/code:1]
Je fusionne ensuite ces deux listes dans une nouvelle liste, dont le modèle est livré par le WebService :
[code:1]$prt = New-Object -TypeName System.Collections.Generic.List``1[Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebService_Service_svc.AuditItem]
Foreach ( $Printer in $Printers ) {
$PrinterCfg = $PrinterCfgs | Where { $_.Name -eq $Printer.Name }
$PrinterInfo = New-Object -TypeName Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebService_Service_svc.AuditItem -Property @{
PrinterSrv = $Printer.ServerName
Printer = $Printer.Name
Default = $Printer.Default
}
$prt += $PrinterInfo
}[/code:1]
Et enfin je poste cette liste a un service web
[code:1]$proxy.RecordElement($userName,$machine, $prt)[/code:1]
Ce code fonctionne, mais je souhaite l'optimiser. En effet, je ne gère aucune exceptions, ni ne sépare mon code en bloc de fonction. Je ne sais pas quel type d'exceptions je dois gérer. A priori je dirai que c'est plus l'appel au Webservice qui risque de planter, car la création des objets Wmi ne devraient pas echouer... Faut-il créer un log dans ce genre de cas ? Merci de vos lumières !
Message édité par: Mrflamby, à: 18/03/16 15:58<br><br>Message édité par: Mrflamby, à: 18/03/16 15:59
Tout d'abord, je me réjouis de rejoindre votre communauté... ma découverte de Powershell est récente, je suis donc débutant.
Entrons dans le vif du sujet ! alors voilà. J'ai concu un script pour qu'a l'ouverture d'une session windows, il collecte les infos reliées aux imprimantes utilisées par l'utilisateur, pour les poster ensuite à un Webservice.
[code:1]
$WebSvcURL = xxxService.svc'
$proxy = New-WebServiceProxy -Uri $WebSvcURL
$Printers = Get-WmiObject -Query \"Select ServerName,Name,Location,Default from Win32_Printer\" -ComputerName $machine
$PrinterCfgs = Get-WmiObject -Query \"select Name,Orientation,Color from Win32_PrinterConfiguration\" -ComputerName $machine
[/code:1]
Je fusionne ensuite ces deux listes dans une nouvelle liste, dont le modèle est livré par le WebService :
[code:1]$prt = New-Object -TypeName System.Collections.Generic.List``1[Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebService_Service_svc.AuditItem]
Foreach ( $Printer in $Printers ) {
$PrinterCfg = $PrinterCfgs | Where { $_.Name -eq $Printer.Name }
$PrinterInfo = New-Object -TypeName Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebService_Service_svc.AuditItem -Property @{
PrinterSrv = $Printer.ServerName
Printer = $Printer.Name
Default = $Printer.Default
}
$prt += $PrinterInfo
}[/code:1]
Et enfin je poste cette liste a un service web
[code:1]$proxy.RecordElement($userName,$machine, $prt)[/code:1]
Ce code fonctionne, mais je souhaite l'optimiser. En effet, je ne gère aucune exceptions, ni ne sépare mon code en bloc de fonction. Je ne sais pas quel type d'exceptions je dois gérer. A priori je dirai que c'est plus l'appel au Webservice qui risque de planter, car la création des objets Wmi ne devraient pas echouer... Faut-il créer un log dans ce genre de cas ? Merci de vos lumières !
Message édité par: Mrflamby, à: 18/03/16 15:58<br><br>Message édité par: Mrflamby, à: 18/03/16 15:59
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 69
il y a 10 ans 2 mois #21603
par xyz
Tutoriels PowerShell
Réponse de xyz sur le sujet Re:Comment optimiser un script - gestion d'exceptions
Salut,
les sources de ce tutoriel propose une fonction nommée Invoke-CommandWithUnhandledExceptions qui gère les exceptions inconnues/imprévues qui correspond tout à fait à ton cas.
les sources de ce tutoriel propose une fonction nommée Invoke-CommandWithUnhandledExceptions qui gère les exceptions inconnues/imprévues qui correspond tout à fait à ton cas.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Florent
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 26
- Remerciements reçus 0
il y a 10 ans 2 mois #21607
par Florent
Réponse de Florent sur le sujet Re:Comment optimiser un script - gestion d'exceptions
Merci beaucoup de cette réponse. Par contre, je ne comprends pas trop comment utiliser la source... faut-il que je copie colle dans mon propre script en mettant à jour la variable $Path ?
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 69
il y a 10 ans 2 mois #21608
par xyz
Tutoriels PowerShell
Réponse de xyz sur le sujet Re:Comment optimiser un script - gestion d'exceptions
Mrflamby écrit:
Un exemple d'usage en prod :
[code:1]
#Invoke-Inventory.ps1
#Projet xxx, exécute l'inventaire
#fichier de test sur le srv zzz 'C:\Temp\Testxxx\UsersTest.txt'
param (
[Parameter(Mandatory=$true,HelpMessage='The file containt a list of emailadress')]
[ValidateScript({Test-Path $_})]
[string]$UsersFile
)
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
#Crée une variable d'environnement utilisée dans
#le fichier de configuration Log4Net.Config.xml
$env:«»xxxLogPath=\"$scriptPath\Logs\"
#Ajoute le répertoire des modules de xxx
$env:«»PSModulepath +=\";$scriptPath\modules\"
#Construit une fonction en substituant le chemin de log
$codeGLE=@\"
function Get-LastErrorInvokeInventory {
`$Fichier=
Dir \"$env:«»xxxLogPath\*.xml\"|
Sort LastWriteTime -Desc|
Select -First 1
If (`$Fichier -eq `$Null)
{ write-Warning \"No file error found in `$env:«»xxxLogPath\" }
else
{
Write-Host \"Loading the last generated error file :\" -Fore Green -Back Black -NoNewLine
Write-Host \" `$Fichier\" -Fore Black -Back green
`$Fichier|Import-Clixml
}
}#Get-LastErrorInvokeInventory
\"@
iex $codeGLE
Function Out-Debuger{...}
Function Invoke-CommandWithUnhandledExceptions { ...}
#traitement d'inventaire
$sbInventory={
... #ICI ton code
}#$sbInventory
#Nettoie la collection d'erreurs avant l'exécution du traitement
$Error.Clear()
Invoke-CommandWithUnhandledExceptions 'InvokeInventory' \"$scriptPath\Logs\" $sbInventory
[/code:1]
Oui. Mais ne connaissant pas ton code/contexte je ne saurais dire si un module serait plus adapté.faut-il que je copie colle dans mon propre script
Un exemple d'usage en prod :
[code:1]
#Invoke-Inventory.ps1
#Projet xxx, exécute l'inventaire
#fichier de test sur le srv zzz 'C:\Temp\Testxxx\UsersTest.txt'
param (
[Parameter(Mandatory=$true,HelpMessage='The file containt a list of emailadress')]
[ValidateScript({Test-Path $_})]
[string]$UsersFile
)
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
#Crée une variable d'environnement utilisée dans
#le fichier de configuration Log4Net.Config.xml
$env:«»xxxLogPath=\"$scriptPath\Logs\"
#Ajoute le répertoire des modules de xxx
$env:«»PSModulepath +=\";$scriptPath\modules\"
#Construit une fonction en substituant le chemin de log
$codeGLE=@\"
function Get-LastErrorInvokeInventory {
`$Fichier=
Dir \"$env:«»xxxLogPath\*.xml\"|
Sort LastWriteTime -Desc|
Select -First 1
If (`$Fichier -eq `$Null)
{ write-Warning \"No file error found in `$env:«»xxxLogPath\" }
else
{
Write-Host \"Loading the last generated error file :\" -Fore Green -Back Black -NoNewLine
Write-Host \" `$Fichier\" -Fore Black -Back green
`$Fichier|Import-Clixml
}
}#Get-LastErrorInvokeInventory
\"@
iex $codeGLE
Function Out-Debuger{...}
Function Invoke-CommandWithUnhandledExceptions { ...}
#traitement d'inventaire
$sbInventory={
... #ICI ton code
}#$sbInventory
#Nettoie la collection d'erreurs avant l'exécution du traitement
$Error.Clear()
Invoke-CommandWithUnhandledExceptions 'InvokeInventory' \"$scriptPath\Logs\" $sbInventory
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 69
il y a 10 ans 2 mois #21609
par xyz
Tutoriels PowerShell
Réponse de xyz sur le sujet Re:Comment optimiser un script - gestion d'exceptions
J'ajoute que la fonction proposée concerne le dev et le support.
Le dev afin de recenser puis ajouter les exceptions rencontrées les plus communes et le support pour les aider à déterminer rapidement en prod la cause de l'erreur.
Le dev afin de recenser puis ajouter les exceptions rencontrées les plus communes et le support pour les aider à déterminer rapidement en prod la cause de l'erreur.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Florent
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 26
- Remerciements reçus 0
il y a 10 ans 2 mois #21612
par Florent
Réponse de Florent sur le sujet Re:Comment optimiser un script - gestion d'exceptions
Le contexte est relative simple, en fait. Il s'agit lorsqu'un utilisateur se connecte sous sa session Win7, de constuire deux listes, l'une en rapport avec les imprimantes installées sous son profil, l'autre avec les addins outlook. Une fois ces deux listes prêtes, je les poste à un Webservice WCF qui se charge de l'enregistrement en BBD.
Si le script échoue pour une raison ou un autre ce n'est pas bloquant, on peut attendre une prochaine tentative.
Le problème que je rencontre, c'est qu'a l'ouverture de session, beaucoup de tâches s'executent (au moins une quinzaine), et mon script à l'air de se perdre un peu là dedans :)et la gestion d'exception pourrait m'amener plus de visibilité du pourquoi de l'echec du script. J'avoue que j'ai du mal à lier mon cas avec ton exemple.
Voici le script complet :
[code:1]
# 1 - Collect Printers and Outlook Addins infos related to the user profile
# 2 - Built two main lists from theses infos
# 3 - Upload lists to Webservice with UserProfile name and Pc name
# WebService Url
$Websvcurl = 'xxxService.svc'
# Creation of WebServiceProxy object
$Proxy = New-WebServiceProxy -Uri $Websvcurl
# We get the User Profile Name / PC Name
$Username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$Machine = [System.Environment]::MachineName
# Creation of Printer list object and Addin list object
# WebService give the model for each list
$Adslist = New-Object -TypeName System.Collections.Generic.List``1[Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy...AddinItem]
$Ptrlist = New-Object -TypeName System.Collections.Generic.List``1[Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy...AuditItem]
# Query of WMI Object for printers informations
$Ptrinfo = Get-WmiObject -Query \"Select ServerName,Name,Location,Default from Win32_Printer\" -ComputerName $Machine
$Ptrcfg = Get-WmiObject -Query \"select Name,Orientation,Color from Win32_PrinterConfiguration\" -ComputerName $Machine
# We fuse the two query results, and add each result in ptrlist
Foreach ( $P in $Ptrinfo ) {
$Ptrcfg = $Ptrcfg | Where { $_.Name -eq $P.Name }
$Ptr = New-Object -TypeName Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy...AuditItem -Property @{
PrinterSrv = $P.ServerName
Printer = $P.Name
Default = $P.Default
}
$Ptrlist += $Ptr
}
# Creation of main Outlook Object
$Outlookobj = new-object -comobject Outlook.Application
# We get the addins object from main outlook object
$Adsobject = $Outlookobj.Application.COMAddIns
# we add each result in adslist
Foreach ( $A in $Adsobject ) {
$Ads = New-Object -TypeName Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy...AddinItem -Property @{
Description = $A.Description
Connect = $A.Connect
}
$Adslist += $Ads
}
# All is ready to upload informations to the Webservice !
$Proxy.RecordElement($Username,$Machine,$Adslist, $Ptrlist)[/code:1]
Si le script échoue pour une raison ou un autre ce n'est pas bloquant, on peut attendre une prochaine tentative.
Le problème que je rencontre, c'est qu'a l'ouverture de session, beaucoup de tâches s'executent (au moins une quinzaine), et mon script à l'air de se perdre un peu là dedans :)et la gestion d'exception pourrait m'amener plus de visibilité du pourquoi de l'echec du script. J'avoue que j'ai du mal à lier mon cas avec ton exemple.
Voici le script complet :
[code:1]
# 1 - Collect Printers and Outlook Addins infos related to the user profile
# 2 - Built two main lists from theses infos
# 3 - Upload lists to Webservice with UserProfile name and Pc name
# WebService Url
$Websvcurl = 'xxxService.svc'
# Creation of WebServiceProxy object
$Proxy = New-WebServiceProxy -Uri $Websvcurl
# We get the User Profile Name / PC Name
$Username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$Machine = [System.Environment]::MachineName
# Creation of Printer list object and Addin list object
# WebService give the model for each list
$Adslist = New-Object -TypeName System.Collections.Generic.List``1[Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy...AddinItem]
$Ptrlist = New-Object -TypeName System.Collections.Generic.List``1[Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy...AuditItem]
# Query of WMI Object for printers informations
$Ptrinfo = Get-WmiObject -Query \"Select ServerName,Name,Location,Default from Win32_Printer\" -ComputerName $Machine
$Ptrcfg = Get-WmiObject -Query \"select Name,Orientation,Color from Win32_PrinterConfiguration\" -ComputerName $Machine
# We fuse the two query results, and add each result in ptrlist
Foreach ( $P in $Ptrinfo ) {
$Ptrcfg = $Ptrcfg | Where { $_.Name -eq $P.Name }
$Ptr = New-Object -TypeName Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy...AuditItem -Property @{
PrinterSrv = $P.ServerName
Printer = $P.Name
Default = $P.Default
}
$Ptrlist += $Ptr
}
# Creation of main Outlook Object
$Outlookobj = new-object -comobject Outlook.Application
# We get the addins object from main outlook object
$Adsobject = $Outlookobj.Application.COMAddIns
# we add each result in adslist
Foreach ( $A in $Adsobject ) {
$Ads = New-Object -TypeName Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy...AddinItem -Property @{
Description = $A.Description
Connect = $A.Connect
}
$Adslist += $Ads
}
# All is ready to upload informations to the Webservice !
$Proxy.RecordElement($Username,$Machine,$Adslist, $Ptrlist)[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.046 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Comment optimiser un script - gestion d'exceptions