Page 1 sur 2

[R] Paramètre en ligne de commande

Posté : mar. 14 févr. 2012 15:05
par 4sp4rt4m3
Salut à tous,


En premier projet, je me suis décidé à faire un petit GUI pour UPX que j'utilise en commande ligne. Les commandes sont basique histoire de me facilité la tâche.
Mon problème est que je bloque lorsque j'insère les paramètre de ligne de commande à Upx, rien ne se passe, je n'ai pas d'erreur pourtant. Malgré les topics qui en parle je n'arrive à mettre le doigt sur l'erreur.
http://www.autoitscript.fr/forum/viewto ... f=3&t=9336
http://www.autoitscript.fr/forum/viewto ... 72&p=50114
http://www.autoitscript.fr/forum/viewto ... =11&t=2931

Je fais :

Code : Tout sélectionner

Dim $Niv = GUICtrlRead($Combo1)
Dim $upx = &@TempDir"\upx.exe" ; le chemin de upx
$LireInput2 = GUICtrlRead($Input2)
Case $Compr
            FileInstall(".\upx.exe", @TempDir &"\") ; envoyer "upx.exe" dans le dossier Temp
            Run(@ComSpec & '/k ' & $upx & $FilePath1 & $Niv & '-o'&$LireInput2 ,"" , @SW_SHOW) ; ligne de commande
La commande se traduit par :

Code : Tout sélectionner

C:\Users\UserName\AppData\Temp\upx.exe C:\executable.exe -1 -oC:\Users\UserName\Desktop\executable_modifié.exe
Si il n'y a pas assez de code j'en mettrais plus!
Mais rien ne se passe. Comme je bloque dessus depuis hier, je viens demander un coup de main.
Ou est ce que j'ai foiré? j'ai même pas l'erreur d'autoit pour m'aiguiller et le Tuto de Tlem ne m'a pas beaucoup aidé... :?

Merci de de vos éventuelles aides. ;)

Re: [..] Paramètre en ligne de commande

Posté : mar. 14 févr. 2012 16:59
par ani
Bien le bonjour

EXe - mode de compression - Nouveau Nom de Fichier Compressé - Fichier à Compresser

Code : Tout sélectionner

UPX [color=#0080FF]-1[/color] [color=#0000FF]-oModFichier.exe[/color] [color=#FF0000]Fichier.exe[/color]
ce qui donne

Code : Tout sélectionner

C:\Users\UserName\AppData\Temp\upx.exe -1 -oC:\Users\UserName\Desktop\executable_modifié.exe C:\executable.exe
une simple commande sous ms-dos (UPX -h)

Bonne continuation
voilàvoilà ;)

Re: [..] Paramètre en ligne de commande

Posté : mar. 14 févr. 2012 19:52
par 4sp4rt4m3
Salut Ani,


Le placement du mode de compression dans la ligne de commande ne change rien.

Le code :

Code : Tout sélectionner

upx fichier .exe -1 -oSortie.exe
marche aussi bien que :

Code : Tout sélectionner

upx -1 fichier.exe -oSortie.exe
Enfait je pensais que le problème se situait au niveau des quotes des variables ou autre chose.
Ou est le problème ici?

Code : Tout sélectionner

Run(@ComSpec & '/k ' & $upx & $FilePath1 & $Niv & '-o'&$LireInput2 ,"" , @SW_SHOW)
Merci quand même... :wink:

Re: [..] Paramètre en ligne de commande

Posté : mar. 14 févr. 2012 21:41
par Tlem
Je pense qu'il manque des espaces :

Code : Tout sélectionner

$upx & " " & $FilePath1 & " " & $Niv & ' -o' & $LireInput2

Re: [..] Paramètre en ligne de commande

Posté : mar. 14 févr. 2012 21:50
par DimVar
Bonjour 4sp4rt4m3,

Je vois que tu es sous W7 ou Vista et j'ai deja rencontré un pb avec le retour de @tempdir qui me renvoyait une chaine avec les noms de dossier de type "C:\Users\ADMINI~1\AppData\Local\Temp" au lieu de "administrateur"... (sous XP pas de soucis)

Cdlt.

Re: [..] Paramètre en ligne de commande

