J'ai besoin de transmettre un identifiant et un mot de passe à un fichier batch 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
J'ai besoin de transmettre un identifiant et un mot de passe à un fichier batch 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
Une autre astuce utile consiste à utiliser %*
pour signifier "tous". Par exemple :
echo off
set arg1=%1
set arg2=%2
shift
shift
fake-command /u %arg1% /p %arg2% %*
Quand tu cours :
test-command admin password foo bar
le fichier batch ci-dessus sera exécuté :
fake-command /u admin /p password admin password foo bar
La syntaxe est peut-être légèrement erronée, mais c'est l'idée générale.
%* s'étend en fait à tous les paramètres, quel que soit le décalage. Donc, même après les deux décalages, vous aurez toujours les deux premiers arguments dans %*. Vous pouvez utiliser quelque chose comme ceci : stackoverflow.com/questions/761615/ pour obtenir une variable qui contient tout sauf les n premiers paramètres.
Veuillez noter que le %* ne fonctionne pas partout ! Par exemple, il ne fonctionne pas avec DOSBox 0.73 (il s'agit peut-être d'un bogue qui devrait être signalé).
Ce n'est pas un bogue parce que %* n'a jamais fonctionné dans MS-DOS ou Win9x en premier lieu.
Si vous êtes aussi bête que moi, votre esprit cherchait echo %1 %2
et j'ai été déconcerté par le cas le plus simple, non copiable, avec une @
et un fake-command
avec des paramètres, en pensant qu'on obtiendrait fake-command.bat
plus tard (dans ce cas, la procédure trop compliquée de l'option fake-command.bat
pourrait avoir echo %2 %4
pour ignorer les noms des paramètres). Faux, imbécile. TL;DR : Ne soyez pas aussi stupide que moi. 1. echo echo %1 %2 > test.bat
2. test word1 word2
. 3. Profit.
Cinq ans plus tard, je relis mon commentaire avec confusion. Il me semble avoir voulu dire "pour créer un .bat avec deux paramètres, tapez littéralement echo echo %1 %2 > test.bat
. Le fichier test.bat aura echo %1 %2
(vous auriez pu aussi l'enregistrer à partir d'un éditeur de texte). Tapez maintenant test word1 word2
pour appeler et voir les paramètres travaillés. word1 word2
sera répercutée sur la ligne de commande. ( echo %2 %4
aurait ignoré /u
y /p
donc vous auriez pu appeler test /u word1 /p word2
pour obtenir le même résultat). @
avant un cmd dans un fichier bat signifie que le cmd n'est pas répété.
En fait, si %1 est vide, cela finira par être IF . == . et donc le GOTO se produira. Nous utilisons x ici, donc : SI x%1 == x -> SI x==x -> vrai
Vous devriez demander quelle est la valeur d'un "argument non fourni" ? Contre quoi devriez-vous vérifier un "argument non fourni" ? Ensuite, si vous n'avez pas de réponse, vous devez utiliser une astuce comme celle des points. Rappelez-vous que, comme indiqué ici ss64.com/nt/if.html "Vous pouvez en fait utiliser presque n'importe quel caractère pour cela un '~' ou des crochets, { } ou même le chiffre 4, mais les crochets ont tendance à être choisis car ils n'ont pas de signification particulière."
L'accès aux paramètres du lot peut être simple avec %1, %2, ... %9 ou également %*,
mais seulement si le contenu est simple.
Il n'existe pas de méthode simple pour les contenus complexes comme "&"^&
car il n'est pas possible d'accéder à %1 sans produire une erreur.
set var=%1
set "var=%1"
set var=%~1
set "var=%~1"
Les lignes s'étendent jusqu'à
set var="&"&
set "var="&"&"
set var="&"&
set "var="&"&"
Et chaque ligne échoue, car l'une des &
est en dehors des guillemets.
Ce problème peut être résolu en lisant depuis un fichier temporaire a a remarqué version du paramètre.
@echo off
SETLOCAL DisableDelayedExpansion
SETLOCAL
for %%a in (1) do (
set "prompt="
echo on
for %%b in (1) do rem * #%1#
@echo off
) > param.txt
ENDLOCAL
for /F "delims=" %%L in (param.txt) do (
set "param1=%%L"
)
SETLOCAL EnableDelayedExpansion
set "param1=!param1:*#=!"
set "param1=!param1:~0,-2!"
echo %%1 is '!param1!'
L'astuce consiste à activer echo on
et développer le %1 après un rem
(fonctionne également avec %2 .. %*
).
Donc même "&"&
pourrait être répercutée sans produire d'erreur, comme on le remarque.
Mais pour être en mesure de rediriger la sortie de la fonction echo on
vous avez besoin des deux boucles for.
Les caractères supplémentaires * #
sont utilisés pour se prémunir contre des contenus tels que /?
(afficherait l'aide pour REM
).
Ou encore, un signe d'insertion ^ en fin de ligne pourrait fonctionner comme un caractère multiligne, même après un caractère de type rem
.
Ensuite, en lisant le paramètre rem sortie du fichier, mais avec précaution.
Le FOR /F doit fonctionner avec l'expansion différée désactivée, sinon les contenus avec " !" seraient détruits.
Après avoir supprimé les caractères supplémentaires dans param1
vous l'avez.
Et pour utiliser param1
de manière sûre, activer l'expansion différée.
@KevinEdwards Alors essaye avec un. &
votre solution ne fonctionne qu'avec un contenu simple
@KevinEdwards Je l'ai testé, test.bat ^&
et il échoue. Seulement test.bat "&"
fonctionne, mais ce n'était pas mon propos. Vous ne pouvez pas utiliser %*
, %1
en toute sécurité sans la technique REM
C'est pire que cela - %% est utilisé pour préfixer les variables et les paramètres de ligne de commande. à l'intérieur de les fichiers batch. Mais lorsque vous utilisez ces commandes à partir de la ligne de commande, vous n'utilisez que % comme préfixe. Exemple : dans batch : for %%d in (*) do echo %%d
à partir de la ligne de commande : for %d in (*) do echo %d
@SteveMidgley J'ai upvoted votre commentaire il y a probablement un an ou plus. J'ai ensuite rapidement oublié et aujourd'hui encore, j'essayais et je regardais confusément ma boucle for dans la ligne de commande en me demandant pourquoi elle pétait et ne faisait rien d'autre. Donc, voici un autre vote virtuel de ma part. Je reviendrai dans un an ou deux, lorsque je rencontrerai à nouveau le même problème.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
8 votes
Pour "tout le reste", voir le commentaire de Greg Hegill à l'adresse suivante comment obtenir les paramètres d'un fichier batch à partir de la Nième position ?
0 votes
J'ai un script de démarrage d'environnement script qui va pousser mon nom d'utilisateur/mot de passe dans des variables d'environnement... afin que je n'aie pas à les taper à chaque fois... J'utilise bash la plupart du temps cependant (linux, mac et Windows), et j'ai besoin de l'utiliser pour les configurations de proxy dans script, etc pour le travail.