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

Lazarus Pascal Discussion :

Execute avec grep [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 94
    Par défaut Execute avec grep
    Bonsoir,

    Je viens à nouveau vous solliciter pour un problème agaçant

    Je tente d'obtenir un numéro de série pour une clé USB.

    En lançant sur le terminal les 2 commandes
    df | grep VERBATIM me renvoie '/dev/sdd1 123015548 49000524 74015024 40% /media/jj/VERBATIM'
    Je récupère alors l'information '/dev/sdd1'
    Je lance alors la commande
    /bin/udevadm info --name=/dev/sdd1 | grep SERIAL_SHORT qui me renvoie 'E: ID_SERIAL_SHORT=070089F828F75090'
    Il ne me reste plus qu'à isoler le numéro de série.

    Je prends alors ma plus belle plume pour écrire le programme suivant
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      process,
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
     
      public
     
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
    var
      MyProcess : TProcess;
      VStrTemp  : TStringList;
      Buffer: String;
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      MyProcess := TProcess.Create(nil);
      VStrTemp  := TStringList.Create;
      MyProcess.Options     := [poWaitOnExit, poUsePipes];
      MyProcess.Executable  := 'df';
      MyProcess.Parameters.Add('grep');
      MyProcess.Parameters.Add('/media/jj/VERBATIM'); // KO, mais fonctionne avec '/media/jj/VERBATIM' !!!!!
      try
        MyProcess.Execute;
        VStrTemp.LoadFromStream(MyProcess.Output);
        Buffer := VStrTemp.Text;
     
    {
    -   la séquence ci-dessus me retourne un Buffer vide
     
    -   la commande 'df | grep VERBATIM ' exécutée dans le terminal me renvoie :
      /dev/sdd1          123015548  49000524   74015024  40% /media/jj/VERBATIM
    }
    {
    essai avec '/VERBATIM' ==> KO Buffer est vide
    essai avec 'jj/VERBATIM' ==> KO Buffer est vide
    essai avec '/jj/VERBATIM' ==> KO Buffer est vide
    essai avec 'media/jj/VERBATIM' ==> KO Buffer est vide
    essai avec '/media/jj/VERBATIM' ==> OK Buffer contient la ligne de titre et la réponse attendue
                   -  'Sys. de fichiers blocs de 1K   Utilisé Disponible Uti% Monté sur'
                   -  '/dev/sdd1          123015548  49000524   74015024  40% /media/jj/VERBATIM'                             '1ère ligne non filtrée de la réponse
    }
      finally
      end;
      MyProcess.Free;
      VStrTemp.free;
    end;
     
    end.
    2 questions me taraudent l'esprit :

    1 : la plus évidente, pourquoi les réactions sont différentes ?
    2 : pourquoi lorsque cela fonctionne j'obtiens en réponse la 1ère ligne de la commande df en plus de la réponse attendue ?

    En vous souhaitant une bonne soirée,
    jjnoui

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 242
    Par défaut
    hello,
    c'est normal que cela ne fonctionne pas : il faut passer par un interpréteur de commande (comme bash) pour utiliser le | pipe :
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     MyProcess.Executable  := '/bin/bash';
      MyProcess.Parameters.Add('-c');
      MyProcess.Parameters.Add('df | grep VERBATIM');
    Ami calmant, J.P

  3. #3
    Membre actif
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 94
    Par défaut
    Bonjour J.P.
    C'est parfait
    Et merci.

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

Discussions similaires

  1. limit et temps d'execution avec oracle et PHP
    Par dor_boucle dans le forum Oracle
    Réponses: 20
    Dernier message: 10/12/2005, 14h31
  2. [Swing] execution avec Runtime.getRuntime().exec
    Par benssj5 dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 25/08/2004, 14h54
  3. [Debutant] comment creer un Executable avec Jbuilder
    Par JavaEli dans le forum JBuilder
    Réponses: 10
    Dernier message: 29/03/2004, 11h22
  4. problème lancement executable avec winexec()
    Par semenzato dans le forum MFC
    Réponses: 5
    Dernier message: 19/01/2004, 11h48
  5. [Debutant] Executable avec Jbuilder
    Par Stef784ever dans le forum JBuilder
    Réponses: 3
    Dernier message: 16/05/2003, 14h40

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