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 :

Commande DOS avec espace


Sujet :

C++

  1. #1
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut Commande DOS avec espace
    Bonjour,
    Je développe actuellement un soft en C++. A un moment j'ai besoin de lancer un autre executable par ligne de commande. Cet executable a besoin d'un paramètre en entrée de type "chemin de fichier".
    voici mon code :
    Si le chemin de l'exe et du paramètre ne comportent pas d'espace, ce code fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	const char guillemet = 0x22;
                 const char espace = 0x20;
    	std::string cheminExe = _config->getDossierRessources();
    	std::string parametres = _config->getCheminPrincipalSauvegarde() ;		
                 std::string commande = cheminExe + espace + parametres;
    	int resultat = system(commande.c_str());
    Si le chemin de l'exe contient des espace mais que le chemin du paramètre ne contient pas d'espace, le code suivant fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	const char guillemet = 0x22;
                 const char espace = 0x20;
    	std::string cheminExe = _config->getDossierRessources();
    	std::string parametres = _config->getCheminPrincipalSauvegarde() ;		
                 std::string commande = guillemet + cheminExe + guillemet + espace + parametres;
    	int resultat = system(commande.c_str());
    Le problème que j'ai est la gestion du cas où les deux chemins contiennent des espaces. J'ai essayé le code suivant : mais il ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	const char guillemet = 0x22;
                 const char espace = 0x20;
    	std::string cheminExe = _config->getDossierRessources();
    	std::string parametres = _config->getCheminPrincipalSauvegarde() ;		
                 std::string commande = guillemet + cheminExe + guillemet + espace + guillemet + parametres + guillemet ;
    	int resultat = system(commande.c_str());
    Est ce que cela peut être aussi lié au fait d'utiliser des "slash" ou"backslash" dans les chemins des fichiers ?
    Voila, est ce que qqn aurait une idée de la méthode à adopter ?
    Merci d'avance

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    normalement, pour les espaces, on utilise des guillemets autour de la chaine contenant ces espaces. l'espace est le séparateur des arguments.

    dans ta troisième forme, tu écris concrêtement:
    chaine de ("commande" "valeur du premier parametre valeur du second parametre valeur du troisieme parametre")
    or, tu souhaite:
    chaine de ("commande" "valeur du premier parametre" "valeur du second parametre" "valeur du troisieme parametre")
    une bonne forme serait: std::string commande = quote(path) + quote(param1) + quote(param1);.
    avec quote une classe ou une fonction ajoutant des guillements et retournant une classe telle que operator + intercalle un espace.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    Merci pour ta réponse !
    En fait dans mon code j'ai écrit parametre avec un "s" à la fin mais il y en a bien qu'un seul.
    Cela revient bien à chaine( "commande" "parametre").
    Mais du coup pourquoi cela ne fonctionne t il pas ?

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    As-tu affiché la chaine générée? (entre deux marqueurs visibles)

    par exemple avec cout << '[' << commande << ']' << endl;Et es-tu certain des valeurs espace et guillemet? pourquoi ne pas avoir utilisé '\"' et ' '?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    J'ai effectué le test que tu m'as suggéré et voila le résultat :
    Nom : CaptureTest.PNG
Affichages : 368
Taille : 4,2 Ko

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Et c'est quoi le message d'erreur quand la commande correspond à votre exemple ?

  7. #7
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    Toujours en laissant un espace dans chaque chemin, j'ai juste modifié les dossiers pour qu'ils n'aient pas de similitudes entre eux.
    Le message d'erreur est le suivant :
    Nom : CaptureTest2.PNG
