Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

PowerShell et $error

6 réponses
Avatar
Stephane (85)
Bonjour

Je cherche comment faire pour récupérer les données de la variable $error.

Al'écran j'ai :

Exception lors de l'appel de « Fill » avec « 1 » argument(s) : « ERROR
[42S22] [IBM][Pilote ODBC iSeries Access][DB2 UD
B]SQL0206 - La colonne ACFDPL ne se trouve pas dans les tables indiquées. »
Au niveau de S:\Informatique\Réservé\scripts\PowerShell\extraction
CDF.ps1 : 26 Caractère : 24
+ $DataAdapterLignes.Fill( <<<< $DataSetLignes)

J'essaie de récupérer le contenu dans des variables mais j'ai pas tout:
Exception lors de l'appel de « Fill » avec « 1 » argument(s) : « ERROR
[42S22] [IBM][Pilote ODBC iSeries Access][DB2 UD
B]SQL0206 - La colonne ACFDPL ne se trouve pas dans les tables indiquées. »

J'arrive pas à obtenir le nom du prog la ligne et le caractère.

Des idées ?

Merci

Stephane

6 réponses

Avatar
Gilles LAURENT [MVP]
"Stephane (85)" a écrit dans le message de
news:%
| Bonjour

Bonjour,

| Je cherche comment faire pour récupérer les données de la variable
| $error.
|
| Al'écran j'ai :
|
| Exception lors de l'appel de « Fill » avec « 1 » argument(s) : « ERROR
| [42S22] [IBM][Pilote ODBC iSeries Access][DB2 UD
| B]SQL0206 - La colonne ACFDPL ne se trouve pas dans les tables
| indiquées. » Au niveau de
| S:InformatiqueRéservéscriptsPowerShellextraction
| CDF.ps1 : 26 Caractère : 24
| + $DataAdapterLignes.Fill( <<<< $DataSetLignes)
|
| J'essaie de récupérer le contenu dans des variables mais j'ai pas
| tout: Exception lors de l'appel de « Fill » avec « 1 » argument(s) :
| « ERROR [42S22] [IBM][Pilote ODBC iSeries Access][DB2 UD
| B]SQL0206 - La colonne ACFDPL ne se trouve pas dans les tables
| indiquées. »
|
| J'arrive pas à obtenir le nom du prog la ligne et le caractère.

La variable $error est du type ArrayList
Pour extraire ces informations pour la dernière erreur survenue :
$error[0].InvocationInfo.ScriptName
$error[0].InvocationInfo.ScriptLineNumber
$error[0].InvocationInfo.OffsetInLine

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Avatar
Stephane (85)
Gilles LAURENT [MVP] a écrit :
La variable $error est du type ArrayList
Pour extraire ces informations pour la dernière erreur survenue :
$error[0].InvocationInfo.ScriptName
$error[0].InvocationInfo.ScriptLineNumber
$error[0].InvocationInfo.OffsetInLine



Ben oui mais non ça marche pas, et c'est complètement tordu.

Voilà mon bout de code :
"trap { "Exception détectée dans le programme !";
$mail = New-Object System.Net.Mail.MailMessage
$mail.From = ''
$mail.To.Add('')
$mail.Subject = 'Exception détectée dans l''extraction WMS'
$contenu = $error[0]
$contenu
$mail.Body = $contenu
$client = New-Object System.Net.Mail.SmtpClient
$client.Set_Host('SRV-MAIL')
$client.Send($mail)
break
}
"
$contenu affiche toutes les informations qui m'intéresse sur la console:

"Exception détectée dans le programme !
Exception lors de l'appel de « Fill » avec « 1 » argument(s) : « ERROR
[42S22] [IBM][Pilote ODBC iSeries Access][DB2 UD
B]SQL0206 - La colonne ACFDPL ne se trouve pas dans les tables indiquées. »
Au niveau de S:InformatiqueRéservéscriptsPowerShellextraction
CDF.ps1 : 35 Caractère : 24"

par contre dans le mail je n'ai que la première partie, il me manque les
infos sur le programme :
"Au niveau de S:InformatiqueRéservéscriptsPowerShellextraction
CDF.ps1 : 35 Caractère : 24"

J'ai essayé en ajoutant au mail : "$error[0].InvocationInfo.ScriptName"
mais j'ai rien de plus, pire j'ai aussi essayé
"$error[0].InvocationInfo.ScriptName.ToString()"
là j'ai une erreur qui me dit que
"Vous ne pouvez pas appeler de méthode sur une expression ayant la
valeur Null"

C'est bizarre non ?

Merci
Stephane
Avatar
Stephane (85)
Ok c'est résolu

Sur le forum du livre qui va bien, Laurent m'a bien aidé
http://powershell-scripting.com/index.php?option=com_joomlaboard&Itemidv&func=view&catid=5&id289#3289

Stephane
Avatar
Gilles LAURENT [MVP]
"Stephane (85)" wrote:

Ok c'est résolu

Sur le forum du livre qui va bien, Laurent m'a bien aidé



C'est bien tordu cette histoire ! Je n'arrive pas à reproduire. Je génère
pourtant des exceptions que j'intercepte avec Trap {} et j'obtiens toujours
une erreur du type ErrorRecord. Ce problème doit donc être une exception :-)

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Avatar
Gilles LAURENT [MVP]
Bon, j'ai finalement reproduit le fait qu'il est possible d'obtenir un
tableau d'erreurs avec un type différent de ErrorRecord. Toutefois uniquement
en capturant l'erreur de la cmdlet via -ErrorVariable. Lors de mes tests, la
variable $error[0] est toujours du type ErrorRecord. Ci-dessous l'exemple
utilisé :

PS> gwmi -class "Win32_Process" -computer host -ErrorVariable err
PS> $err[0]
Accès refusé. (Exception de HRESULT : 0x80070005 (E_ACCESSDENIED))
PS> $err[0].GetType().Name
CmdletInvocationException
PS> $err[0].ErrorRecord.InvocationInfo.ScriptLineNumber
1

=> $err n'est pas du type ErrorRecord
=> en revanche $error[0] est du type ErrorRecord

PS> $error[0].GetType.Name
ErrorRecord
PS> $error[0].InvocationInfo.ScriptLineNumber
1

C'est bizarre !

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Avatar
Stephane (85)
Gilles LAURENT [MVP] a écrit :
Bon, j'ai finalement reproduit le fait qu'il est possible d'obtenir un
tableau d'erreurs avec un type différent de ErrorRecord. Toutefois uniquement
en capturant l'erreur de la cmdlet via -ErrorVariable. Lors de mes tests, la
variable $error[0] est toujours du type ErrorRecord. Ci-dessous l'exemple
utilisé :

PS> gwmi -class "Win32_Process" -computer host -ErrorVariable err
PS> $err[0]
Accès refusé. (Exception de HRESULT : 0x80070005 (E_ACCESSDENIED))
PS> $err[0].GetType().Name
CmdletInvocationException
PS> $err[0].ErrorRecord.InvocationInfo.ScriptLineNumber
1

=> $err n'est pas du type ErrorRecord
=> en revanche $error[0] est du type ErrorRecord

PS> $error[0].GetType.Name
ErrorRecord
PS> $error[0].InvocationInfo.ScriptLineNumber
1

C'est bizarre !



J'ai surtout pas eu de bol d'opter pour le cas qui n'arrive "jamais" :-)

Merci
Stephane