Posté : mar. 14 févr. 2012 22:58
par ani
Dim $upx = &@TempDir"\upx.exe" ; le chemin de upx
soit C'cette erreur ou alors celle cité plus haut l'espacement ou encore quote ou encore l'ensemble :oops:
ou t'a rajouté cette variable ($upx) supplémentaire pour réduire le code ?

au lieu d'un run remplace le par un consolwrite|msgbox ;)

car là il est vrai qu'il manque des espaces et un commutateurs pour la variable niveau (ou c'est inclus dans ton combo?)

Code : Tout sélectionner

Run(@ComSpec & ' /k ' & @TempDir & '\upx.exe' & chr(32) & $FilePath1 & chr(32) & '-' & $Niv & chr(32) & '-o' & $LireInput2,"",@SW_SHOW)
chr(32) = espace

Re: [..] Paramètre en ligne de commande

Posté : mer. 15 févr. 2012 00:34
par 4sp4rt4m3
Tlem a écrit :Je pense qu'il manque des espaces :

Code : Tout sélectionner

$upx & " " & $FilePath1 & " " & $Niv & ' -o' & $LireInput2
J'ai "erreur dans l'expression" en mettant les espaces.
ani a écrit :
Dim $upx = &@TempDir"\upx.exe" ; le chemin de upx
soit C'cette erreur ou alors celle cité plus haut l'espacement ou encore quote ou encore l'ensemble :oops:
ou t'a rajouté cette variable ($upx) supplémentaire pour réduire le code ?

au lieu d'un run remplace le par un consolwrite|msgbox ;)

car là il est vrai qu'il manque des espaces et un commutateurs pour la variable niveau (ou c'est inclus dans ton combo?)
Sans le & Autoit m'annonce une erreur. EDIT : j'ai rectifié effectivement. :?

Et oui le commutateur est inclus dans le combo. :)
En revanche Consolewrite n'est pas adapté car la manip est censé se faire en caché.
DimVar a écrit :Bonjour 4sp4rt4m3,

Je vois que tu es sous W7 ou Vista et j'ai deja rencontré un pb avec le retour de @tempdir qui me renvoyait une chaine avec les noms de dossier de type "C:\Users\ADMINI~1\AppData\Local\Temp" au lieu de "administrateur"... (sous XP pas de soucis)

Cdlt.
j'ai le même problème sous XP, soit rien se lance...


Je vous met le code complet, pour y voir mieux, j'ai peut être foiré ailleurs :
► Afficher le texteCode complet
Voila, si quelqu'un a le temps de jeter un coup d'oeil. Merci à vous tous en tout cas :wink:

Re: [..] Paramètre en ligne de commande

Posté : mer. 15 févr. 2012 01:05
par TopXm
Salut,

Ce que voulais te dire ani c'est que ton & est mal placé :

Code : Tout sélectionner

$upx = @TempDir & "\upx.exe" ; le chemin de upx
Pour faire un mixte des précédents bons conseils, en fait il faut que ta commande soit le reflet exact de ce que tu pourrais saisir en invite de commande (mais ça tu t'en doutes :) ) d'où l'idée (d'ani encore :) ) de faire un ConsoleWrite dans un 1er temps pour contrôler la syntaxe de ta commande ;)
Exemple :

Code : Tout sélectionner

ConsoleWrite(@TempDir & '\upx.exe' & chr(32) & $FilePath1 & chr(32) & '-' & $Niv & chr(32) & '-o' & $LireInput2)
ConsoleWrite(@CRLF)
NB1 : je l'ai mis sur deux lignes, pour bien différencier la commande et le CRLF derrière.
NB2 : Tlem ne poste pas pour rien ;) problème d'espace. Je ne connais pas les switchs pour upx.exe mais "métavi" qu'il faut au moins un espace entre upx.exe et le double-quote qui suit (enfin je pense), pour le reste ... chépa je ne trouve même pas la syntaxe :oops:

Re: [..] Paramètre en ligne de commande

Posté : mer. 15 févr. 2012 02:06
par 4sp4rt4m3
Avec consolewrite je ne peux même pas vérifié si la syntaxe est bonne, rien ne se passe, la console ne s'ouvre pas et autoit ne me balance aucune erreur. Cependant j'avais déjà vérifié la syntaxe avec des msgbox et tout s'affiche comme il faut...
Même en mettant le chemin en "dur", rien ne se lance...

Sinon oui effectivement mon & été mal placé, j'ai rectifié... Merci :)

Re: [..] Paramètre en ligne de commande

