1238 votes

Comment Passer des Paramètres de Ligne de Commande dans le Fichier de commandes

J'avais besoin de passer l'id et le mot de passe à un cmd (ou bat) fichier 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

1103voto

Greg Hewgill Points 356191

Une autre astuce utile est d'utiliser le %* pour dire "tout le reste". Par exemple,

echo off
fake-command /u %1 /p %2 %*

Lorsque vous exécutez:

test-command admin password foo bar

les commandes ci-dessus fichier sera exécuté:

fake-command /u admin /p password foo bar

Edit: en Fait, %* signifie "tous", on pourrait donc effectivement besoin d'utiliser la touche maj pour faire la-dessus:

echo off
set arg1=%1
set arg2=%2
shift
shift
fake-command /u %arg1% /p %arg2% %*

Je peut encore avoir la syntaxe un peu mal, mais c'est l'idée générale. Il a été un temps très long depuis que j'ai écrit un fichier de commandes, et mon cerveau continue à penser "script shell"!

311voto

Keng Points 10618

Voici comment je le fais.

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

Voici ce que la ligne de commande ressemble à ceci:

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

L' %1 s'applique pour le premier paramètre %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.

153voto

thelsdj Points 3344

Si vous souhaitez une gestion intelligente des 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

95voto

jeb Points 26035

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.

set  var=%1
set "var=%1"
set  var=%~1
set "var=%~1"

Les lignes se développe pour

set  var="&"&
set "var="&"&"
set  var="&"&
set "var="&"&"

Et chaque ligne ne parvient pas, comme l'un de la & est à l'extérieur des guillemets.

Il peut être résolu avec la lecture d'un fichier temporaire a fait remarquer 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'élargir l' %1 après un rem 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 des BOUCLES.

Les caractères supplémentaires * # sont utilisés pour être en sécurité contre des contenus comme /? (serait-afficher l'aide pour REM).
Ou un accent circonflexe ^ à la fin de ligne peut travailler comme multiligne personnage, même après un rem.

Puis la lecture de la rem le 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 pour utiliser param1 de manière sûre, de permettre l'expansion retardée.

64voto

Frank Krueger Points 27508

Yep, et il suffit de ne pas oublier d'utiliser des variables comme l' %%1 lors de l'utilisation d' if et for 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.

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