Découper une chaîne contenant des paramètres de ligne de commande dans un String[] en Java
Similaire à ce fil de discussion pour C#, j'ai besoin de découper une chaîne contenant les arguments de ligne de commande à mon programme si je peux permettre aux utilisateurs de facilement exécuter plusieurs commandes. Par exemple, je pourrais avoir de la chaîne suivante:
-p /path -d "here's my description" --verbose other args
Compte tenu de ce qui précède, Java devrait normalement passer dans main:
Array[0] = -p
Array[1] = /path
Array[2] = -d
Array[3] = here's my description
Array[4] = --verbose
Array[5] = other
Array[6] = args
Je n'ai pas besoin de vous inquiéter d'une coquille d'expansion, mais il doit être assez intelligent pour gérer les guillemets simples et doubles et les évasions qui peuvent être présents au sein de la chaîne. Quelqu'un sait d'une façon d'analyser la chaîne de la coquille serait dans ces conditions?
NOTE: je ne PAS besoin de le faire en ligne de commande de l'analyse, je suis déjà en utilisant joptsimple de le faire. Au contraire, je veux faire mon programme facilement scriptable. Par exemple, je veux que l'utilisateur soit en mesure de placer à l'intérieur d'un seul fichier un ensemble de commandes que chacun de valable sur la ligne de commande. Par exemple, tapez la ligne suivante dans un fichier:
--addUser admin --password Admin --roles administrator,editor,reviewer,auditor
--addUser editor --password Editor --roles editor
--addUser reviewer --password Reviewer --roles reviewer
--addUser auditor --password Auditor --roles auditor
Ensuite, l'utilisateur d'exécuter mon outil d'administration comme suit:
adminTool --script /path/to/above/file
main()
trouverez le --script
option et itérer sur les différentes lignes dans le fichier, le fractionnement de chaque ligne dans un tableau que je puis feu à une joptsimple instance qui serait ensuite passé dans mon application pilote.
joptsimple est livré avec un Analyseur qui a un méthode d'analyse, mais il ne prend en charge que String
tableau. De même, la GetOpt constructeurs exigent également un String[]
-- d'où la nécessité d'un analyseur.
- Ne pourriez-vous utiliser le tableau args donné dans main() au lieu d'essayer de l'analyser vous-même?
- J'ai mis à jour ma question pour décrire pourquoi j'ai besoin pour analyser la chaîne et de la façon qui est différente de la ligne de commande de l'analyse.
- Je ne pense pas que c'est toute différente de celle que la ligne de commande de l'analyse, voir l'addendum à ma réponse sur la façon dont je me suis approché quelque chose de très semblable à cela dans le passé.
- je viens d'ajouter une courte réponse que vous pourriez trouver utiles - maintenant que vous avez ajouté quelques explanaitions à votre question 🙂
Vous devez vous connecter pour publier un commentaire.
Ici est une jolie alternative facile pour le découpage d'une ligne de texte à partir d'un fichier dans un vecteur argument de sorte que vous pouvez les importer dans votre analyseur d'options:
C'est la solution:
La magie de la classe
ligne de commande
fait partie de ant. Donc, vous avez à mettre ant sur le chemin de classe, ou il suffit de prendre la ligne de commande classe que la méthode utilisée est statique.translateCommandline
gère à la fois unique et chaînes entre guillemets doubles et s'échappe en leur sein, mais ne reconnaît pas la barre oblique inverse dans la même manière comme un shell POSIX en raison de problèmes que provoque sur le DOS pour les systèmes.translateCommandline
et de le modifier pour l'adapter à mes besoins.Si vous avez besoin uniquement de type UNIX, Systèmes d'exploitation, il y a une solution encore meilleure. Contrairement à
Commandline
de fourmi, ArgumentTokenizer de DrJava est plussh
-like: il prend en charge échappe!Au sérieux, même quelque chose de fou comme
sh -c 'echo "\"un'\''kno\"wn\$\$\$'\'' with \$\"\$\$. \"zzz\""'
est correctement segmentées en[bash, -c, echo "\"un'kno\"wn\$\$\$' with \$\"\$\$. \"zzz\""]
(En passant, lors de l'exécuter, cette commande renvoie"un'kno"wn$$$' with $"$$. "zzz"
).Vous devez utiliser un complet moderne orientées objet en Argument de Ligne de Commande de l'Analyseur-je proposer à mes favoris Java Simple Argument De L'Analyseur. Et comment utiliser JSAP, c'est à l'aide de Groovy comme un exemple, mais il est le même pour tout droit de Java. Il est également args4j qui est, à certains égards, plus moderne que JSAP car il utilise des annotations, rester à l'écart de l'apache.commons.cli choses, il est vieux et cassé et très procédurale et de l'onu-Java-eques dans son API. Mais j'ai toujours retomber sur JSAP parce qu'il est si facile de construire votre propre argument des gestionnaires.
Il y a beaucoup de défaut d'Analyseurs pour les Url, Numéros, InetAddress, la Couleur, la Date, le Fichier, la Classe, et il est super facile d'ajouter vos propres.
Par exemple ici est un gestionnaire de carte arguments pour les Énumérations:
et je ne suis pas un fan de la configuration de la programmation via XML, mais JSAP a vraiment une belle façon de déclarer les options et les paramètres à l'extérieur de votre code, de sorte que votre code n'est pas jonché de centaines de lignes de configuration qui encombre et masque le réel, le code fonctionnel, voir mon lien sur comment utiliser JSAP pour un exemple, moins de code que toutes les autres bibliothèques que j'ai essayé.
C'est une voie de solution à votre problème, comme précisé dans votre mise à jour, les lignes dans votre "script" fichier des lignes de commande. Lire dans le fichier ligne par ligne et d'appel
JSAP.parse(String);
.J'utilise cette technique pour fournir "ligne de commande" de la fonctionnalité des applications web tout le temps. Une utilisation particulière a été dans un Jeu en Ligne Massivement Multijoueur avec un Directeur/Flash frontal que nous avons permis à l'exécution de "commandes" dans le chat comme et utilisé JSAP sur l'extrémité arrière de les interpréter et d'exécuter du code sur la base de ce qu'il analysé. Très semblable à ce que vous êtes désireux de le faire, sauf vous lisez la section "commandes" à partir d'un fichier au lieu d'une prise de courant. Je voudrais fossé joptsimple et il suffit d'utiliser JSAP, vous aurez vraiment gâté par son extensibilité puissante.
JSAPResult
plutôt qu'unString[]
, donc je ne vais pas être en mesure de l'utiliser sans avoir à passer ma commande en ligne de l'analyse de la bibliothèque :(.String[]
est assez inutile, la raison de toute JSAP résultat est tout l'analyse et la mise en œuvre de règles et de vérification pour vous. Je pense que si vous avez vraiment pas en arrière à partir de là où vous êtes certains de repenser votre approche et du remaniement sera vraiment bénéfique. Voir ma mise à jour basé sur votre dernière modification.line.split(" ")
n'est pas presque assez intelligent. Il allait mourir sur le paramètre que l'on créeArray[3]
comme je l'ai indiqué dans mon post en tant que paramètres peut avoir à la fois des espaces et des séquences d'échappement à l'intérieur de eux. J'ai besoin d'un analyseur complet pour gérer toutes les possibilités-mais j'ai besoin d'une ficelle de String[] parser, plutôt que d'une ligne de commande de l'analyseur.String[]
est extrêmement utile pour moi car j'ai déjà unjoptsimple
ligne de commande de l'analyseur qui gère toutes les commandes qui seraient émises au sein de mon fichier. J'ai besoin seulement de convertir la chaîne enString[]
afin d'être en mesure de fournir facilement des scripts de plusieurs commandes.CommandLineTokenizer
est très proche de ce dont j'ai besoin (et peut être suffisant). Il traite la chaîne comme Windows 2000 et non plus comme un shell Unix.Expansion sur Andreas_D réponse, au lieu de la copie, l'utilisation
CommandLineUtils.translateCommandline(String toProcess)
de l'excellent Plexus Utilitaires bibliothèque.- Je utiliser le Java Getopt port de le faire.
String[]
.