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 :

Problème d'arguments avec TProcess et le binaire "ls" sous Linux [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut Problème d'arguments avec TProcess et le binaire "ls" sous Linux
    Bonsoir,

    je viens vers vous car là je suis face à un mystère...

    Je sais utiliser TProcess, lui passer une liste de paramètres et en récupérer la sortie (je récupère ainsi les données SMART de mes disques, par exemple), mais je voudrais automatiser un peu plus et je veux donc construire une liste de disques avec la commande ls -1 /dev/sd? dont la sortie ressemblera à ça, dans un terminal :
    Le problème c'est que ça ne fonctionne pas, je me récupère une erreur "2" qui signifie "if serious trouble (e.g., cannot access command-line argument)."

    Si je remplace le "?" par "a" ou "b" ça fonctionne très bien, si je mets "*" j'ai la même erreur (au lieu de récupérer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /dev/sda
    /dev/sda1
    /dev/sda2
    /dev/sdb
    /dev/sdb1
    etc.)

    Je ne comprends pas, on dirait que le passage de caractères spéciaux (* et ? sont-ils vraiment "spéciaux" ?) met la pagaille...
    Un bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      with aProcess do // composant posé sur la form
      begin
        Executable := '/bin/ls'; // nom du binaire
        Parameters.Add('-1'); // pour aff. en colonne
        Parameters.Add('/dev/sd?'); // avec sda ça passe, avec * ou ? --> erreur 2 !
        Options := Options + [poWaitOnExit, poUsePipes, poDefaultErrorMode];
        Execute;
        iExitStatus := ExitStatus; 
      end;
    showmessage(inttostr(iExitStatus)); // 2=if serious trouble (e.g., cannot access command-line argument).
    Voilà...
    Si quelqu'un a une idée, je la lirai avec grand plaisir parce que là, je suis coincé

    Environnement : Debian Wheezy 32 bits, Lazarus 1.0.10 FPC 2.6.2
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello jipété,
    il faut lancer la commande dans un "shell" (sh,bash) pour pouvoir utiliser les caractères d'extension.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       with aProcess do // composant posé sur la form
      begin
        Executable := 'bash'; // nom du shell
        Parameters.Add('-c'); // pour 
        Parameters.Add('ls -l /dev/sd?'); 
        Options := Options + [poWaitOnExit, poUsePipes, poDefaultErrorMode];
        Execute;
        iExitStatus := ExitStatus;
      end;
    showmessage(inttostr(iExitStatus)); // 2=if serious trouble (e.g., cannot access command-line argument).
    Ami calmant J.P (pas té)
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Bonjour,

    un truc pareil je ne pouvais pas le deviner avant d'avoir eu le problème. Et la solution, grâce à toi ! ! !

    Bravo, merci, alléluia, c'est bientôt Noël, youp-la boum, + 1 !, et

    Bonne journée,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Membre averti

    Homme Profil pro
    Diverses
    Inscrit en
    Février 2014
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Diverses

    Informations forums :
    Inscription : Février 2014
    Messages : 122
    Points : 428
    Points
    428
    Par défaut
    Faire un appel à un programme externe pour ça me parait quand même un peu lourd. Tu dois pouvoir faire la même chose avec FindFirst/FindNext.

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par yamer Voir le message
    Faire un appel à un programme externe pour ça me parait quand même un peu lourd.
    Ben c'est parce que j'utilise beaucoup TProcess dans l'outil sur lequel je planche : récupération de "df" pour la surveillance de l'espace disque, utilisation de "rsync" pour les sauvegardes, de "smartctl" pour le monitoring, du coup je suis resté sur cette idée et il ne m'en est pas venu d'autres,

    Citation Envoyé par yamer Voir le message
    Tu dois pouvoir faire la même chose avec FindFirst/FindNext.
    En effet (sauf que les données sont en ordre alphabétique inversé : sdb, sda) :
    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
    procedure TForm1.Log(aData: string);
    begin
      memo1.Lines.Add(aData);
    end;  
     
    procedure TForm1.Button1Click(Sender: TObject);
    // http://www.freepascal.org/docs-html/rtl/sysutils/findfirst.html
    Var Info : TSearchRec;
        Count : Longint;
    Begin
      Count:=0;
      If FindFirst ('/dev/sd?', faAnyFile and faSysFile, Info)=0 then
      Repeat
        Inc(Count);
        With Info do log (Name);
      Until FindNext(info)<>0;
      FindClose(Info);
      log ('Finished search. Found ' + IntToStr(Count) +' matches');
    end;
    Merci pour l'idée,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

Discussions similaires

  1. [Lazarus] [Linux] Problème avec TProcess
    Par remissssss dans le forum Lazarus
    Réponses: 17
    Dernier message: 24/04/2014, 18h44
  2. Problème de chiffrement avec AES : argument (apparemment) null
    Par Leelith dans le forum Framework .NET
    Réponses: 12
    Dernier message: 27/04/2013, 15h41
  3. Réponses: 1
    Dernier message: 17/12/2012, 11h13
  4. histoire de fonction avec problème sur arguments
    Par bébé dans le forum Langage
    Réponses: 5
    Dernier message: 07/01/2006, 11h29
  5. Problèmes de versions avec Xalan, Xerces et Java
    Par honeyz dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2003, 10h18

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