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 confirm�
    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
    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

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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.

  3. #3
    Membre confirm�
    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
    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

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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 ' '?

  5. #5
    Membre confirm�
    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
    Par d�faut
    J'ai effectu� le test que tu m'as sugg�r� et voila le r�sultat :
    Nom : CaptureTest.PNG
Affichages : 428
Taille : 4,2 Ko

  6. #6
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    Et c'est quoi le message d'erreur quand la commande correspond � votre exemple ?

  7. #7
    Membre confirm�
    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
    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 : 519
Taille : 11,7 Ko

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

  8. #8
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par d�faut
    essaie des guillemets autour de chaque dossier.
    essaie avec des '\' plutot que des '/'

  9. #9
    Membre confirm�
    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
    Par d�faut
    J'ai essay� les deux propositions que tu as faites mais j'ai la meme erreur...

  10. #10
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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.

  11. #11
    Membre confirm�
    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
    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 Expert
    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 : 38
    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
    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

  13. #13
    Membre confirm�
    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
    Par d�faut
    oui oui j'ai bien pens� au double backslash!

  14. #14
    Membre �clair�

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    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

  16. #16
    Membre confirm�
    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
    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 !

    Merci pour ta proposition raphchar, je vais essayer de ce cot� l� et je vous tiens au courant !

  17. #17
    Membre confirm�
    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
    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