1310 votes

Comment puis-je passer des arguments à un fichier batch ?

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

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.

1166voto

Greg Hewgill Points 356191

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.

134 votes

%* 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.

1 votes

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é).

32 votes

Ce n'est pas un bogue parce que %* n'a jamais fonctionné dans MS-DOS ou Win9x en premier lieu.

332voto

Keng Points 10618

Voilà comment j'ai fait :

@fake-command /u %1 /p %2

Voici à quoi ressemble la commande :

test.cmd admin P@55w0rd > test-log.txt

En %1 s'applique au premier paramètre, le %2 (et voici la partie délicate) s'applique à la seconde. Vous pouvez avoir jusqu'à 9 paramètres passés de cette manière.

17 votes

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.

6 votes

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é.

165voto

thelsdj Points 3344

Si vous voulez gérer intelligemment les paramètres manquants, vous pouvez faire quelque chose comme :

IF %1.==. GOTO No1
IF %2.==. GOTO No2
... do stuff...
GOTO End1

:No1
  ECHO No param 1
GOTO End1
:No2
  ECHO No param 2
GOTO End1

:End1

3 votes

Quelle est la signification du point/période dans ces opérations d'égalité ?

6 votes

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

3 votes

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."

97voto

jeb Points 26035

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.

0 votes

For /F "tokens=*" %%a in ('echo %*') do set "all_args=%%a"

1 votes

@KevinEdwards Alors essaye avec un. & votre solution ne fonctionne qu'avec un contenu simple

1 votes

@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

64voto

Frank Krueger Points 27508

Yep, et n'oubliez pas d'utiliser des variables comme %%1 lors de l'utilisation de if y for et le gang.

Si vous oubliez le double % vous substituerez alors des arguments de ligne de commande (éventuellement nuls) et vous recevrez des messages d'erreur plutôt déroutants.

0 votes

%% est seulement pour if y for ?

29 votes

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

14 votes

@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.com

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.

Powered by:

X