C++ commandes system("..") windows

C++ commandes system("..") windows - C++ - Programmation

Marsh Posté le 12-09-2007 à 13:39:34    

bonjour,  
 
j'ai un petit souci avec du code:
 
#include <iostream.h>
 
int main ()
{
 
int rec;
 
a:
 
cout << " choix de la commande " << endl;
cout << "1: - SawmillCL.exe -p "Sawmill - MTL - eSafe" -a bd -" << endl;
cout << "2: - SawmillCL.exe -p "Sawmill - MTL - eSafe" -a rp -" << endl;
 
cin >> rec;
 
switch (rec)
{
 
case 1:
     
     system("\"C:\\Program Files (x86)\\Sawmill\\SawmillCL.exe -p \"Sawmill - MTL - eSafe\" -a bd\"" );
     break;
       
case 2:
     
     system("\"C:\\Program Files (x86)\\Sawmill\\SawmillCL.exe -p \"Sawmill - MTL - eSafe\" -a rp\"" );
     break;
 
 
     
default:
         
        goto a;
       
}
 
//system("ping 192.168.1.1" );
 
system("pause" );
 
}
 
en fait mon probleme est d'arriver à gerer les espaces dans la commande à passer
 
 
le chemin a la base est " c:\Program Files (x86)\Sawmill\SawmillCL.exe "
 
voici l'erreur:
 
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
Press any key to continue . . .
 
en fait meme en testant avec un .exe daffichage dos à la place de SawmillCL.exe cela me fait une erreur egalement
 
merci

Reply

Marsh Posté le 12-09-2007 à 13:39:34   

Reply

Marsh Posté le 12-09-2007 à 17:28:11    

argh ! un goto dans un programme C++ !
 
Sinon, tente en mettant un "\" devant ton espace

Reply

Marsh Posté le 12-09-2007 à 19:46:38    

j'ai testé cest pareil Dumbledore,
 
en fait il faudrai que je trouve toutes les fonctions et leur synthax et leur utilisation, je googleliz..
 
 
"
argh ! un goto dans un programme C++ !"
 
pourquoi cest pas bien les goto :/


Message édité par eX- le 12-09-2007 à 19:50:22
Reply

Marsh Posté le 12-09-2007 à 21:18:06    

ça gêne à la lisibilité du programme. C'est à utiliser de manière vraiment parcimonieuse quand t'as vraiment pas le choix et là, en l'occurrence, avec un while, c'est très facile à éviter


Message édité par Dumbledore le 12-09-2007 à 21:20:23
Reply

Marsh Posté le 13-09-2007 à 08:16:26    

oui mais en général je vais au plus rapide...

Reply

Marsh Posté le 13-09-2007 à 09:24:01    

en général tu vas au casse pipe :o
 
les goto y a genre 0.1 vrai raison de l'utiliser. En 10 ans d'XP j'en ai vu un une fois utilisé alors qu'on pouvait rien faire d'autre.  
 
Autant le break en terminaison prématurée de boucle ok, autant le goto ... ca démontre une méconnaissance assez crasse du langage.
 
Faut voir que bon, ca fait chier le compilo car ca lui brise son flot de controle, ca l'empeche d'optimsier des trucs etc ...
 
Bref :
 
Each time you sue a goto, god kills a kitten.
Please, think of the Kitten

 
:o

Reply

Marsh Posté le 13-09-2007 à 11:16:08    

ouais p-e bien Joel F moi je vois pas de problemes :)

Reply

Marsh Posté le 13-09-2007 à 11:23:16    

ok, on en reparle dans qqs années ;)

Reply

Marsh Posté le 13-09-2007 à 15:35:27    

Code :
  1. #include <iostream>
  2. int main ()
  3. {
  4. int rec=0;
  5. while (rec!=1 && rec!=2)
  6. {
  7.     cout << " choix de la commande " << endl;
  8.     cout << "1: - SawmillCL.exe -p "Sawmill - MTL - eSafe" -a bd -" << endl;
  9.     cout << "2: - SawmillCL.exe -p "Sawmill - MTL - eSafe" -a rp -" << endl;
  10.     cin >> rec;
  11. }
  12. if (rec==1)
  13.      system("\"C:\\Program\\ Files\\ (x86)\\Sawmill\\SawmillCL.exe -p \"Sawmill - MTL - eSafe\" -a bd\"" );
  14. else
  15.      system("\"C:\\Program\\ Files\\ (x86)\\Sawmill\\SawmillCL.exe -p \"Sawmill - MTL - eSafe\" -a rp\"" );
  16. //system("ping 192.168.1.1" );
  17. system("pause" );
  18. return 0;
  19. }


 