Affichages : 462
Taille : 11,7 Ko

    C'est donc le premier chemin déjà qu'il n'arrive pas à interpréter

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    essaie des guillemets autour de chaque dossier.
    essaie avec des '\' plutot que des '/'
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  9. #9
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    J'ai essayé les deux propositions que tu as faites mais j'ai la meme erreur...

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Alors commence par le début: ouvre une console, et lance la commande.

    Normalement, en utilisant la touche <tab>, tu dois avoir une complétion automatique.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  11. #11
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    Par la console c'est ce que j'avais fait dès le début. il met des guillemets autour de chaque chemin de fichier automatiquement dès qu'il détecte qu'au moins un sous dossier contient des espaces. au final on a la même forme de chaine que celle de la premiere copie écran de cette discussion. Et ça fonctionne ! C'est pour ça que je ne comprends pas pourquoi, en utilisant exactement la même chaine de commande, cela ne fonctionne pas en lançant depuis le programme en c++

  12. #12
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par cedji Voir le message
    J'ai essayé les deux propositions que tu as faites mais j'ai la meme erreur...
    Salut, tu as bien doublé tes backslashes dans ton code source ? std::cout << "C:\\folder" << std::endl; affichera C:\Folder
    -- Yankel Scialom

  13. #13
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    oui oui j'ai bien pensé au double backslash!

  14. #14
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Si tu utilises Windows 8, je ne sais pas trop ce qu'il se passe avec la ligne de commande, mais les guillemets ne marchent pas chez moi non plus. Je n'ai pas réussi à résoudre le problème, mais je ne me suis pas penché dessus très longtemps (j'ai trouvé une autre solution quand j'avais eu ce problème sans passer par system). En tout cas, oriente tes recherches autour de windows 8...

  15. #15
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Sinon créer un nouveau process : https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx (https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx)

    Comme cela ça pourra sans doute fonctionner.
    Raphchar.

  16. #16
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    Si tu utilises Windows 8, je ne sais pas trop ce qu'il se passe avec la ligne de commande, mais les guillemets ne marchent pas chez moi non plus. Je n'ai pas réussi à résoudre le problème, mais je ne me suis pas penché dessus très longtemps (j'ai trouvé une autre solution quand j'avais eu ce problème sans passer par system). En tout cas, oriente tes recherches autour de windows 8... .
    Je suis sous Windows 7 !

    Sinon créer un nouveau process : https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx (https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx)

    Comme cela ça pourra sans doute fonctionner. .
    Merci pour ta proposition raphchar, je vais essayer de ce coté là et je vous tiens au courant !

  17. #17
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    Avec la fonction CreateProcess je n'ai plus de soucis !
    Pour ceux que ça peut aider, voici le code que j'ai développé :

    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
     
    // chemin de l'exe
    const char guillemet = 0x22;
    const char espace = 0x20;
    std::string cheminExe = _config->getDossierRessources() + "/Test Saturation/LogicielVerificationSaturation.exe";
    std::string parametres = _config->getCheminPrincipalSauvegarde() + "/Scripts Opus/Echanges";
    std::string commande = guillemet + cheminExe + guillemet + espace + guillemet + parametres + guillemet;
    std::replace( commande.begin(), commande.end(), '/', '\\'); 
    LPTSTR szCmdline = _tcsdup(commande.c_str());
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );
    // Start the child process. 
    if( !CreateProcess( NULL, szCmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) ) 
    {				
      //récupération d'un message explicite associé au code d'erreur
      LPSTR messageErreurExplicite = NULL; 
      FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, (LPSTR)&messageErreurExplicite, 0,0);
      throw std::exception( messageErreurExplicite);
    }
    Merci pour votre aide !

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

Discussions similaires

  1. Exécuter une commande DOS avec VB.net 2005
    Par peregna2007 dans le forum VB.NET
    Réponses: 2
    Dernier message: 20/08/2008, 11h42
  2. Réponses: 2
    Dernier message: 13/06/2008, 19h15
  3. Réponses: 12
    Dernier message: 05/04/2007, 15h18
  4. Commande dos avec paramètres à partir d'excel
    Par tieumss dans le forum Access
    Réponses: 4
    Dernier message: 19/09/2006, 11h23
  5. [API][Système] Executer une commande dos avec arguments
    Par oOoOuuhmAn dans le forum Général Java
    Réponses: 4
    Dernier message: 17/03/2006, 12h37

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