J'ai besoin de transmettre un ID et un mot de passe à un fichier de commandes au moment de l'exécution plutôt que de les coder en dur dans le fichier.
Voici à quoi ressemble la ligne de commande:
test.cmd admin P@55w0rd > test-log.txt
batch-file
arguments
Keng
la source
la source
Réponses:
Une autre astuce utile consiste à utiliser
%*
pour signifier «tous». Par exemple:Lorsque vous exécutez:
le fichier de commandes ci-dessus s'exécutera:
J'ai peut-être la syntaxe légèrement erronée, mais c'est l'idée générale.
la source
shift
"pop" l'argument de la liste. L'hypothèse d'OP était que%*
cela ne produirait que les arguments restants, mais cela ne fonctionne pas de cette façon, comme l'a dit @Joey.fake-command /u admin /p password admin password foo bar
. Cela a été souligné par @Joey il y a de nombreuses années.Voici comment je l'ai fait:
Voici à quoi ressemble la commande:
Le
%1
s'applique au premier paramètre, le%2
(et voici la partie délicate) s'applique au second. Vous pouvez avoir jusqu'à 9 paramètres transmis de cette façon.la source
echo %1 %2
et était découragé par le cas le plus simple non coupable et collable avec un@
et unfake-command
avec des paramètres, pensant que nous obtiendrionsfake-command.bat
le contenu de plus tard (dans ce cas, le trop compliquéfake-command.bat
peutecho %2 %4
ignorer les noms des paramètres). Faux, doofus. TL; DR: Ne sois pas aussi bête que moi. 1.echo echo %1 %2 > test.bat
2test word1 word2
.. 3. Bénéfice.Si vous souhaitez gérer intelligemment les paramètres manquants, vous pouvez faire quelque chose comme:
la source
L'accès aux paramètres de lot peut être simple avec% 1,% 2, ...% 9 ou également% *,
mais uniquement si le contenu est simple.
Il n'y a pas de moyen simple pour des contenus complexes comme
"&"^&
, car il n'est pas possible d'accéder à% 1 sans produire d'erreur.Les lignes s'étendent jusqu'à
Et chaque ligne échoue, car l'un des
&
est en dehors des guillemets.Il peut être résolu en lisant dans un fichier temporaire une version remarquée du paramètre.
L'astuce consiste à activer
echo on
et à développer% 1 après unerem
instruction (fonctionne également avec%2 .. %*
).Ainsi, même
"&"&
pourrait être répercuté sans produire d'erreur, comme on le fait remarquer.Mais pour pouvoir rediriger la sortie du
echo on
, vous avez besoin des deux boucles for.Les caractères supplémentaires
* #
sont utilisés pour être à l'abri de contenus comme/?
(montrerait l'aide pourREM
).Ou un signe d'insertion ^ à la fin de la ligne peut fonctionner comme un caractère multiligne, même après a
rem
.Ensuite, lisez la sortie du paramètre rem à partir du fichier, mais attentivement.
Le FOR / F devrait fonctionner avec une expansion retardée, sinon le contenu avec "!" serait détruit.
Après avoir supprimé les caractères supplémentaires
param1
, vous l'avez compris.Et pour une utilisation
param1
sûre, activez l'expansion retardée.la source
&
, votre solution ne fonctionne qu'avec un contenu simpletest.bat ^&
et il échoue. Fonctionne seulementtest.bat "&"
, mais ce n'était pas mon point. Vous ne pouvez pas utiliser%*
,%1
en toute sécurité sans la technique REM&
et des citations"
Oui, et n'oubliez pas d'utiliser des variables comme
%%1
lors de l'utilisation deif
etfor
et du gang.Si vous oubliez le double
%
, vous remplacerez des arguments de ligne de commande (éventuellement nuls) et vous recevrez des messages d'erreur assez déroutants.la source
if
etfor
?for %%d in (*) do echo %%d
depuis la ligne de commande:for %d in (*) do echo %d
@for %%2 in (testing) do @echo %%2 %1
dans un fichier batch, produittesting 1
quand il est appelé avec 1 (test 1
).%%1
n'accède pas à un argument de ligne de commande, et il est également incorrect pour laIF
commande. Seule laFOR
commande (dans les fichiers batch) nécessite des pourcentages doubles, mais même alors%%1
définirait un paramètre FOR etIl n'est pas nécessaire de compliquer les choses. Il s'agit simplement de la commande% 1% 2 paramètres, par exemple,
La "pause" affiche ce que le fichier de commandes a fait et attend que vous appuyiez sur la touche ANY. Enregistrez-le sous xx.bat dans le dossier Windows.
Pour l'utiliser, tapez par exemple:
Ce fichier batch prend en charge tous les paramètres nécessaires, comme la copie de fichiers uniquement, qui sont plus récents, etc. Je l'ai utilisé depuis avant Windows. Si vous aimez voir les noms des fichiers, tels qu'ils sont copiés, omettez le
Q
paramètre.la source
Un ami m'a posé des questions sur ce sujet récemment, alors j'ai pensé publier comment je gère les arguments de ligne de commande dans des fichiers batch.
Cette technique a un peu de surcharge comme vous le verrez, mais elle rend mes fichiers batch très faciles à comprendre et rapides à implémenter. En plus de soutenir les structures suivantes:
Le jist de celui - ci est d' avoir les
:init
,:parse
et les:main
fonctions.la source
Remarque: IF
"%1"==""
causera des problèmes s'il%1
est placé entre guillemets.Dans ce cas, utilisez plutôt ,
IF [%1]==[]
ou dans NT 4 (SP6) et versions ultérieures uniquementIF "%~1"==""
.la source
Gardons cela simple.
Voici le fichier .cmd.
Voici 3 appels depuis la ligne de commande.
la source
Cela fait une boucle sur les paramètres du lot (% *), qu'ils soient cités ou non, puis fait écho à chaque paramètre.
la source
test.bat *.txt
,test.bat cat^&dog
ouTest.bat /?
J'ai écrit un simple script read_params qui peut être appelé en tant que fonction (ou externe
.bat
) et qui mettra toutes les variables dans l'environnement actuel. Il ne modifiera pas les paramètres d'origine car la fonction est en cours d'call
édition avec une copie des paramètres d'origine.Par exemple, étant donné la commande suivante:
myscript.bat
serait en mesure d'utiliser les variables après avoir appelé la fonction:Voici la fonction:
Limites
-force
. Vous pouvez utiliser,-force=true
mais je ne peux pas penser à un moyen d'autoriser des valeurs vides sans connaître à l'avance une liste de paramètres qui n'auront pas de valeur.Changelog
-
paramètres avant.la source
Dans un fichier batch
Et en ligne de commande, passez l'argument
La sortie sera
la source
Pour faire référence à une variable définie en ligne de commande, vous devez utiliser
%a%
par exemple:Remarque: cela fonctionne pour Windows 7 pro.
la source
Inspiré par une réponse ailleurs de @ Jon, j'ai conçu un algorithme plus général pour extraire les paramètres nommés, les valeurs facultatives et les commutateurs.
Disons que nous voulons implémenter un utilitaire
foobar
. Il nécessite une commande initiale. Il a un paramètre facultatif--foo
qui prend une valeur facultative (qui ne peut pas être un autre paramètre, bien sûr); si la valeur est manquante, elle est par défautdefault
. Il a également un paramètre facultatif--bar
qui prend une valeur requise . 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, cela ressemble à ceci:
Voici une solution:
SETLOCAL
pour que les variables ne s'échappent pas dans l'environnement appelant.SET FOO=
, etc. au cas où quelqu'un les aurait définies dans l'environnement appelant.%~1
pour supprimer les guillemets.IF "%ARG%" == ""
et nonIF [%ARG%] == []
parce que[
et]
ne jouez pas du tout avec des valeurs se terminant par un espace.SHIFT
dans unIF
bloc, les arguments actuels tels que%~1
ne sont pas mis à jour car ils sont déterminés lorsque l'IF
analyseur est analysé. Vous pouvez utiliser%~1
et%~2
à l'intérieur duIF
bloc, mais ce serait déroutant car vous en avez unSHIFT
. Vous pouvez mettre leSHIFT
à la fin du bloc pour plus de clarté, mais cela pourrait également se perdre et / ou confondre les gens. Donc, "capturer"%~1
et en%~1
dehors du bloc semble le mieux.IF NOT "%ARG:~0,2%" == "--"
.SHIFT
lorsque vous utilisez l' un des paramètres.SET FOO=%DEFAULT_FOO%
est regrettable, mais l'alternative serait d'ajouter unIF "%FOO%" == "" SET FOO=%DEFAULT_FOO%
extérieur auIF NOT "%ARG%" == ""
bloc. Cependant parce que cela est encore à l' intérieur duIF "%PARAM%" == "--foo"
bloc, la%FOO%
valeur aurait été évalué et mis en avant jamais entré dans le bloc, donc vous ne détectez que tant le--foo
paramètre était présent et aussi que la%FOO%
valeur était manquante.ECHO Missing bar value. 1>&2
envoie le message d'erreur à stderr.ECHO:
ou l'une des variantes.la source
Créez un nouveau fichier batch (exemple: openclass.bat) et écrivez cette ligne dans le fichier:
Ensuite, placez le fichier batch dans, disons, le dossier system32, allez dans votre fichier de classe Java, faites un clic droit, Propriétés, Ouvrir avec ..., puis trouvez votre fichier batch, sélectionnez-le et c'est tout ...
Ça marche pour moi.
PS: Je ne trouve pas de moyen de fermer la fenêtre cmd lorsque je ferme la classe Java. Pour l'instant...
la source
start /wait java %~n1
Solution simple (même si la question est ancienne)
Test1.bat
CallTest1.bat
production
Où YourLocalPath est le chemin du répertoire actuel.
Pour garder les choses simples, stockez la commande param dans variable et utilisez variable pour comparaison.
Ce n'est pas seulement simple à écrire mais aussi simple à maintenir, donc si plus tard une autre personne ou vous lisez votre script après une longue période de temps, il sera facile à comprendre et à maintenir.
Pour écrire du code en ligne: voir les autres réponses.
la source
Obs: Pour une utilisation sans:
?*&<>
la source
?*&<>