Ca fonctionne avec deux \ devant l'espace (en tout cas sous linux).
la commande passé au systeme devient C:\Program\ Files\ (x86)\Sawmill ... donc l'espace est protégé et le systeme trouve le fichier.
ex:
system("\"C:\\Program\\ Files\\ (x86)\\Sawmill\\SawmillCL.exe\"" );
 
edit: en voyant le resultat en grand, je me rends compte que \ ne peut pas être le caractère qui protège l'espace puisqu'il délimite l'arborescence sous windows. Peut être / alors...


Message édité par ptitchep le 13-09-2007 à 15:41:23

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 13-09-2007 à 16:04:30    

En fait sous windows chez moi ceci fonctionne parfaitement:
 

Code :
  1. int main()
  2. {
  3.     system("\"c:\\Program Files\\Hamachi\\hamachi.exe\"" );
  4.     system("pause" );
  5.     return 0;
  6. }


 
 :??: ...
 
Si ton programme ne fait que ça, c'est peut-être plus simple de faire un script, au moins c'est adapté.

Message cité 1 fois
Message édité par ptitchep le 13-09-2007 à 16:09:25

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 13-09-2007 à 16:04:30   

Reply

Marsh Posté le 14-09-2007 à 21:06:33    

autre solution :
 
"c:\\progra~1\\..."

Reply

Marsh Posté le 15-09-2007 à 14:08:11    

eX- a écrit :

ouais p-e bien Joel F moi je vois pas de problemes :)


Parce qu'il faut un minimum d'experience pour le voir, ce probleme.
http://en.wikipedia.org/wiki/GOTO# [...] goto_usage

Reply

Marsh Posté le 17-09-2007 à 20:01:51    

Ace17 a écrit :


Parce qu'il faut un minimum d'experience pour le voir, ce probleme.
http://en.wikipedia.org/wiki/GOTO# [...] goto_usage


 
 
peut etre Ace17 mais tant que ca satisfait, mes applis, mes clients, et mes collègues ,
je ne vois pas de problèmes à utiliser goto.
 
Merci quand meme

Message cité 2 fois
Message édité par eX- le 17-09-2007 à 20:04:19
Reply

Marsh Posté le 17-09-2007 à 20:05:13    

oui ms si un jour un collègue doit reprendre un de tes projets, il va mettre 10 fois plus de temps pour comprendre ce que tu as fait par rapport à un code propre.
 
edit: ortograf


Message édité par ptitchep le 17-09-2007 à 20:05:56

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-09-2007 à 20:35:57    

eX- a écrit :


peut etre Ace17 mais tant que ca satisfait, mes applis, mes clients, et mes collègues ,
je ne vois pas de problèmes à utiliser goto.


 
Parce que en plus, tu travail comme ça  :ouch:  
c'ets quoi ta boite ? j'espere que c'ets aps Dassault System ou un truc de gestion de centrale  :o

Reply

Marsh Posté le 18-09-2007 à 00:08:26    

eX- a écrit :


peut etre Ace17 mais tant que ca satisfait, mes applis, mes clients, et mes collègues ,
je ne vois pas de problèmes à utiliser goto.


Precisemment. Tu ne le vois pas, mais c'est juste parce que tu ne regardes pas assez loin. Cela te fait considerer ton programme comme un produit fini, c'est a dire comme une chose a laquelle tu n'effectueras plus de corrections. Le goto augmente ta probabilite de faire des erreurs lorsque tu modifieras ton programme par la suite, c'est aussi simple que ca.

Message cité 1 fois
Message édité par Ace17 le 18-09-2007 à 00:08:49
Reply

Marsh Posté le 18-09-2007 à 11:20:35    

En tout cas je me demande où tu as appris à utiliser goto.
Mon père a fait un IUT informatique dans les années 70 et c'était déjà formellement interdit. Je n'ai jamais vu le moindre prof ni le moindre bouquin parler du goto sinon pour dire de ne pas l'utiliser.
A part en assembleur, je n'ai jamais utilisé directement un jump.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 18-09-2007 à 17:03:41    

Ace17 a écrit :


Precisemment. Tu ne le vois pas, mais c'est juste parce que tu ne regardes pas assez loin. Cela te fait considerer ton programme comme un produit fini, c'est a dire comme une chose a laquelle tu n'effectueras plus de corrections. Le goto augmente ta probabilite de faire des erreurs lorsque tu modifieras ton programme par la suite, c'est aussi simple que ca.


 
voila cest deja plus precis comme explication, mais si mes collegues sont intelligents, il n'y a pas de problemes, et on s'en sert pas souvent.
toute facon je n'ai pas a justifier d'une quelconque utilisation de goto etant donné que le coeur du probleme ce situe autre pars.
 