Posté : mer. 15 févr. 2012 05:36
par DimVar
Petite insomnie, j'en profite pour tester ton code.

- Ta variable $upx n'est pas utilisée ?
- Sur ta commande en ligne 93

Code : Tout sélectionner

Run(@ComSpec & '/k '  @TempDir & 'upx.exe' & " " & $FilePath1 & " " & $Niv & ' -o' & $LireInput2 ,"" , @SW_SHOW) ; ligne de commande
Il manque un "&" avant le @tempdir, un espace avant le "/k" et un backslash avant upx.exe

Code : Tout sélectionner

Run(@ComSpec&' /k '&@TempDir&'\upx.exe '&$FilePath1&" "&$Niv&' -o'&$LireInput2 ,"" , @SW_SHOW) ; ligne de commande
REMARQUE : Compressing 64 bit windows executables is not supported yet. It will show an error message "can't pack new-exe."

Testé et ok, je vais me recoucher... :)

Re: [..] Paramètre en ligne de commande

Posté : mer. 15 févr. 2012 10:52
par ani
Alors au niveau de la variable $FilePath1, il serait bon de lui fournir l'information désiré
il te manque un GuiCtrlRead ^^'

→ $FilePath1 = GuiCtrlRead($Input1)

je pârt tester ton code sous seven

bonne continuation ;)

Re: [..] Paramètre en ligne de commande

Posté : mer. 15 févr. 2012 22:12
par Tlem
TopXm a écrit :NB2 : Tlem ne poste pas pour rien ;) problème d'espace. Je ne connais pas les switchs pour upx.exe mais "métavi" qu'il faut au moins un espace entre upx.exe et le double-quote qui suit (enfin je pense), pour le reste ... chépa
Heuu, ben quand on sait pas, on dit rien. :P

Je signale que je suis parti du message précédent qui donne ceci :

Code : Tout sélectionner

Run(@ComSpec & '/k ' & $upx & $FilePath1 & $Niv & '-o'&$LireInput2 ,"" , @SW_SHOW)
Si je fait abstraction de Run(@ComSpec & '/k ' & qui est juste, nous avons :

Code : Tout sélectionner

$upx & $FilePath1 & $Niv & '-o'&$LireInput2
qui traduit par les données du premier message nous donne :

Code : Tout sélectionner

C:\Users\UserName\AppData\Temp\upx.exeC:\executable.exe-1-oC:\Users\UserName\Desktop\executable_modifié.exe
Ya pas un blème d'espaces pour vous ?

Soyons fou, je dirait même que ma réponse est incomplète, car si l'un des chemins contient un seul espace, alors c'est foutu. :roll:

Donc je révise ma réponse par celle-ci :

Code : Tout sélectionner

Run(@ComSpec & '/k "' & $upx & '" "' & $FilePath1 & '" ' & $Niv & ' -o"' & $LireInput2 & '"' ,"" , @SW_SHOW)
Attention aux doubles et simples guillemets. Dans ce cas vaut mieux passer par du copier/coller. ;)

Re: [R] Paramètre en ligne de commande

Posté : jeu. 16 févr. 2012 06:51
par 4sp4rt4m3
ani a écrit :Alors au niveau de la variable $FilePath1, il serait bon de lui fournir l'information désiré
il te manque un GuiCtrlRead ^^'

→ $FilePath1 = GuiCtrlRead($Input1)
Non j'ai reussi à faire sans, et j'ai vérifié, cela affiche bien $FilePath1, sans passez pas GUICtrlRead

Code : Tout sélectionner

Case $Button1
            Global $FilePath1 = FileOpenDialog("Sélectionnez l'executable", @DesktopDir, "Executable (*.exe)", 1)
            GUICtrlSetData($Input1, $FilePath1)
Tlem a écrit :Ya pas un blème d'espaces pour vous ?

Soyons fou, je dirait même que ma réponse est incomplète, car si l'un des chemins contient un seul espace, alors c'est foutu. :roll:
Attention aux doubles et simples guillemets. Dans ce cas vaut mieux passer par du copier/coller. ;)
Effectivement, surtout au niveau des doubles guillemets pour le chemin avec espace, j'y avais pensais mais chaque chose en son temps, le code avec un chemin sans espace ne marchait déjà pas :D

