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

161

Sous Windows, comment accéder aux arguments transmis lors de l'exécution d'un fichier batch?

Par exemple, disons que j'ai un programme nommé hello.bat. Lorsque j'entre hello -asur une ligne de commande Windows, comment puis-je informer mon programme de ce qui a -aété transmis comme argument?

Une personne
la source
Comment passer des paramètres de ligne de commande à un fichier de commandes: stackoverflow.com/questions/26551/…
Eric Leschinski
3
Il mentionne "ligne de commande DOS".
David R Tribble du

Réponses:

287

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

  • %0est le nom de l'exécutable (fichier batch) tel que 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 souhaitez transmettre les paramètres à un autre programme.

Il existe également de nombreuses techniques importantes à connaître en plus de la simple façon d'accéder aux paramètres.

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

Ceci est fait avec des constructions comme IF "%~1"=="", qui est vrai si et seulement si aucun argument n'a été passé du tout. Notez le caractère tilde qui entraîne la suppression des guillemets environnants de la valeur de %1; sans tilde, vous obtiendrez des résultats inattendus si cette valeur comprend des guillemets doubles, y compris la possibilité d'erreurs de syntaxe.

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écale les valeurs de tous les arguments d'un seul endroit, de sorte que %0prend la valeur de %1, %1prend la valeur de %2, etc. %9prend la valeur du dixième argument (s'il y en a un), qui n'était disponible via aucune variable avant l'appel SHIFT(entrez commande SHIFT /?pour plus d'options).

SHIFTest également utile lorsque vous souhaitez traiter facilement des paramètres sans exiger qu'ils soient présentés dans un ordre spécifique. Par exemple, un script peut reconnaître les indicateurs -aet -bdans 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 de paramètres de lot

Pour les paramètres qui représentent des noms de fichiers, le shell fournit de nombreuses fonctionnalités liées au travail avec des fichiers qui ne sont accessibles d'aucune autre manière. Cette fonctionnalité est accessible avec des constructions commençant par %~.

Par exemple, pour obtenir la taille du fichier passé en argument, utilisez

ECHO %~z1

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

ECHO %~dp0

Vous pouvez afficher la gamme complète de ces fonctionnalités en tapant CALL /?dans l'invite de commande.

Jon
la source
4
La construction: parse,: endparse est la beauté, même avec le GOTO. Merci! (Je veux dire, le DOS-BASIC a forcé GOTO)
mmrtnt
1
Cette technique peut échouer lors de l'appel du BAT à partir de PowerShell. Un argument cité comme "name=John"deviendra name Johnpendant exe. Une solution de contournement consiste à entourer de guillemets simples,'"name=John"'
cmcginty
1
Comment suis-je resté si longtemps sans CALL /?!? Ici, je me suis cogné avec Google tout le temps.
bigtlb
@Jon J'ai écrit un fichier bat qui ne contient qu'un seul code echo% 1 si je l'appelle via cmd par exemple xx.bat & paramètre> "C: \ yy.txt" en appelant le fichier bat avec le paramètre et en écrivant dans le fichier txt mais si je donne & en paramètre au début ou à la fin cela ne fonctionne pas. Tout autre texte fonctionne bien.
Alex Mathew
56

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

Les fichiers batch peuvent faire référence aux mots passés en tant que paramètres avec les jetons: %0to %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 %0le nom du programme est tel qu'il a été appelé, sous DOS %0sera vide pour AUTOEXEC.BAT s'il est démarré au moment du démarrage.

Exemple:

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

@echo off
@echo hello %1 %2
pause

Invoquer le fichier de commandes comme ceci: mybatch john billyproduirait:

hello john billy

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

Le jeton Percent Star %*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

Certains caractères des paramètres de ligne de commande sont ignorés par les fichiers batch, selon la version DOS, s'ils sont "é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
Eric Leschinski
la source
5

Les fichiers batch transmettent automatiquement le texte après le programme tant qu'il y a des variables auxquelles les 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 Hello.bat et que le contenu est:

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

et vous appelez le lot dans la commande via

hello.bat APerson241% date%

vous devriez recevoir ce message:

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

rud3y
la source
4

@ Jon :parse/ :endparsesystème est un bon début, et il a ma gratitude pour le passage initial, mais si vous pensez que le système de traitement par lots de Windows tortueuse laisseriez - vous ce facile ... eh bien, mon ami, vous êtes dans un état de choc. J'ai passé toute la journée avec ce diable, et après beaucoup de recherches et d'expérimentation douloureuses, j'ai finalement réussi quelque chose de viable pour un utilitaire réel.

Disons que nous voulons implémenter un utilitaire foobar. Il nécessite une commande initiale. Il a un paramètre optionnel --fooqui prend une valeur optionnelle (qui ne peut pas être un autre paramètre, bien sûr); si la valeur est manquante, la valeur par défaut est default. Il a également un paramètre facultatif --barqui prend une valeur obligatoire . Enfin, il peut prendre un drapeau --bazsans 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 réels. ( gitquelqu'un?)

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 si mauvais. Voir mon article similaire sur https://stackoverflow.com/a/50653047/421049 , où je donne plus d'analyse de ce qui se passe dans la logique et pourquoi j'ai utilisé certaines constructions.

Hideux. J'ai dû apprendre la plupart de ces choses aujourd'hui. Et ça faisait mal.

Garret Wilson
la source
3

Utilisez des variables à savoir les .BATvariables , puis appelées %0à%9

tohava
la source