Question
[Résolu] Un énième problème d'encodage UTF8
- Higapeon
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 3
- Remerciements reçus 0
il y a 15 ans 11 mois #7078
par Higapeon
[Résolu] Un énième problème d'encodage UTF8 a été créé par Higapeon
Bonjour à tous,
Voila plusieurs jours que j'essaye de convertir un script VBS me servant à récolter diverses informations utiles, et qui m'envoie ensuite un mail avec toutes ces informations (plus X pièces jointes pour d'autres paramètres, vous verrez vite dans le source
).
Après tests, tout se passe bien, J'utilise PowerShell Analyzer pour tester mon script, le texte arrive en clair & lisible, les accents sont des accents, etc.
Exemple :
[code:1]Exécution du script d'état du serveur TI036 le 06/01/2010 17:19:59[/code:1]
Mais si je passe par une exécution schedulée (powershell \"& 'monscript.ps1'\") ou même à travers \"Executer\", catastrophe, Powershell me vandalise le log
Exemple :
[code:1]Exécution du script d'état du serveur TI036 le 06/07/2010 14:22:36[/code:1]
Je pense humblement que ça a un rapport avec le fait d'executer mes commandes dans le prompt powershell (qui ne doit pas gérer les accents) pour les inclure dans un body html.
Voici le code :
[code:1]#Variables propres au poste
$nomordinateur = (get-WmiObject -class Win32_Computersystem).name
$domaineordinateur = (get-WmiObject -class Win32_computersystem).domain
#Constantes
$corps = \"<html><head><meta http-equiv=\"\"Content-type\"\" content=\"\"text/html; charset=UTF-8\"\"/></head> <body><font face=\"\"Lucida Console\"\" size=\"\"2\"\">Exécution du script d'état du serveur \" + $nomordinateur + \" le \" + [System.DateTime]::Now
$corps = $corps + \"<br><br><br>\"
$workdir = \"C:\Workingdir\"
$jour = ([System.DateTime]::Today).day
#Script calculant la memoire libre de chaque disque logique
#mise en page
$corps = $corps + \"••••••••••••••••••••••••••••••<br>\"
$corps = $corps + \"Espace disque disponibles<br>\"
$corps = $corps + \"<br>\"
#création de l'instance de l'objet WMI
$disquesWMI = get-WmiObject Win32_LogicalDisk
$taille_totale = 0 # initialisation de la variable
# boucle pour parcourir tous les disques
foreach ( $disque in $disquesWMI ) {
#Réinitialisation résultat
$resultatdisque = 0
# calul de la taille en Giga octet
$espacetotal = $disque.size / (1024*1024*1024)
$taille = $disque.freespace / (1024*1024*1024)
$espacetotal = [math]::round($espacetotal, 1) # Arrondi la taille à 1 décimale
$taille = [math]::round($taille, 1)
$pourcentage = [math]::round($taille / $espacetotal * 100, 2)
$nom=$disque.Name
if ($espacetotal -ne 0){
if ($pourcentage -lt 10){
$corps = $corps + \" $nom : $taille Go libres sur $espacetotal Go soit <font color=\"\"red\"\">$pourcentage % d'espace libre</font><br>\"}
else {
$corps = $corps + \" $nom : $taille Go libres sur $espacetotal Go soit <font color=\"\"green\"\">$pourcentage % d'espace libre</font><br>\"}
}
}
#What s up avec les services ?
#Mise en page
$corps = $corps + \"<br>••••••••••••••••••••••••••••••<br>\"
$corps = $corps + \"Services<br>\"
$corps = $corps + \"<br>\"
$serviceWMI = get-service | sort-Object DisplayName
#Boucle de parcours des services
foreach ($service in $serviceWMI) {
$nomservice = $service.DisplayName
if ($nomservice -match \"Accès à distance au Registre\" -or $nomservice -match \"ATI Smart\"«») {
if ($service.status -eq \"Running\"«») {
$corps = $corps + \" $nomservice : <font color=\"\"green\"\">Running</font><br>\"}
else {$corps = $corps + \" $nomservice : <font color=\"\"Red\"\">STOPPED</font><br>\"}
}
}
#Script des logs
#Log application
$logapplication = get-EventLog application -newest 100000
$logapplication | Where-Object {[System.DateTime]::Now - $_.TimeGenerated -lt \"4.00:00:00\"} | Where-Object {$_.EntryType -match \"Warning\" -or $_.EntryType -match \"Error\"} | Convertto-Html -property TimeGenerated, EntryType, Source, EventID, Message > \"$workdir\log-application-$jour.html\"
#Log Systeme
$logsystem = get-EventLog System -newest 100000
$logsystem | Where-Object {[System.DateTime]::Now - $_.TimeGenerated -lt \"4.00:00:00\"} | Where-Object {$_.EntryType -match \"Warning\" -or $_.EntryType -match \"Error\"} | Convertto-Html -property TimeGenerated, EntryType, Source, EventID, Message > \"$workdir\log-systeme-$jour.html\"
#Version de l'anti-virus
$corps = $corps + \"<br>••••••••••••••••••••••••••••••<br>\"
$corps = $corps + \"Version de l'anti virus<br>\"
$corps = $corps + \"<br>\"
$corps = $corps + (Get-Content \"C:\Program Files\Trend Micro\Client Server Security Agent\updinfo.ini\"«»)[2]
#Surveillance Exchange
$corps = $corps + \"<br>••••••••••••••••••••••••••••••<br>\"
$corps = $corps + \"Surveillance Exchange : <br>\"
$corps = $corps + \"<br>\"
$exchangequeue = (get-ChildItem \"D:\Program Files\Exchsrvr\Mailroot\vsi 1\Queue\"«»).count
$corps = $corps + \"<br>Nombre de mails en queue : $exchangequeue\"
$exchangebadmail = (get-ChildItem \"D:\Program Files\Exchsrvr\Mailroot\vsi 1\BadMail\"«»).count
$corps = $corps + \"<br>Nombre de badmails : $exchangebadmail\"
# Envoi de mail automatique
$expediteur = $nomordinateur + \"*\"
$destinataire = \"*\"
$serveur = \"*\"
$fjoint1 = new-object System.Net.Mail.Attachment \"$workdir\log-application-$jour.html\"
$fjoint2 = new-object System.Net.Mail.Attachment \"$workdir\log-systeme-$jour.html\"
#$fjoint3 = new-object System.Net.Mail.Attachment \"c:\temp\monfichier.txt\"
#$fjoint4 = new-object System.Net.Mail.Attachment \"c:\temp\monfichier.txt\"
$objet = \"Serveur : $nomordinateur / $domaineordinateur\"
$corps = $corps + \"</body>\"
$texte = $corps
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
$message.IsBodyHTML = $true
$message.Attachments.Add($fjoint1)
$message.Attachments.Add($fjoint2)
$SMTPclient = new-object System.Net.Mail.SmtpClient $serveur
$SMTPclient.Credentials = [System.Net.CredentialCache]::«»DefaultNetworkCredentials
$SMTPclient.Send($message)[/code:1]
PS : j'en profite pour remercier les créateurs du site, j'ai en partie découvert powershell & son utilité à travers votre site (en plus de l'eBook de Frank Koch). Un sacré plus d'avoir les infos à portée de main !
Message édité par: Higapeon, à: 7/06/10 14:42<br><br>Message édité par: Higapeon, à: 8/06/10 14:40
Voila plusieurs jours que j'essaye de convertir un script VBS me servant à récolter diverses informations utiles, et qui m'envoie ensuite un mail avec toutes ces informations (plus X pièces jointes pour d'autres paramètres, vous verrez vite dans le source
Après tests, tout se passe bien, J'utilise PowerShell Analyzer pour tester mon script, le texte arrive en clair & lisible, les accents sont des accents, etc.
Exemple :
[code:1]Exécution du script d'état du serveur TI036 le 06/01/2010 17:19:59[/code:1]
Mais si je passe par une exécution schedulée (powershell \"& 'monscript.ps1'\") ou même à travers \"Executer\", catastrophe, Powershell me vandalise le log
Exemple :
[code:1]Exécution du script d'état du serveur TI036 le 06/07/2010 14:22:36[/code:1]
Je pense humblement que ça a un rapport avec le fait d'executer mes commandes dans le prompt powershell (qui ne doit pas gérer les accents) pour les inclure dans un body html.
Voici le code :
[code:1]#Variables propres au poste
$nomordinateur = (get-WmiObject -class Win32_Computersystem).name
$domaineordinateur = (get-WmiObject -class Win32_computersystem).domain
#Constantes
$corps = \"<html><head><meta http-equiv=\"\"Content-type\"\" content=\"\"text/html; charset=UTF-8\"\"/></head> <body><font face=\"\"Lucida Console\"\" size=\"\"2\"\">Exécution du script d'état du serveur \" + $nomordinateur + \" le \" + [System.DateTime]::Now
$corps = $corps + \"<br><br><br>\"
$workdir = \"C:\Workingdir\"
$jour = ([System.DateTime]::Today).day
#Script calculant la memoire libre de chaque disque logique
#mise en page
$corps = $corps + \"••••••••••••••••••••••••••••••<br>\"
$corps = $corps + \"Espace disque disponibles<br>\"
$corps = $corps + \"<br>\"
#création de l'instance de l'objet WMI
$disquesWMI = get-WmiObject Win32_LogicalDisk
$taille_totale = 0 # initialisation de la variable
# boucle pour parcourir tous les disques
foreach ( $disque in $disquesWMI ) {
#Réinitialisation résultat
$resultatdisque = 0
# calul de la taille en Giga octet
$espacetotal = $disque.size / (1024*1024*1024)
$taille = $disque.freespace / (1024*1024*1024)
$espacetotal = [math]::round($espacetotal, 1) # Arrondi la taille à 1 décimale
$taille = [math]::round($taille, 1)
$pourcentage = [math]::round($taille / $espacetotal * 100, 2)
$nom=$disque.Name
if ($espacetotal -ne 0){
if ($pourcentage -lt 10){
$corps = $corps + \" $nom : $taille Go libres sur $espacetotal Go soit <font color=\"\"red\"\">$pourcentage % d'espace libre</font><br>\"}
else {
$corps = $corps + \" $nom : $taille Go libres sur $espacetotal Go soit <font color=\"\"green\"\">$pourcentage % d'espace libre</font><br>\"}
}
}
#What s up avec les services ?
#Mise en page
$corps = $corps + \"<br>••••••••••••••••••••••••••••••<br>\"
$corps = $corps + \"Services<br>\"
$corps = $corps + \"<br>\"
$serviceWMI = get-service | sort-Object DisplayName
#Boucle de parcours des services
foreach ($service in $serviceWMI) {
$nomservice = $service.DisplayName
if ($nomservice -match \"Accès à distance au Registre\" -or $nomservice -match \"ATI Smart\"«») {
if ($service.status -eq \"Running\"«») {
$corps = $corps + \" $nomservice : <font color=\"\"green\"\">Running</font><br>\"}
else {$corps = $corps + \" $nomservice : <font color=\"\"Red\"\">STOPPED</font><br>\"}
}
}
#Script des logs
#Log application
$logapplication = get-EventLog application -newest 100000
$logapplication | Where-Object {[System.DateTime]::Now - $_.TimeGenerated -lt \"4.00:00:00\"} | Where-Object {$_.EntryType -match \"Warning\" -or $_.EntryType -match \"Error\"} | Convertto-Html -property TimeGenerated, EntryType, Source, EventID, Message > \"$workdir\log-application-$jour.html\"
#Log Systeme
$logsystem = get-EventLog System -newest 100000
$logsystem | Where-Object {[System.DateTime]::Now - $_.TimeGenerated -lt \"4.00:00:00\"} | Where-Object {$_.EntryType -match \"Warning\" -or $_.EntryType -match \"Error\"} | Convertto-Html -property TimeGenerated, EntryType, Source, EventID, Message > \"$workdir\log-systeme-$jour.html\"
#Version de l'anti-virus
$corps = $corps + \"<br>••••••••••••••••••••••••••••••<br>\"
$corps = $corps + \"Version de l'anti virus<br>\"
$corps = $corps + \"<br>\"
$corps = $corps + (Get-Content \"C:\Program Files\Trend Micro\Client Server Security Agent\updinfo.ini\"«»)[2]
#Surveillance Exchange
$corps = $corps + \"<br>••••••••••••••••••••••••••••••<br>\"
$corps = $corps + \"Surveillance Exchange : <br>\"
$corps = $corps + \"<br>\"
$exchangequeue = (get-ChildItem \"D:\Program Files\Exchsrvr\Mailroot\vsi 1\Queue\"«»).count
$corps = $corps + \"<br>Nombre de mails en queue : $exchangequeue\"
$exchangebadmail = (get-ChildItem \"D:\Program Files\Exchsrvr\Mailroot\vsi 1\BadMail\"«»).count
$corps = $corps + \"<br>Nombre de badmails : $exchangebadmail\"
# Envoi de mail automatique
$expediteur = $nomordinateur + \"*\"
$destinataire = \"*\"
$serveur = \"*\"
$fjoint1 = new-object System.Net.Mail.Attachment \"$workdir\log-application-$jour.html\"
$fjoint2 = new-object System.Net.Mail.Attachment \"$workdir\log-systeme-$jour.html\"
#$fjoint3 = new-object System.Net.Mail.Attachment \"c:\temp\monfichier.txt\"
#$fjoint4 = new-object System.Net.Mail.Attachment \"c:\temp\monfichier.txt\"
$objet = \"Serveur : $nomordinateur / $domaineordinateur\"
$corps = $corps + \"</body>\"
$texte = $corps
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
$message.IsBodyHTML = $true
$message.Attachments.Add($fjoint1)
$message.Attachments.Add($fjoint2)
$SMTPclient = new-object System.Net.Mail.SmtpClient $serveur
$SMTPclient.Credentials = [System.Net.CredentialCache]::«»DefaultNetworkCredentials
$SMTPclient.Send($message)[/code:1]
PS : j'en profite pour remercier les créateurs du site, j'ai en partie découvert powershell & son utilité à travers votre site (en plus de l'eBook de Frank Koch). Un sacré plus d'avoir les infos à portée de main !
Message édité par: Higapeon, à: 7/06/10 14:42<br><br>Message édité par: Higapeon, à: 8/06/10 14:40
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 15 ans 11 mois #7079
par xyz
Tutoriels PowerShell
Réponse de xyz sur le sujet Re:Un énième problème d'encodage UTF8
Salut,
Higapeon écrit:
Higapeon écrit:
Concernant le html crée une page html et affiche là, tu seras fixé.
Consulte ce post .
[code:1]
$OutputEncoding
$OutputEncoding = [Console]::OutputEncoding
$OutputEncoding
[/code:1]
Ceci dit, on peut qq fois s'arracher les cheveux avec les pb d'encodage.
Higapeon écrit:
Higapeon écrit:
Je n'ai pas ce soucis, en reprenant une partie de ton script.à travers \"Executer\",
Higapeon écrit:
PowerShell gére les accents (par défaut Unicode).le prompt powershell (qui ne doit pas gérer les accents) pour les inclure dans un body html.
Concernant le html crée une page html et affiche là, tu seras fixé.
Consulte ce post .
[code:1]
$OutputEncoding
$OutputEncoding = [Console]::OutputEncoding
$OutputEncoding
[/code:1]
Ceci dit, on peut qq fois s'arracher les cheveux avec les pb d'encodage.
Higapeon écrit:
C'est peut être du à la configuration de la page de code du compte utilisé ?Mais si je passe par une exécution schedulée (powershell \"& 'monscript.ps1'\")
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 226
- Remerciements reçus 0
il y a 15 ans 11 mois #7080
par Arthur
Réponse de Arthur sur le sujet Re:Un énième problème d'encodage UTF8
Arg.. j'ai était doublé par Laurent.
Comme Laurent le dit sort la variable $text en HTML avec \"Out-File -Encoding UTF8\".
Par contre j'utilise beaucoup les tâches planifiées et je n'aie eu pour le moment qu'un seul problème d'encodage qui n'a rien à voire avec les tâches planifiées (Enfin je pense y a pas de raison.
)
Comme Laurent le dit sort la variable $text en HTML avec \"Out-File -Encoding UTF8\".
Par contre j'utilise beaucoup les tâches planifiées et je n'aie eu pour le moment qu'un seul problème d'encodage qui n'a rien à voire avec les tâches planifiées (Enfin je pense y a pas de raison.
Connexion ou Créer un compte pour participer à la conversation.
- Higapeon
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 3
- Remerciements reçus 0
il y a 15 ans 11 mois #7082
par Higapeon
Réponse de Higapeon sur le sujet Re:Un énième problème d'encodage UTF8
Ce que PS me donne en .html est identique à mon mail.
Exemple gracieux de toute la beauté de mon capilotractage forcené :
[code:1]
<html><head><meta http-equiv=\"Content-type\" content=\"text/html; charset=UTF-8\"/></head> <body><font face=\"Lucida Console\" size=\"2\">Exécution du script d'état du serveur TI036 le 06/07/2010 16:39:13<br><br><br>••••••••••••••••••••••••••••••<br>Espace disque disponibles<br><br> C: : 36.9 Go libres sur 74.4 Go soit <font color=\"green\">49.6 % d'espace libre</font><br> J: : 41 Go libres sur 111.8 Go soit <font color=\"green\">36.67 % d'espace libre</font><br> N: : 24.6 Go libres sur 76.3 Go soit <font color=\"green\">32.24 % d'espace libre</font><br> T: : 24.6 Go libres sur 76.3 Go soit <font color=\"green\">32.24 % d'espace libre</font><br><br>••••••••••••••••••••••••••••••<br>Services<br><br> ATI Smart : <font color=\"Red\">STOPPED</font><br><br>••••••••••••••••••••••••••••••<br>Version de l'anti virus<br><br>Ptnfile_Version = 722350<br>••••••••••••••••••••••••••••••<br>Surveillance Exchange : <br><br><br>Nombre de mails en queue : <br>Nombre de badmails : </body>
[/code:1]
Les puces ne ressemblent à rien, et ça ne me le fait qu'avec le prompt powershell de base de Windows (PS V1, vous avez du le remarquer avec la fonction d'envoi de mail toute crade
)
Et ceci pour le code que j'ai copié collé juste avant (avec en plus en bas un $texte > test.html)
Je suis en ibm850 au niveau de la console. En tout cas, c'est ce que me donne la commande pour OutputEncoding.
Ce n'est pas la faute du scheduleur de tâche (le pauvre, je l'accuse) mais bien du prompt powershell lui même.
Exemple gracieux de toute la beauté de mon capilotractage forcené :
[code:1]
<html><head><meta http-equiv=\"Content-type\" content=\"text/html; charset=UTF-8\"/></head> <body><font face=\"Lucida Console\" size=\"2\">Exécution du script d'état du serveur TI036 le 06/07/2010 16:39:13<br><br><br>••••••••••••••••••••••••••••••<br>Espace disque disponibles<br><br> C: : 36.9 Go libres sur 74.4 Go soit <font color=\"green\">49.6 % d'espace libre</font><br> J: : 41 Go libres sur 111.8 Go soit <font color=\"green\">36.67 % d'espace libre</font><br> N: : 24.6 Go libres sur 76.3 Go soit <font color=\"green\">32.24 % d'espace libre</font><br> T: : 24.6 Go libres sur 76.3 Go soit <font color=\"green\">32.24 % d'espace libre</font><br><br>••••••••••••••••••••••••••••••<br>Services<br><br> ATI Smart : <font color=\"Red\">STOPPED</font><br><br>••••••••••••••••••••••••••••••<br>Version de l'anti virus<br><br>Ptnfile_Version = 722350<br>••••••••••••••••••••••••••••••<br>Surveillance Exchange : <br><br><br>Nombre de mails en queue : <br>Nombre de badmails : </body>
[/code:1]
Les puces ne ressemblent à rien, et ça ne me le fait qu'avec le prompt powershell de base de Windows (PS V1, vous avez du le remarquer avec la fonction d'envoi de mail toute crade
Et ceci pour le code que j'ai copié collé juste avant (avec en plus en bas un $texte > test.html)
Je suis en ibm850 au niveau de la console. En tout cas, c'est ce que me donne la commande pour OutputEncoding.
Ce n'est pas la faute du scheduleur de tâche (le pauvre, je l'accuse) mais bien du prompt powershell lui même.
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 15 ans 11 mois #7083
par xyz
Tutoriels PowerShell
Réponse de xyz sur le sujet Re:Un énième problème d'encodage UTF8
Je ne pense pas que cela soit lié, mais as-tu essayé avec CharSet=iso-8859-1 ?
Utilises-tu une version de PS Fr sur un Windows US ?
Sinon je n'ai pas trouvé de bug lié à Htlm sur MSconnect
En passant je ne suis pas sûr que la redirection gére l'encodage...
Utilises-tu une version de PS Fr sur un Windows US ?
Sinon je n'ai pas trouvé de bug lié à Htlm sur MSconnect
En passant je ne suis pas sûr que la redirection gére l'encodage...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Higapeon
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 3
- Remerciements reçus 0
il y a 15 ans 11 mois #7085
par Higapeon
Réponse de Higapeon sur le sujet Re:Un énième problème d'encodage UTF8
Laurent Dardenne écrit:
PEBKAC. J'ai honte.
Dans ma tête pleine de trous, UTF 8 gère parfaitement les accents, pas Latin-1.
J'ai demandé juste avant de venir à un collègue, qui m'a annoncé mon pebkac.

Merci beaucoup pour l'aide. Je vais voir si je ne peux pas apporter ma pierre à l'édifice PS
Je ne pense pas que cela soit lié, mais as-tu essayé avec CharSet=iso-8859-1 ?
PEBKAC. J'ai honte.
Dans ma tête pleine de trous, UTF 8 gère parfaitement les accents, pas Latin-1.
J'ai demandé juste avant de venir à un collègue, qui m'a annoncé mon pebkac.
Merci beaucoup pour l'aide. Je vais voir si je ne peux pas apporter ma pierre à l'édifice PS
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.048 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Un énième problème d'encodage UTF8