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 :

récupération statut lecteur 3590 sur Lunix depuis windows


Sujet :

C#

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Par défaut récupération statut lecteur 3590 sur Lunix depuis windows
    Bonjour,

    J'ai des lecteurs de bandes magnétiques IBM 3590 et 3592.

    Je veux pouvoir, depuis une application, récupérer leurs statuts.

    De base, vu que les lecteurs sont reliés à un serveur linux, pour récupérer leurs status je tape cette commande :
    mt -f /dev/[nom du lecteur] status

    Depuis windows, j'utilise l'utilitaire plink pour exécuter cette même commande.
    \\[chemin jusqu'à plink]\plink.exe -ssh [user]@[ipadress du serveur linux] -pw [mdp] "mt -f /dev/[nom du lecteur] status"

    Qui me retourne plusieurs choses possible :


    lecteur occupé.

    cartouche présente dans le lecteur

    lecteur en erreur

    lecteur libre


    Donc pas de problème : je n'ai qu'à exécuter ma commande depuis une application en C# et récupérer le résultat pour faire une supervision centralisé des lecteurs !

    Du coup je m'y mets :
    Une classe pour envoyer une commande DOS et récupérer son résultat :
    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
    21
    22
    23
    24
    25
    26
    27
    28
     
            public static string Execute(string file, string arguments)
            {
                ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe");
     
                startInfo.UseShellExecute = false;
                startInfo.CreateNoWindow = true;
                startInfo.RedirectStandardInput = true;
                startInfo.RedirectStandardOutput = true;
                startInfo.FileName = file;
                startInfo.Arguments = arguments;
     
                Process process = new Process();
                process.StartInfo = startInfo;
                process.Start();
     
                var output = string.Empty;
                string lineVal = process.StandardOutput.ReadLine();
     
                while (lineVal != null)
                {
                    output += "\n" + lineVal;
                    lineVal = process.StandardOutput.ReadLine();
                }
     
                process.WaitForExit();
                return output;
            }
    Que j'appelle ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            public const string PATH_PLINK = "\"" + @"\\***\***\**\plink.exe" + "\"";
            public const string ARGUMENTS_PLINK = "-ssh {0}@{3} -pw {1} \"mt -f /dev/{2} status\"";
            ...
            var rs = CommandeDos.Execute(Data.PATH_PLINK, string.Format(Data.ARGUMENTS_PLINK, "login", "mdp", drive.NomDrive.ToLower(), "@ipserver"));
    Hop je compile (easy win )

    Et là.... en fait.... tout ne marche pas comme prévu !!

    la commande me renvoie le message entier lorsque le lecteur est en statut "cartouche présente dans le lecteur" ou "lecteur libre" mais ne renvoi rien si le lecteur est en statut "lecteur en erreur" ou "lecteur occupé"

    Je me demande si ça n'est pas dû au fait qu'il n'y a qu'une ligne à renvoyer..

    Pourtant quand je fais un "echo /dev/dr8: Input/output error" dans mon logiciel ça fonctionne...

    J'ai essayé plusieurs code pour envoyer une commande dos mais c'est toujours pareil.

    Dans tous les cas, pour récupérer ce status, il faut que je me connecte au serveur auquel il est rattaché et que j'utilise la commande linux
    mt -f /dev/[nom du lecteur] status
    Peut être existe-t'il une autre solution pour le faire?

    Merci à vous.

  2. #2
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Par défaut
    Up

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    Il faut utiliser la propriété standarderror pour récupérer la liste des erreurs: Process.StandardError

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Par défaut
    Merci c'est exactement ça le problème.
    Dans les deux cas, le message est stocké dans le StandardError.

    Du coup j'ai modifié mon code en ajoutant ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                startInfo.RedirectStandardError = true;
                ...
                if (output == string.Empty) output = process.StandardError.ReadToEnd();
    Du coup ma fonction Execute ressemble à ça :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
            public static string Execute(string file, string arguments)
            {
                ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe");
     
                startInfo.UseShellExecute = false;
                startInfo.CreateNoWindow = true;
                startInfo.RedirectStandardInput = true;
                startInfo.RedirectStandardOutput = true;
                startInfo.FileName = file;
                startInfo.Arguments = arguments; 
                startInfo.RedirectStandardError = true;
     
                Process process = new Process();
                process.StartInfo = startInfo;
                process.Start();
     
     
                //StreamReader myStreamReader = process.StandardError;
                //// Read the standard error of net.exe and write it on to console.
                //Console.WriteLine(myStreamReader.ReadLine());
     
                var output = string.Empty;
                string lineVal = process.StandardOutput.ReadLine();
     
                while (lineVal != null)
                {
                    output += "\n" + lineVal;
                    lineVal = process.StandardOutput.ReadLine();
                }
                if (output == string.Empty) output = process.StandardError.ReadToEnd();
     
                process.WaitForExit();
                return output;
            }
    Merci encore à toi

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

Discussions similaires

  1. [Débutant] Setup pour lunix depuis Windows
    Par Mohammed88 dans le forum C#
    Réponses: 3
    Dernier message: 07/08/2011, 21h04
  2. Réponses: 0
    Dernier message: 07/02/2008, 11h26
  3. Réponses: 0
    Dernier message: 26/11/2007, 20h18
  4. Recherche un progs pour faire de la télémainteance sur ubuntu depuis windows
    Par jbidou88 dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 15/05/2007, 09h42
  5. Récupération des composants DOS sur les CD de Windows Vista
    Par koKoTis dans le forum Windows Vista
    Réponses: 2
    Dernier message: 09/09/2006, 21h56

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