IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Script C# lance un Script Powershell et mauvais retour.


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2020
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2020
    Messages : 85
    Par défaut Script C# lance un Script Powershell et mauvais retour.
    Bonjour à tous,
    j'ai un script C# permettant de lancer une commande PowerShell et récupérer le résultat dans une variables string.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    string FonctionScriptPowerShellDansString(string MonScript)
            {
                string Retour;
                using (Process process = new Process())
                {
                    process.StartInfo.FileName = "powershell.exe";
                    process.StartInfo.Arguments = "-NoProfile -ExecutionPolicy Bypass -Command " + "\"" + MonScript + "\"";
                    process.StartInfo.RedirectStandardOutput = true;
                    process.StartInfo.UseShellExecute = false;
                    process.StartInfo.CreateNoWindow = true;
                    process.Start();
     
                    Retour = process.StandardOutput.ReadLine(); // ou ReadToEnd si on veux le fichier complet
                    process.WaitForExit();
                }
                return Retour;
            }
    Ce code fonctionne bien, mais quand le résultat Powershell comporte un caractère spécial ça ne remonte pas le bon texte
    ex: "Réseau" ==> "R,seau".

    Une idée de comment corriger ce problème ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2020
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2020
    Messages : 85
    Par défaut
    Rebonjour,
    je complète mes recherches.
    J'ai essayé de faire un string.Replace("," , "é");
    mais ça ne fonctionne pas. J'ai extrait les caractères un par un avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach (char c in monString)
    {
         if ((int)c < 128)
         {
              MessageBox.Show("Caractère ASCII : " + c + " (Code ASCII : " + (int)c + ")");
         }
    }
    Et je m'aperçois que je passe du R au s directement...

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 964
    Par défaut
    C'est un problème d'encodage classique.
    Qu'est ce que ça donne en mettant ceci au début du script PS1 : $OutputEncoding = [System.Text.ASCIIEncoding]::new() ?
    ou ceci $OutputEncoding = [System.Text.UTF8Encoding]::new().

    Tu peux éventuellement essayer de récupérer la chaine de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    StreamReader reader = new StreamReader(process.StandardOutput.BaseStream, Encoding.UTF8);
    string text = reader.ReadToEnd();

  4. #4
    Membre confirmé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2020
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2020
    Messages : 85
    Par défaut
    Merci de cette réponse.
    Mes résultats :
    StreamReader reader = new StreamReader(process.StandardOutput.BaseStream, Encoding.UTF7); ==> Rseau
    StreamReader reader = new StreamReader(process.StandardOutput.BaseStream, Encoding.UTF8); ==> R?seau (enfin pas un vrai ? mais un ? dans un losange)
    StreamReader reader = new StreamReader(process.StandardOutput.BaseStream, Encoding.UTF32); ==> ?? (enfin pas un vrai ? mais un ? dans un losange)
    StreamReader reader = new StreamReader(process.StandardOutput.BaseStream, Encoding.ASCII); ==> R?seau (un vrai ?)

    par contre, je ne sais pas comment utiliser $OutputEncoding = [System.Text.ASCIIEncoding]::new() ? ou ceci $OutputEncoding = [System.Text.UTF8Encoding]::new().

  5. #5
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Étant donné que tu exécutes une commande powershell depuis la classe process alors il faut définir l'encodage depuis cette meme classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(850);
    Vérifier tout de même que le code page soit bien le bon pour le français ou la zone europe de l'ouest

    Bon codage++

  6. #6
    Membre confirmé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2020
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2020
    Messages : 85
    Par défaut
    Bonjour et merci,
    malheureusement ça ne fonctionne toujours pas
    J'ai essayé avec ceux la :
    850 ibm850 Western European (DOS)
    1252 Windows-1252 Western European (Windows)
    10000 macintosh Western European (Mac)
    20105 x-IA5 Western European (IA5)
    28591 iso-8859-1 Western European (ISO)

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 964
    Par défaut
    Citation Envoyé par Daditj Voir le message
    par contre, je ne sais pas comment utiliser $OutputEncoding = [System.Text.ASCIIEncoding]::new() ? ou ceci $OutputEncoding = [System.Text.UTF8Encoding]::new().
    Tout bonnement appliquer ce que j'ai dit : c'est à dire la copier telle quelle au début du script powershell.
    Mais la suggestion de wallace1 avec l'affectation de process.StartInfo.StandardOutputEncoding devrait avoir le même effet.

    Maintenant, il faut être cohérent entre ce que tu demandes et comment tu le récupères.
    Si tu demandes une sortie avec le code page 850, il faut le lire avec le code page 850.
    En gros, effecter process.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(850) et relire avec new StreamReader(process.StandardOutput.BaseStream, Encoding.GetEncoding(850)).

    Remarques :
    Dans le script PowerShell, peut également redéfinir le code page avec chcp 850.

  8. #8
    Membre confirmé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2020
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2020
    Messages : 85
    Par défaut
    Merci beaucoup,
    ça fonctionne maintenant.

    le code, si ça peut aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    string FonctionScriptPowerShellDansString(string MonScript)
            {
                string Retour;
     
                using (Process process = new Process())
                {
                    process.StartInfo.FileName = "powershell.exe";
                    process.StartInfo.Arguments = "-NoProfile -ExecutionPolicy Bypass -Command " + "\"" + MonScript + "\"";
                    process.StartInfo.RedirectStandardOutput = true; 
                    process.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(850);
     
                    process.StartInfo.UseShellExecute = false;
                    process.StartInfo.CreateNoWindow = true;
                    process.Start();
                    StreamReader reader = new StreamReader(process.StandardOutput.BaseStream, Encoding.GetEncoding(850));
                    Retour = reader.ReadToEnd();
                    process.WaitForExit();
                }
                return Retour;
            }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Interface Java pour script Powershell
    Par Gulrick dans le forum Général Java
    Réponses: 0
    Dernier message: 21/06/2010, 09h48
  2. Essayer d'activer un script powershell sous IIS
    Par machpro dans le forum IIS
    Réponses: 1
    Dernier message: 06/12/2008, 00h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo