Utilisation des paramètres dans les fichiers batch à la ligne de commande Windows

Dans Windows, Comment accédez-vous aux arguments passés lorsqu'un fichier batch est exécuté?

Par exemple, disons que j'ai un programme nommé hello.bat. Lorsque j'entre hello -a sur une ligne de commande Windows, Comment faire savoir à mon programme que -a a été passé en argument?

140
demandé sur Ross Ridge 2013-01-12 00:53:56

5 réponses

Comme d'autres l'ont déjà dit, les paramètres passés par la ligne de commande sont accessibles dans des fichiers batch avec la notation %1 à %9. Il y a aussi deux autres jetons que vous pouvez utiliser:

  • %0 est le nom de l'exécutable (fichier batch) spécifié dans la ligne de commande.
  • %* est tous les paramètres spécifiés dans la ligne de commande -- ceci est très utile si vous voulez transférer les paramètres vers un autre programme.

Il y a aussi beaucoup de techniques importantes à connaître en plus de simplement comment accéder aux paramètres.

Vérifier si un paramètre a été passé

Cela se fait avec des constructions comme IF "%~1"=="", ce qui est vrai si et seulement si aucun argument n'a été passé. Notez le caractère tilde qui provoque la suppression des guillemets environnants de la valeur de %1; sans tilde, vous obtiendrez des résultats inattendus si cette valeur inclut des guillemets doubles, y compris la possibilité de syntaxe erreur.

Gérer plus de 9 arguments (ou simplement rendre la vie plus facile)

Si vous avez besoin d'accéder à plus de 9 arguments, vous devez utiliser la commande SHIFT. Cette commande déplace les valeurs de tous les arguments d'un seul endroit, de sorte que %0 prend la valeur de %1, %1 prend la valeur de %2, etc. %9 prend la valeur du dixième argument (si un argument est présent), qui n'était disponible par Aucune variable avant d'appeler SHIFT (entrez la commande SHIFT /? pour plus option).

SHIFT est également utile lorsque vous souhaitez traiter facilement les paramètres sans exiger qu'ils soient présentés dans un ordre spécifique. Par exemple, un script peut reconnaître les drapeaux -a et -b dans n'importe quel ordre. Un bon moyen d'analyser la ligne de commande dans de tels cas est

:parse
IF "%~1"=="" GOTO endparse
IF "%~1"=="-a" REM do something
IF "%~1"=="-b" REM do something else
SHIFT
GOTO parse
:endparse
REM ready for action!

Ce schéma vous permet d'analyser des lignes de commande assez complexes sans devenir fou.

Substitution des paramètres de lot

Pour les paramètres qui représentent les noms de fichiers, le shell fournit beaucoup de fonctionnalités liées à l'utilisation de fichiers qui ne sont pas accessibles d'une autre manière. Cette fonctionnalité est accessible avec des constructions qui commencent par %~.

Par exemple, pour obtenir la taille du fichier passé en argument d'utiliser

ECHO %~z1

Pour obtenir le chemin du répertoire à partir duquel le fichier batch a été lancé (très utile!) vous pouvez utiliser

ECHO %~dp0

Vous pouvez afficher l'ensemble de ces fonctionnalités en tapant CALL /? dans l'invite de commande.

258
répondu Jon 2013-10-30 11:40:05

Utilisation des paramètres dans les fichiers batch: % 0 et %9

Les fichiers Batch peuvent se référer aux mots passés en tant que paramètres avec les jetons: %0 à %9.

%0 is the program name as it was called.
%1 is the first command line parameter
%2 is the second command line parameter
and so on till %9.

Les paramètres transmis sur la ligne de commande doivent être des caractères alphanumériques et délimités par des espaces. Puisque %0 est le nom du programme comme il a été appelé, dans DOS %0 sera vide pour AUTOEXEC.BAT si démarré au moment du démarrage.

Exemple:

Mettez la commande suivante dans un fichier batch appelé mybatch.bat:

@echo off
@echo hello %1 %2
pause

L'appel du fichier batch comme ceci: {[9] } produirait:

hello john billy

Obtenez plus de 9 paramètres d'un fichier de commandes, utilisez: %*

Le jeton D'étoile en pourcentage %* signifie "le reste des paramètres". Vous pouvez utiliser une boucle for pour les saisir, comme défini ici:

Http://www.robvanderwoude.com/parameters.php

Remarques sur les délimiteurs pour les paramètres de lot

Quelques caractères dans la ligne de commande les paramètres sont ignorés par les fichiers batch, en fonction de la version DOS ,qu'ils soient "échappés" ou non, et souvent en fonction de leur emplacement dans la ligne de commande:

commas (",") are replaced by spaces, unless they are part of a string in 
double quotes

semicolons (";") are replaced by spaces, unless they are part of a string in 
double quotes

"=" characters are sometimes replaced by spaces, not if they are part of a 
string in double quotes

the first forward slash ("/") is replaced by a space only if it immediately 
follows the command, without a leading space

multiple spaces are replaced by a single space, unless they are part of a 
string in double quotes

tabs are replaced by a single space

leading spaces before the first command line argument are ignored
47
répondu Eric Leschinski 2013-01-12 22:31:03

Les fichiers Batch transmettent automatiquement le texte après le programme tant qu'ils sont des variables à affecter. Ils sont passés dans l'ordre où ils sont envoyés; par exemple, %1 sera la Première Chaîne envoyée après l'appel du programme, etc.

Si vous avez Bonjour.MTD et le contenu sont:

@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause

Et vous appelez la commande batch in via

Bonjour.chauve-souris APerson241 %date%

Vous devriez recevoir ce message en retour:

Bonjour, APerson241 merci pour l'exécution de cette fichier de commandes (01/11/2013)

5
répondu rud3y 2013-01-11 21:14:25

Utilisez des variables, c'est-à-dire les variables .BAT et appelées %0 à %9

3
répondu tohava 2017-09-08 07:14:06

@ Jon's :parse/:endparse scheme est un bon début, et il a ma gratitude pour la passe initiale, mais si vous pensez que le système de lots torturous Windows vous laisserait partir si facile ... Eh bien, mon ami, vous êtes dans un choc. J'ai passé toute la journée avec ce diable, et après beaucoup de recherches et d'expériences douloureuses, j'ai finalement réussi quelque chose de viable pour un utilitaire de la vie réelle.

Disons que nous voulons implémenter un utilitaire foobar. Il nécessite une commande initiale. Il a une paramètre optionnel --foo un optionnel valeur (qui ne peut pas être un autre paramètre, bien sûr); si la valeur par défaut default. Il a également un paramètre optionnel {[7] } qui prend une valeurrequired . Enfin, il peut prendre un flag --baz sans valeur autorisée. Oh, et ces paramètres peuvent venir dans n'importe quel ordre.

En d'autres termes, cela ressemble à ceci:

foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]

Compliqué? Non, cela semble assez typique des utilitaires de la vie réelle. (git n'importe qui?)

, Sans plus tarder, voici une solution:

@ECHO OFF
SETLOCAL
REM FooBar parameter demo
REM By Garret Wilson

SET CMD=%~1

IF "%CMD%" == "" (
  GOTO usage
)
SET FOO=
SET DEFAULT_FOO=default
SET BAR=
SET BAZ=

SHIFT
:args
SET PARAM=%~1
SET ARG=%~2
IF "%PARAM%" == "--foo" (
  SHIFT
  IF NOT "%ARG%" == "" (
    IF NOT "%ARG:~0,2%" == "--" (
      SET FOO=%ARG%
      SHIFT
    ) ELSE (
      SET FOO=%DEFAULT_FOO%
    )
  ) ELSE (
    SET FOO=%DEFAULT_FOO%
  )
) ELSE IF "%PARAM%" == "--bar" (
  SHIFT
  IF NOT "%ARG%" == "" (
    SET BAR=%ARG%
    SHIFT
  ) ELSE (
    ECHO Missing bar value. 1>&2
    ECHO:
    GOTO usage
  )
) ELSE IF "%PARAM%" == "--baz" (
  SHIFT
  SET BAZ=true
) ELSE IF "%PARAM%" == "" (
  GOTO endargs
) ELSE (
  ECHO Unrecognized option %1. 1>&2
  ECHO:
  GOTO usage
)
GOTO args
:endargs

ECHO Command: %CMD%
IF NOT "%FOO%" == "" (
  ECHO Foo: %FOO%
)
IF NOT "%BAR%" == "" (
  ECHO Bar: %BAR%
)
IF "%BAZ%" == "true" (
  ECHO Baz
)

REM TODO do something with FOO, BAR, and/or BAZ
GOTO :eof

:usage
ECHO FooBar
ECHO Usage: foobar ^<command^> [--foo [^<fooval^>]] [--bar ^<barval^>] [--baz]
EXIT /B 1

Oui, c'est vraiment mauvais. Voir mon post similaire à https://stackoverflow.com/a/50653047/421049 , où je fournis plus d'analyse de ce qui se passe dans la logique, et pourquoi j'ai utilisé certaines constructions.

Hideux. La plupart de ce que j'ai dû apprendre aujourd'hui. Et ça fait mal.

1
répondu Garret Wilson 2018-06-02 02:44:44