Bonjour,
le plus sûr à mon sens est de prendre une variable d'erreur mise à 1 par défaut pour indiquer une erreur qui sera basculée à 0 une fois le script bien fini
Pour celà il faut passer par une fonction de sortie commune via Opt("OnExitFunc",....) qui lancera la fonction donnée en 2eme paramètre après n'importe quel Exit.
Du coups on test si chaque commande du script s'est bien déroulée via le code retours ou la macro @error pour provoquer un Exit si il y a une pb.
Ensuite dans la fonction de fin, on teste la variable du début pour voir si elle est à 1 ou 0, et si il ya un pb, on peut générer un log qu'on envoie sur un dossier partager. Au passage on utilisera la macro @exitCode pour savoir à quelle étape le script a échoué.
► Afficher le texte
Code : Tout sélectionner
#NoTrayIcon
#RequireAdmin
;variables globales comme il ne s'agit pas d'une fonction
opt("OnExitFunc","My_Exit") ; on indique qu'on, executera à la fin la fonction My_Exit en dernier
Global $sUserName = "adm"
Global $sPassword = "xxx"
Global $sDomaine = "intranet"
Global $MainError = 1 ; variable pour la fin d'execution da,s My_Exit , qui par défaut est : on est en erreur
If @ScriptDir = "C:\TEMP" Then ; on peut utiliser la macro @TempDir pour être plus générique
if Not FileCopy("*.*", "C:\Program Files\OCS Inventory Agent") Then Exit 1 ; idem avec @ProgramFilesDir
; test existence fichiers et lecture du fichier test.ini
If FileExists("C:\Program Files\OCS Inventory Agent\test.ini ") Then
$file = ("C:\Program Files\OCS Inventory Agent\test.ini")
$array = IniReadSection($file, "Ordinateur")
if @error Then Exit 2
;variable nom ordinateur
$tring = @ComputerName
;variable nom utilisateur
$utilisateur = @UserName
;variables date
$date = @MDAY & @MON & @YEAR
;nom des sections
$name = ("Ordinateur")
$name1 = ("Utilisateur")
$name2 = ("Date du jour")
;ecriture dans le fichier test.ini
IniWrite($file, "Nom du PC", $name, $tring);marque dans $file, a la section "Section", a la ligne $name, la valeur $tring.
If Not @error Then Exit 3
IniWrite($file, "Nom utilisateur", $name1, $utilisateur)
If Not @error Then Exit 4
IniWrite($file, "Date de création fichiers", $name2, $date)
If Not @error Then Exit 5
;affiche message
MsgBox(64, "MsgBox", "Tout c'est passé correctement.",10); un timeout permet de ne pas bloquer si on a le dos tourné
$var = IniReadSection("C:\Program Files\OCS Inventory Agent\test.ini", "Nom utilisateur")
If @error Then
MsgBox(48, "Utilisateur ?", "Nom d'utilisateur manquant",10);idem
Exit 6
Else
For $i = 1 To $var[0][0]
MsgBox(64, "Ordinateur et utilisateur", "Ordinateur: " & $var[$i][0] & @CRLF & "Utilisateur: " & $var[$i][1],10)
Next
EndIf
Else
MsgBox(48, "Erreur", "Le fichier test.ini n’existe pas", 10)
Exit 7
EndIf
; test existence cacert.pem
If FileExists("C:\Program Files\OCS Inventory Agent\cacert.pem ") Then
MsgBox(64, "Certificat copié ", "Le certificat a bien été copié", 10)
Else
; si cacert.existe affiche message
MsgBox(48, "Erreur", "Le fichier cacert.pem n’existe pas", 10)
Exit 8
EndIf
Else
; test si administrateur sinon donne droit admin
If Not FileCopy(@ScriptDir, "c:\TEMP", 1) Then Exit 9
; s'autoexecute
RunWait("C:\TEMP" & "\" & @ScriptName, "C:\TEMP")
If @error<>0 Then Exit 10
EndIf
;copie des fichiers cacert.pem et test.ini
$MainError = 0; tout c'est bien passé
Exit 0
Func My_Exit()
Local $hnd_err
Local $title_log = @TempDir&"\log_"&@ComputerName&"_error.txt"
If $MainError Then
$hnd_err=FileOpen($title_log,2)
If $hnd_err <> -1 Then
FileWriteLine($hnd_err,"script faild ! Code = "&@exitCode&" "&@YEAR&" "&@MON&" "&@MDAY&" "&@HOUR&" "&@MIN)
FileClose($hnd_err)
FileCopy($title_log,"\\nom_serveur\dossier_partage\",1)
EndIf
EndIf
;nettoyage
FileDelete("C:\TEMP" & "\" & @ScriptName)
EndFunc
Note : on peut enlever l'histoire de la variable après réflexion, en se basoant sur @exitCode uniquement : si on effectue Exit 0 uniquement dans les cas positifs, ceci servira de discriminateur.
Sinon on aurait pu écrire dans une clé de base de registre, puis faire un script d'interrogation des client à distance (voir la note de regread pour les lecture en remote)
Ou encore envoyer par mail si un serveur smtp est présent, voir _INetSmtpMail
ou encore exploiter une une mysql avec une bdd Mysql ... free style après ...
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.