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

Langage Delphi Discussion :

[D7/Win11] Exécution ligne de commande


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut [D7/Win11] Exécution ligne de commande
    Bonjour

    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    SUBST W: "C:\Users\miche\AppData\Local\VirtualStore\Program Files (x86)\SPIDD\Database"
    ceci fonctionne parfaitement en ligne de commande pour monter un dossier en tant que lecteur sous Windows.

    Je voudrais faire la même chose directement à partir de Delphi. J'ai essayé une bonne quinzaine d'écritures tournant autour de ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      try
          ShellExecute(0, nil, 'cmd.exe', '/C SUBST S: "C:\Users"', nil, SW_Hide);
     
      except
          on E: Exception do
            showmessage(E.ClassName+ ': '+ E.Message);
      end;
    le dossier n'est pas monté en tant que lecteur et je n'obtiens aucun message d'erreur.
    Quelqu'un peut-il me venir en aide?
    Merci par avance.

  2. #2
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 614
    Points
    3 614
    Par défaut
    normalement il attend une chaîne de caractères, donc faudrait mettre la commande entre guillemets

    l'as-tu essayée dans l'interpréter de commande sans passer par Delphi ? tu peux appeler cmd.exe dans l'interpréter de commande, ça sera plus simple

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 097
    Points : 41 081
    Points
    41 081
    Billets dans le blog
    62
    Par défaut
    Bonjour et bienvenue,

    j'aurais écrit différemment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try
          ShellExecute(0, nil, 'SUBST', 'S: "D:\AEnvoyer"', nil, SW_Hide);
     
      except
          on E: Exception do
            showmessage(E.ClassName+ ': '+ E.Message);
      end;
    Nom : Capture.PNG
Affichages : 178
Taille : 3,6 Ko
    cela écrit, ce n'est pas testé avec D7 ni sous Windows 11 mais avec D11.1(Alexandria) en FMX (j'avais un truc sous la main) et windows 10

    du coup, il m'a fallu faire aussi l'opération inverse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         ShellExecute(0, nil, 'SUBST', 'S: /d', nil, SW_Hide);

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    merci à vous deux.
    J'ai utilisé la méthode indiquée par Sergio et cela fonctionne parfaitement.
    Bonne journée

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Sinon, faudrait quand même tenté ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, nil, 'cmd.exe', '/C "SUBST S: ""C:\Users"""', nil, SW_Hide);
    Le paramètre /C pour cmd.exe indique que le paramètre suivant sera une chaine à exécuter du coup comme la chaine contient des espaces faut ajouter " mais comme cela contient en plus " faut les doubler
    C'est purement théorique mais par curiosité

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    dans ce cas là, la curiosité n'est pas un vilain défaut mais malheureusement ça ne fonctionne pas.
    Merci et bonne journée

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    en fait SUBST n'est pas une commande du shell mais un programme dans C:\Windows\System32\Subst.exe...je pense qu'il serait plus simple de l'invoquer directement

    cependant, en regardant les fonctions importées du programme je repère la fonction DefineDosDeviceW

    et si on recherche Delphi et DefineDosDevice on tombe sur http://www.delphigroups.info/2/ff/487466.html qui propose

    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
     
    function Subst(Drive:char;Path:string):boolean;
    var
      zPathName:array[0..80] of char;
      zDrvStr:array[0..5] of char;
      Flags:dWord;
    begin
      Flags:=0;
      zDrvStr[0]:=Drive; zDrvStr[1]:=':'; zDrvStr[2]:=#0;
      if (Path='/d') or
         (Path='/D')
      then begin
        Flags:=DDD_REMOVE_DEFINITION or DDD_RAW_TARGET_PATH;
        QueryDOSDevice(zDrvStr,zPathName,sizeof(zPathName));
      end else begin
        if not(DirectoryExists(Path)) then begin
          Result:=false; exit;
        end;
        StrPCopy(zPathName,Path);
      end;
      Result:=DefineDOSDevice(Flags,zDrvStr,zPathName);
    end;
    le code n'est pas très beau mais devrait fonctionner...sans tester j'aurais écris ceci

    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
     
    // Subst('W:', 'C:\Users\miche\AppData\Local\VirtualStore\Program Files (x86)\SPIDD\Database');
    function Subst(const Drive: string; Path: string): Boolean;
    var
      Flags: DWORD;
    begin
      if Path = '/D' then
      begin
        Flags := DDD_REMOVE_DEFINITION;
        Path := '';
      end
      else
      begin
        Flags := DDD_RAW_TARGET_PATH;
      end;
      Result := DefineDosDevice(Flags, PChar(Drive), PChar(Path));
    end;
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Subst('W:', 'C:\Users\miche\AppData\Local\VirtualStore\Program Files (x86)\SPIDD\Database');
    function Subst(const Drive, Path: string): Boolean;
    var
      Flags: DWORD;
    begin
      if Path = '' then
        Flags := DDD_REMOVE_DEFINITION;
      else
        Flags := DDD_RAW_TARGET_PATH;
      Result := DefineDosDevice(Flags, PChar(Drive), PChar(Path));
    end;

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    En fait, le doublement n'est pas géré comme on pourrait le penser, c'est plus simple et je ne sais pas comment il le gère pour comprendre que le premier " n'est pas la fin du paramètre, peut-être que " non suivi d'un espace est pris comme de la donnée.

    Pour ce genre de chose faut commencer par un mode visible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ShellExecute(0, nil, 'cmd.exe',  '/K "SUBST T: "C:\Program Files (x86)\Embarcadero\Studio""', nil, SW_SHOW);
    et la version silencieuse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ShellExecute(0, nil, 'cmd.exe',  '/C "SUBST T: "C:\Program Files (x86)\Embarcadero\Studio""', nil, SW_HIDE);
    Citation Envoyé par Paul TOTH Voir le message
    en fait SUBST n'est pas une commande du shell mais un programme dans C:\Windows\System32\Subst.exe...je pense qu'il serait plus simple de l'invoquer directement
    C'est la proposition de SergioMaster, l'appel direct
    Disons que la résistance sur CMD /C était une curiosité

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    je crois que j'ai été traumatisé par ma période Visual Basic (pré-Delphi 1...oui ça remonte, mais le traumatisme est toujours là) pour lequel j'utilisais assez souvent la fonction SHELL() pour tout et n'importe quoi...maintenant je cherche toujours une solution par API

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

Discussions similaires

  1. [Hudson] Exécution ligne de commande batch
    Par kij dans le forum Intégration Continue
    Réponses: 2
    Dernier message: 16/06/2010, 18h42
  2. exécuter un programme en ligne de commande
    Par karamasov dans le forum Général Java
    Réponses: 8
    Dernier message: 17/09/2008, 16h52
  3. Réponses: 1
    Dernier message: 26/07/2006, 11h23
  4. [SQL-Server] exécution mssql_connect() en ligne de commande
    Par turinico dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/11/2005, 18h45

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