Question Mingw32 / Msys peut-il exécuter des fichiers exécutables dos / cmd.exe sans fausser les arguments?


J'essaie d'exécuter growlnotify.exe depuis une invite Windows bash. La recompiler pour mingw32 n'est pas une bonne option pour moi.

growlnotify fonctionne si je l'utilise depuis l'invite cmd, mais il échoue (principalement) depuis l'invite bash. Il semble seulement pouvoir prendre un seul argument, un sans commutateur (qui est le message de notification). S'il y a plus d'un argument, il échoue silencieusement. S'il existe un seul commutateur et aucun autre argument, ce commutateur est envoyé en tant que message.

J'ai réussi à trouver quelques astuces sur Google concernant la manière dont Windows ne fournit pas de vrai tty, mais pas de correctifs. Existe-t-il un moyen astucieux de forcer cela à fonctionner? Une manière d'échapper correctement aux arguments telle qu'elle se comporte comme prévu?

Nouvelle information:

Si je le lance avec des barres obliques triplées, les arguments sont ignorés. Alors que si je l'exécute avec le format correct sous DOS, il échoue silencieusement.

Échec (échoue également si j'utilise //):

growlnotify /a:'Application Name' /n:'Notification Type' 'message goes here'

Mais ça:

growlnotify ///a:'Application Name' ///n:'Notification Type' 'message goes here'

Celui-ci enverra un avis avec le "message passe ici", mais comme si je n'avais pas pris la peine d'inclure les deux premiers arguments. Seules ou doubles barres obliques, il n'envoie jamais de notification (comme si je n'incluais aucun argument).

Les barres obliques quadruple et quintuple se comportent de la même manière que les barres obliques triples.

Explication des différents commutateurs.


5
2018-02-27 22:29


origine


Essayer growlnotify.exe //a:Lync testmessage - Maximus
@Maximus qui échoue également. J'ai essayé de lui échapper avec \ / a: ainsi que toutes les combinaisons de barres obliques doublées et triplées. - John O
Hum, vous pouvez vérifier, quelle ligne de commande est passée à exe. Recherchez dans TaskManager ou ProcessExplorer. Quels changements dans cmdline ont été faits par l'invite bash? - Maximus
@Maximus L'exe se ferme presque immédiatement, si elle apparaît dans le Gestionnaire des tâches, je ne peux pas le dire. - John O
@Maximus Une autre façon de voir les substitutions de ligne de commande finales consiste à passer les arguments à un .batscript au lieu de cmd.exe. Ils seront imprimés par défaut, sauf si @ ou echo off est utilisé pour supprimer l'impression en ligne. Le script pourrait utiliser cmd %* passer des arguments à cmd.exe. - jpaugh


Réponses:


Ok, la bonne réponse suit.

Pour échapper aux arguments tels que les exécutables dos peuvent être utilisés, vous doublez les barres obliques, telles que:

growlnotify //a:Application //t:Title "message here"

La raison pour laquelle cela échouerait pour moi était que je n’utilisais pas le même nom d’application que la veille (et qu’elle n’était pas enregistrée comme une autre application, et Growl For Windows ignore les notifications non enregistrées).

Il y a quelques autres astuces à mentionner. Dans CMD, vous pouvez émettre la déclaration comme ceci:

growlnotify //a:App //t:"With Spaces" "message here"

Les bombes "With Spaces". Je pense que msys / bash est peut-être en train d’étendre les guillemets, puis de les transmettre, de sorte que l’exécutable voit deux arguments, // t: avec et Les espaces". La bonne façon de faire semble être:

growlnotify //a:App //t:With\ Spaces "message here"

De plus, si vous passez dans un chemin de fichier, vous voudrez toujours utiliser le style DOS, ce qui signifie des barres obliques (car en fin de compte c'est l'exécutable de type DOS qui consommera cela). Mais ceux-ci seront interprétés comme des évasions, ce qui signifie qu'ils doivent également être doublés.

growlnotify //a:App //ai:C:\\path\\to\\icon.png "message here"

J'espère que cela aidera quelqu'un dans le futur.


8
2018-03-02 07:51





Avez-vous essayé d'exécuter "cmd.exe / c growlnotify.exe ..." de MinGW?


3
2018-02-27 22:36



Je n'ai pas, je vais le faire maintenant. - John O
Cela ne semble pas fonctionner, je l'exécute en tant que cmd.exe / C "growlnotify.exe / a: Lync testmessage", mais cela me fait tomber sur une invite cmd.exe sans rien faire. - John O
Ça marche avec cmd //c [command]. Dans MSYS, un argument de ligne de commande de "/ c" est interprété comme le lecteur C: pour passer un argument commençant par une barre oblique, vous devez utiliser deux barres obliques.  La source. - c24w
Merci beaucoup @ c24w. J'ai été coincé dans un tel problème toute la journée. - gustavohenke