ensuite:
 

ptitchep a écrit :

En tout cas je me demande où tu as appris à utiliser goto.
Mon père a fait un IUT informatique dans les années 70 et c'était déjà formellement interdit. Je n'ai jamais vu le moindre prof ni le moindre bouquin parler du goto sinon pour dire de ne pas l'utiliser.
A part en assembleur, je n'ai jamais utilisé directement un jump.


 
merci de nous raconter la vie de ton popa, mais tu ne repond malheuresement qu'a la polémique du goto et non le probleme initial,à savoir comment gerer les espaces avec la fonction system('') en c++.
 
Merci à vous

Message cité 1 fois
Message édité par eX- le 18-09-2007 à 17:04:32
Reply

Marsh Posté le 18-09-2007 à 17:09:27    

eX- a écrit :


merci de nous raconter la vie de ton popa, mais tu ne repond malheuresement qu'a la polémique du goto et non le probleme initial,à savoir comment gerer les espaces avec la fonction system('') en c++.
Merci à vous


 
lol
mais j'ai déjà écrit ça:
 

ptitchep a écrit :

En fait sous windows chez moi ceci fonctionne parfaitement:
 

Code :
  1. int main()
  2. {
  3.     system("\"c:\\Program Files\\Hamachi\\hamachi.exe\"" );
  4.     system("pause" );
  5.     return 0;
  6. }


 
 :??: ...
 
Si ton programme ne fait que ça, c'est peut-être plus simple de faire un script, au moins c'est adapté.


 
Comme tu le vois j'ai un espace moi aussi et pourtant mon executable est lancé sans problème. Tu es bien sûr de tes guillemets? J'ai windows XP et je ne pense pas que le fonctionnement de system() varie d'un pc à l'autre.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 20-09-2007 à 18:09:26    

ptitchep a écrit :


 
lol
mais j'ai déjà écrit ça:
 


 

ptitchep a écrit :


 
Comme tu le vois j'ai un espace moi aussi et pourtant mon executable est lancé sans problème. Tu es bien sûr de tes guillemets? J'ai windows XP et je ne pense pas que le fonctionnement de system() varie d'un pc à l'autre.


 
 
ok pour tester @home avc un nmap par exemple sur f:\n map\nmap.exe
 
#include <iostream.h>
 
 
int main()
{
     
system("\"f:\\n map\\nmap.exe\"" );
system("pause" );
return 0;    
}
 
cela passe merci pour ta contribution ptitchep.
 
Ma question initiale etait de savoir gerer les espaces sur la fonction system("chemin path" ) pour ca cest ok.
 
maintenant comme tu doit le savoir par exemple pour nmap il attend des arguments.
 
ma question est maintenant de savoir comment passer des arguments avc la fonction system("" ) tout en gerant deja les espaces blancs (f:\n...map\.)
 
à savoir  
 
system("\"f:\n map\nmap.exe\"" );
ca le lauch simplement
 
 avec par exemple -P0 ou meme plusieurs: nmap -P0 host
                                                         nmap -v -A scanme.nmap.org /and co...
 
Merci à vous

Reply

Marsh Posté le 20-09-2007 à 18:30:58    

Et system("\"f:\n map\nmap.exe\" \"argument 1\" arg2" ) ca marche pas?

Reply

Marsh Posté le 20-09-2007 à 19:01:53    

bah system attends une bete chaine. Donc tu construis ta chaine de commande via ostringstream et tu lui balance le str().

Reply

Marsh Posté le 12-01-2009 à 04:55:32    

Bonjour,
 
Je suis un peu dans la même situation, sauf que je récupère la chaine dans une variable via une CFileDialog. Du coup je ne peux pas savoir à l'avance s'il y aura un espace ou pas, et si l'utilisateur pioche dans un dossier à la "Documents and Settings" ça ne marche donc pas.
 

Code :
  1. if(dial.DoModal()==IDOK)
  2. {
  3.  CString pathname=dial.GetPathName();
  4.  string path=pathname;
  5.  system(path.c_str());
  6. }


 
Merci d'avance.

Reply

Marsh Posté le 12-01-2009 à 08:12:03    

bah faut ecrire une chtite fonction qui parse la chaine est ajoute ce qui faut. avec boost::strings ca devrait aller

Reply

Marsh Posté le 12-01-2009 à 08:48:59    

Hum oui en effet, j'ai juste pas réfléchit.
Il m'a juste suffit de concaténer un " au début et à la fin de ma variable. Ce qui n'est pas très dur avec un std::string ^^.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed