113 votes

Les fichiers Batch - nombre d'arguments de ligne de commande

Juste la conversion de certains scripts shell dans les fichiers de commandes et il y a une chose que je n'arrive pas à trouver...et c'est un simple comptage du nombre d'arguments de ligne de commande.

par exemple. si vous avez:

myapp foo bar

Dans Le Shell:

  • $# -> 2
  • $* -> foo bar
  • $0 -> myapp
  • $1 -> foo
  • $2 -> bar

Dans le lot

  • ?? -> 2 <---- quelle commande?!
  • %* -> foo bar
  • %0 -> myapp
  • %1 -> foo
  • %2 -> bar

J'ai donc regardé autour, et soit je suis à la recherche dans le mauvais endroit ou je suis aveugle, mais je n'arrive pas à trouver un moyen d'obtenir un décompte du nombre d'arguments de ligne de commande passée.

Est-il une commande semblable à la coquille "$#" pour les fichiers de commandes?

ps. le plus proche que j'ai trouvé consiste à parcourir le %1s et utiliser 'shift', mais j'ai besoin de refernece %1,%2, etc plus tard dans le script, de sorte que n'est pas bon.

125voto

nimrodm Points 9191

Googler un peu vous donne le résultat suivant de wikibooks:

set argC=0
for %%x in (%*) do Set /A argC+=1

echo %argC%

Semble comme cmd.exe a évolué un peu de la vieille DOS jours :)

57voto

Dean Povey Points 4761

Comme je sais que vous ne pouvez pas facilement - ce que je peux dire des fichiers batch sucer. Vous avez tendance à gérer le nombre d'arguments avec ce genre de logique:

IF "%1"=="" GOTO HAVE_0
IF "%2"=="" GOTO HAVE_1
IF "%3"=="" GOTO HAVE_2

etc.

Si vous avez plus de 9 arguments alors vous êtes foutus, avec cette approche, si. Il existe différents hacks pour la création de compteurs que vous pouvez trouver ici, mais attention ce ne sont pas pour les timides.

23voto

paxdiablo Points 341644

La fonction :getargc ci-dessous peuvent être ce que vous cherchez.

@echo off
setlocal enableextensions enabledelayedexpansion
call :getargc argc %*
echo Count is %argc%
echo Args are %*
endlocal
goto :eof

:getargc
    set getargc_v0=%1
    set /a "%getargc_v0% = 0"
:getargc_l0
    if not x%2x==xx (
        shift
        set /a "%getargc_v0% = %getargc_v0% + 1"
        goto :getargc_l0
    )
    set getargc_v0=
    goto :eof

Essentiellement, il réitère une fois de plus de la liste (qui est locale à la fonction, donc les changements n'affectent pas la liste de retour dans le programme principal), le comptage jusqu'à ce qu'il exécute.

Il utilise aussi un truc astucieux, en passant le nom de la variable de retour à fixer par la fonction.

Le programme principal illustre parfaitement comment l'appeler et les échos de l'argumentation par la suite pour s'assurer qu'elles sont intactes:

C:\Here> xx.cmd 1 2 3 4 5
    Count is 5
    Args are 1 2 3 4 5
C:\Here> xx.cmd 1 2 3 4 5 6 7 8 9 10 11
    Count is 11
    Args are 1 2 3 4 5 6 7 8 9 10 11
C:\Here> xx.cmd 1
    Count is 1
    Args are 1
C:\Here> xx.cmd
    Count is 0
    Args are
C:\Here> xx.cmd 1 2 "3 4 5"
    Count is 3
    Args are 1 2 "3 4 5"

11voto

David Points 29

Essayez ceci:

SET /A ARGS_COUNT=0    
FOR %%A in (%*) DO SET /A ARGS_COUNT+=1    
ECHO %ARGS_COUNT%

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