J'ai fait les corrections, et toujours le même soucis, rien ne se lance, pas d'erreur, même pas de console qui s'affiche brièvement, rien.
► Afficher le texteCode complet
Bref, je vais mettre ça de coté, je le reprendrais plus tard, merci à tous pour vos conseils, avis et corrections :wink:

Re: [R] Paramètre en ligne de commande

Posté : jeu. 16 févr. 2012 07:37
par DimVar
Euh.... J'ai apporté une reponse... L'as tu vu ?
Ce code fonctionne tres bien chez moi.

Re: [R] Paramètre en ligne de commande

Posté : jeu. 16 févr. 2012 14:16
par 4sp4rt4m3
DimVar a écrit :Euh.... J'ai apporté une reponse... L'as tu vu ?
Ce code fonctionne tres bien chez moi.
Arf j'avais pas vu ton message, quel imbecile tête en l'air :mrgreen: . Effectivement ça marche nickel!!!
DimVar a écrit : Il manque un "&" avant le @tempdir, un espace avant le "/k" et un backslash avant upx.exe

Code : Tout sélectionner

Run(@ComSpec&' /k '&@TempDir&'\upx.exe '&$FilePath1&" "&$Niv&' -o'&$LireInput2 ,"" , @SW_SHOW) ; ligne de commande
L'espace avant le /k je l'avais considéré comme "acquis" et je ne serais surement pas revenu dessus (quelle erreur), bien vu, je n'ai plus qu'a inclure les doubles guillemet comme le disais Tlem pour prévoir les espaces dans "chemins" et tout roule.

Merci DimVar, en faite merci à tous pour le coup de main... :wink:

Re: [R] Paramètre en ligne de commande

Posté : jeu. 16 févr. 2012 15:21
par DimVar
C'est bien ce qui me semblait :P
T'embete pas trop pour les double quotes et la gestion des espaces, moi je l'inclue (l'espace) a la suite de UPX.EXE

Code : Tout sélectionner

Run(@ComSpec&' /k '&@TempDir&'\upx.exe '<---ICI
Comme l'avait dis ani ou autre, le consolewrite te permet de copier coller la ligne et de la tester direct en cmd. C'est d'ailleurs comme ca que j'ai eu l'erreur ("can't pack new-exe.") en voulant compacter calc.exe (compilé pour 64bits).

Bonne continuation.

Re: [R] Paramètre en ligne de commande

Posté : jeu. 16 févr. 2012 16:12
par 4sp4rt4m3
Non je parlais de la gestion des espaces pour les chemins de destination genre

Code : Tout sélectionner

 upx C:\exemple.exe -1 -oD:\Dossier Perso\Bla\BlaBla\BlaBla.exe
Le code qui sera pris en compte c'est :

Code : Tout sélectionner

upx C:\exemple.exe -1 -oD:\Dossier
A cause de l'espace entre 'dossier' et 'Perso' qui coupe le chemin... Il faut attacher le chemin avec des guillemets...

Code : Tout sélectionner

 upx C:\exemple.exe -1 -o"D:\Dossier Perso\Bla\BlaBla\BlaBla.exe"
C'est de ça dont je parlais :D

Re: [R] Paramètre en ligne de commande

Posté : jeu. 16 févr. 2012 16:16
par DimVar
Autant pour moi.

Dans ce cas, il faut je pense, quoter les doubles quotes. Car nombre de commandes dos acceptent les espaces dans les chaines si ils sont doucle quotés. il faudra donc scripter comme suit :

Executable.exe '"c:\documents ans settings\test\toto"'

Cdlt.

Re: [R] Paramètre en ligne de commande

Posté : jeu. 16 févr. 2012 18:13
par 4sp4rt4m3
Après une demi heure de recherche, je n'ai pas réussi à doubler les guillemets des variables malgré ton exemple. Du coup j'ai trouvé une solution, ça fonctionne, mais j'avoue que ça fait un peu "bricoleur du dimanche".

Code : Tout sélectionner

Dim $Guil = '"'
Run(@ComSpec&" /k "&@TempDir&"\upx.exe "&$Guil&$FilePath1&$Guil&" "&$Niv&" -o" &$Guil&$LireInput2&$Guil,"" , @SW_SHOW)
 

Re: [R] Paramètre en ligne de commande

Posté : jeu. 16 févr. 2012 23:29
par DimVar
C'est une maniere de faire.
Une autre aurait été :
► Afficher le texte