Comment puis-je passer des arguments à un fichier batch?
J'ai besoin de passer d'un IDENTIFIANT et d'un mot de passe pour un fichier de commandes au moment de l'exécution plutôt que de coder en dur dans le fichier.
Voici ce que la ligne de commande ressemble à ceci:
test.cmd admin P@55w0rd > test-log.txt
- Pour "tout le reste" voir Greg Hegill commentaire sur comment obtenir le fichier de commandes des paramètres de la Nième position sur?
- J'ai un environnement de script de démarrage qui va pousser mon nom d'utilisateur/mot de passe dans les variables d'environnement... alors que je n'ai pas à les taper à chaque fois... je suis en utilisant bash la plupart du temps si (linux, mac et windows), et le besoin de l'utiliser pour proxy configuration des scripts, etc pour le travail.
Vous devez vous connecter pour publier un commentaire.
Une autre astuce utile est d'utiliser
%*
pour dire "tous". Par exemple:Lorsque vous exécutez:
les commandes ci-dessus fichier sera exécuté:
J'ai peut-être la syntaxe un peu mal, mais c'est l'idée générale.
echo
? Je l'avais mis avant...shift
"pops" l'argument de la liste. La prise en charge par l'OP était que%*
serait uniquement de sortie que les autres arguments, mais il ne fonctionne pas de cette manière, comme @Joey dit.fake-command /u admin /p password admin password foo bar
. Ce point avait été souligné par @Joey il y a plusieurs années.Voici comment je l'ai fait:
Voici ce que la commande ressemble à ceci:
La
%1
s'applique pour le premier paramètre, le%2
(et c'est ici la partie la plus délicate) s'applique à la seconde. Vous pouvez avoir jusqu'à 9 paramètres transmis de cette façon.echo %1 %2
et a été jeté hors de la non coupé-et-pasteable plus simple des cas avec un@
et unfake-command
avec params, pensant que nous aurionsfake-command.bat
'contenu de s plus tard (dans ce cas, le trop compliquéfake-command.bat
pourrait avoirecho %2 %4
d'ignorer les param noms). Mal, doofus. TL;DR: Ne pas être aussi stupide que moi. 1.echo echo %1 %2 > test.bat
2.test word1 word2
. 3. Le Profit.Si vous voulez pour une gestion intelligente des paramètres manquants, vous pouvez faire quelque chose comme:
Accès par lot des paramètres peut être simple avec %1, %2, ... %9 ou aussi %*,
mais uniquement si le contenu est simple.
Il n'y a pas de moyen simple pour des complexes de contenu comme
"&"^&
, car il n'est pas possible d'accéder à %1 sans produire une erreur.Les lignes étendre à
Et chaque ligne ne parvient pas, comme l'un des
&
est à l'extérieur des guillemets.Il peut être résolu avec la lecture d'un fichier temporaire un fait remarquer version du paramètre.
L'astuce est de permettre
echo on
et d'élargir l' %1 après unrem
déclaration (fonctionne aussi avec%2 .. %*
).Donc, même
"&"&
pourrait être l'écho, sans obtenir une erreur, comme il est fait remarquer.Mais pour être en mesure de rediriger la sortie de la
echo on
, vous avez besoin des deux pour les-boucles.Les caractères supplémentaires
* #
sont utilisés pour être en sécurité contre des contenus comme/?
(montrerait l'aide pourREM
).Ou un accent circonflexe ^ à la fin de ligne peut travailler comme multiligne personnage, même après une
rem
.Puis la lecture de la rem paramètre de sortie à partir du fichier, mais avec précaution.
La FOR /F devrait travailler avec l'expansion retardée off, le reste du contenu avec des "!" serait détruit.
Après le retrait de caractères supplémentaires dans
param1
, vous l'avez.Et à utiliser
param1
de manière sûre, de permettre l'expansion retardée.&
, votre solution ne fonctionne qu'avec un contenu simpletest.bat ^&
et il échoue. Seulementtest.bat "&"
fonctionne, mais ce n'était pas mon point. Vous ne pouvez pas utiliser%*
,%1
de façon sécuritaire sans le REM technicecho-on-and-rem-redirect-to-a-file trick
pouvez aussi chercher multiligne arguments, mais ce n'est pas de preuve de balle, voir DONC:...multi-ligne de texte comme argument...!1!
!2!
ou!!1
!!2
) qui peut vraiment retarder-développez les arguments.Yep, et il suffit de ne pas oublier d'utiliser des variables comme
%%1
lors de l'utilisation deif
etfor
et le gang.Si vous oubliez le double
%
, alors vous serez en substituant dans (éventuellement nulle) arguments de ligne de commande et vous recevrez une jolie confusion des messages d'erreur.if
etfor
?for %%d in (*) do echo %%d
en ligne de commande:for %d in (*) do echo %d
@for %%2 in (testing) do @echo %%2 %1
dans un fichier de commandes, produittesting 1
lorsqu'elle est appelée avec 1 (test 1
).Il n'est pas nécessaire de compliquer. C'est simplement la commande %1 %2 paramètres, par exemple,
La "pause" affiche ce que le fichier batch a fait et vous attend pour frapper la touche. Enregistrer xx.bat dans le dossier Windows.
Pour l'utiliser, tapez, par exemple:
Ce fichier de commandes prend soin de tous les paramètres nécessaires, comme la copie uniquement les fichiers, qui sont plus récents, etc. Je l'ai utilisé depuis avant Windows. Si vous aimez voir les noms des fichiers, car ils sont en cours de copie, de laisser le
Q
paramètre.Remarque: SI
"%1"==""
va causer des problèmes si%1
est mis entre guillemets lui-même.Dans ce cas, utilisez
IF [%1]==[]
ou, dans le NT 4 (SP6) et plus tard seulement,IF "%~1"==""
à la place.Un ami a me poser des questions sur ce sujet récemment, donc je pensais que je poste la façon dont je traite les arguments de ligne de commande dans des fichiers batch.
Cette technique a un peu de surcharge comme vous allez le voir, mais il rend mes fichiers de commandes très facile à comprendre et rapide à mettre en œuvre. Ainsi que de soutenir les structures suivantes:
Le jist de c'est d'avoir la
:init
,:parse
, et:main
fonctions.Gardons ça simple.
Ici est la .fichier cmd.
Voici 3 des appels à partir de la ligne de commande.
Cette boucle sur le lot paramètres ( % * ), soit ils sont cotés ou non, puis echos chaque paramètre.
J'ai écrit un simple read_params script qui peut être appelée comme une fonction (ou externe
.bat
) et toutes les variables dans l'environnement actuel. Il ne modifie pas les paramètres de l'original parce que la fonction est en courscall
ed avec une copie de l'original paramètres.Par exemple, la commande suivante:
myscript.bat
serait en mesure d'utiliser les variables après l'appel de la fonction:Voici la fonction:
Limitations
-force
. Vous pouvez utiliser-force=true
mais je ne peux pas penser à un moyen de permettre à des valeurs vides sans le savoir une liste de paramètres à l'avance de l'heure qui n'ont pas une valeur.Changelog
-
avant de paramètres.À se référer à un ensemble de variables en ligne de commande, vous devez utiliser
%a%
ainsi, par exemple:Remarque: Cela fonctionne pour Windows 7 pro.
Faire un nouveau fichier de commandes (exemple: openclass.chauve-souris) et d'écrire cette ligne dans le fichier:
Puis placez le fichier de commandes dans, disons, le dossier system32, allez dans votre fichier de classe Java, clic droit, Propriétés, Ouvrir avec..., puis de trouver votre fichier de commandes, sélectionnez-le, et c'est ce que...
Cela fonctionne pour moi.
PS: je ne peux pas trouver un moyen de fermer la fenêtre cmd lors de la fermeture de la classe Java. Pour l'instant...
start /wait java %~n1
Inspiré par un réponse ailleurs par @Jon, j'ai conçu un algorithme plus général pour l'extraction des paramètres nommés, les valeurs facultatives, et les commutateurs.
Disons que nous voulons mettre en œuvre un utilitaire
foobar
. Il nécessite une commande initiale. C'est un paramètre facultatif--foo
qui prend un facultatif valeur (qui ne peut pas être un autre paramètre, bien sûr); si la valeur est manquante par défautdefault
. Il dispose également d'un paramètre facultatif--bar
qui prend un nécessaire valeur. Enfin, il peut prendre un drapeau--baz
sans valeur autorisée. Oh, et ces paramètres peuvent venir dans n'importe quel ordre.En d'autres termes, il ressemble à ceci:
Voici une solution:
SETLOCAL
de sorte que les variables n'échappent pas à l'appel de l'environnement.SET FOO=
, etc. dans le cas où quelqu'un définies dans l'appel de l'environnement.%~1
pour supprimer les guillemets.IF "%ARG%" == ""
et pasIF [%ARG%] == []
parce que[
et]
ne pas jouer à tout avec les valeurs se terminant dans un espace.SHIFT
à l'intérieur d'unIF
bloc, le courant args comme%~1
n'obtenez pas mis à jour car ils sont déterminés lors de laIF
est analysée. Vous pouvez utiliser%~1
et%~2
à l'intérieur de laIF
bloc, mais il serait source de confusion parce que vous aviez unSHIFT
. Vous pourriez mettre leSHIFT
à la fin du bloc pour plus de clarté, mais qui risquent de se perdre et/ou de confondre les gens ainsi. Afin de "capturer"%~1
et%~1
à l'extérieur du bloc semble le mieux.IF NOT "%ARG:~0,2%" == "--"
.SHIFT
lorsque vous utilisation l'un des paramètres.SET FOO=%DEFAULT_FOO%
est regrettable, mais l'autre solution serait d'ajouter unIF "%FOO%" == "" SET FOO=%DEFAULT_FOO%
à l'extérieur de laIF NOT "%ARG%" == ""
bloc. Cependant, parce que c'est encore à l'intérieur de laIF "%PARAM%" == "--foo"
bloc, le%FOO%
valeur aurait été évalués et mis en place avant vous jamais entré dans le bloc, de sorte que vous ne serait jamais à détecter que les deux la--foo
paramètre était présent et aussi que le%FOO%
valeur est manquante.ECHO Missing bar value. 1>&2
envoie le message d'erreur vers stderr.ECHO:
ou l'une des variantes.La solution la plus Simple(même si la question est vieux)
Test1.chauve-souris
CallTest1.chauve-souris
sortie
Où YourLocalPath est chemin de répertoire.
Pour garder les choses simples de stocker la commande de paramètre dans la variable et la variable use à des fins de comparaison.
Pas seulement simple à écrire, mais son simple à entretenir ainsi donc, si, plus tard, une autre personne ou vous avez lu le script après une longue période de temps, il sera facile à comprendre et à maintenir.
D'écrire du code en ligne : voir les autres réponses.