Question Comment puis-je passer des paramètres de ligne de commande à un fichier batch?


Je dois passer un identifiant et un mot de passe à un fichier cmd (ou bat) 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

904
2017-08-25 18:14


origine


Réponses:


Une autre astuce utile est d'utiliser %* signifier "tout". Par exemple:

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

Lorsque vous exécutez:

test-command admin password foo bar

le fichier batch ci-dessus sera exécuté:

fake-command /u admin /p password foo bar

Je peux avoir la syntaxe légèrement fausse, mais c'est l'idée générale.


805
2017-08-25 19:41



Voici comment je le fais.

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

Voici à quoi ressemble la ligne de commande:

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

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


225
2017-09-18 12:26



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

117
2017-08-25 20:03



L'accès aux paramètres de batch peut être simple avec% 1,% 2, ...% 9 ou aussi% *,
mais seulement si le contenu est simple.

Il n'y a pas de moyen simple pour des contenus complexes comme "&"^&, car il n'est pas possible d'accéder à% 1 sans générer d'erreur.

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

Les lignes se développent

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

Et chaque ligne échoue, comme l'un des & est en dehors des citations.

Il peut être résolu en lisant à partir d'un fichier temporaire 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éveloppez le% 1 après un rem déclaration (fonctionne également avec% 2 ..% *).
Donc même "&"& pourrait être répercuté sans produire d'erreur, comme on le fait remarquer.

Mais pour pouvoir rediriger la sortie du echo on, vous avez besoin des deux FOR-LOOPS.

Les caractères supplémentaires * # sont utilisés pour être sûr contre des contenus comme /? (montrerait l'aide pour REM).
Ou un caret à la fin de la ligne pourrait fonctionner comme un caractère multiligne, même après un rem.

Puis en lisant le paramètre rem sortie du fichier, mais soigneusement.
Le FOR / F devrait fonctionner avec l'expansion retardée, sinon le contenu avec "!" serait détruit.
Après avoir supprimé les caractères supplémentaires dans param1, vous l'avez.

Et pour utiliser param1 de manière sûre, activez l'extension différée.


71
2018-03-30 22:16



Oui, et n'oubliez pas d'utiliser des variables comme %%1 en utilisant if et for et le gang.

Si vous oubliez le double %, alors vous substituerez des arguments de ligne de commande (éventuellement nuls) et vous recevrez des messages d'erreur assez confus.


51
2017-08-25 18:16



Il n'y a pas besoin de le compliquer. C'est simplement la commande% 1% 2 paramètres, par exemple,

@echo off

xcopy %1 %2 /D /E /C /Q /H /R /K /Y /Z

echo copied %1 to %2

pause

La "pause" affiche ce que le fichier batch a fait et attend que vous appuyiez sur la touche ANY. Enregistrez-le comme xx.bat dans le dossier Windows.

Pour l'utiliser, tapez, par exemple:

xx c:\f\30\*.* f:\sites\30

Ce fichier batch prend en charge tous les paramètres nécessaires, comme la copie de fichiers uniquement, qui sont plus récents, etc. Je l'ai utilisé depuis avant Windows. Si vous aimez voir les noms des fichiers, comme ils sont copiés, laissez le Q paramètre.


45
2018-04-18 23:46



@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue

Note: SI "%1"=="" causera des problèmes si %1 est inclus entre guillemets.

Dans ce cas, utilisez IF [%1]==[]ou, dans NT 4 (SP6) et plus tard seulement, IF "%~1"=="" au lieu.


30
2018-03-14 06:02



Un ami me posait des questions sur ce sujet récemment, alors j'ai pensé que je posterais comment je gère les arguments de la ligne de commande dans les fichiers batch.

Cette technique a un peu de surcharge comme vous le verrez, mais elle rend mes fichiers batch très faciles à comprendre et rapides à implémenter. En plus de soutenir les structures suivantes:

>template.bat [-f] [--flag] [/f] [--namedvalue value] arg1 [arg2][arg3][...]

Le brin de celui-ci a le :init, :parse, et :main les fonctions.

Exemple d'utilisation

>template.bat /?
test v1.23
This is a sample batch file template,
providing command-line arguments and flags.

USAGE:
test.bat [flags] "required argument" "optional argument"

/?, --help           shows this help
/v, --version        shows the version
/e, --verbose        shows detailed output
-f, --flag value     specifies a named parameter value

>template.bat          <- throws missing argument error
(same as /?, plus..)
****                                   ****
****    MISSING "REQUIRED ARGUMENT"    ****
****                                   ****

>template.bat -v
1.23

>template.bat --version
test v1.23
This is a sample batch file template,
providing command-line arguments and flags.

>template.bat -e arg1
**** DEBUG IS ON
UnNamedArgument:    "arg1"
UnNamedOptionalArg: not provided
NamedFlag:          not provided

>template.bat --flag "my flag" arg1 arg2
UnNamedArgument:    "arg1"
UnNamedOptionalArg: "arg2"
NamedFlag:          "my flag"

>template.bat --verbose "argument #1" --flag "my flag" second
**** DEBUG IS ON
UnNamedArgument:    "argument #1"
UnNamedOptionalArg: "second"
NamedFlag:          "my flag"

template.bat

@::!/dos/rocks
@echo off
goto :init

:header
    echo %__NAME% v%__VERSION%
    echo This is a sample batch file template,
    echo providing command-line arguments and flags.
    echo.
    goto :eof

:usage
    echo USAGE:
    echo   %__BAT_NAME% [flags] "required argument" "optional argument" 
    echo.
    echo.  /?, --help           shows this help
    echo.  /v, --version        shows the version
    echo.  /e, --verbose        shows detailed output
    echo.  -f, --flag value     specifies a named parameter value
    goto :eof

:version
    if "%~1"=="full" call :header & goto :eof
    echo %__VERSION%
    goto :eof

:missing_argument
    call :header
    call :usage
    echo.
    echo ****                                   ****
    echo ****    MISSING "REQUIRED ARGUMENT"    ****
    echo ****                                   ****
    echo.
    goto :eof

:init
    set "__NAME=%~n0"
    set "__VERSION=1.23"
    set "__YEAR=2017"

    set "__BAT_FILE=%~0"
    set "__BAT_PATH=%~dp0"
    set "__BAT_NAME=%~nx0"

    set "OptHelp="
    set "OptVersion="
    set "OptVerbose="

    set "UnNamedArgument="
    set "UnNamedOptionalArg="
    set "NamedFlag="

:parse
    if "%~1"=="" goto :validate

    if /i "%~1"=="/?"         call :header & call :usage "%~2" & goto :end
    if /i "%~1"=="-?"         call :header & call :usage "%~2" & goto :end
    if /i "%~1"=="--help"     call :header & call :usage "%~2" & goto :end

    if /i "%~1"=="/v"         call :version      & goto :end
    if /i "%~1"=="-v"         call :version      & goto :end
    if /i "%~1"=="--version"  call :version full & goto :end

    if /i "%~1"=="/e"         set "OptVerbose=yes"  & shift & goto :parse
    if /i "%~1"=="-e"         set "OptVerbose=yes"  & shift & goto :parse
    if /i "%~1"=="--verbose"  set "OptVerbose=yes"  & shift & goto :parse

    if /i "%~1"=="--flag"     set "NamedFlag=%~2"   & shift & shift & goto :parse

    if not defined UnNamedArgument     set "UnNamedArgument=%~1"     & shift & goto :parse
    if not defined UnNamedOptionalArg  set "UnNamedOptionalArg=%~1"  & shift & goto :parse

    shift
    goto :parse

:validate
    if not defined UnNamedArgument call :missing_argument & goto :end

:main
    if defined OptVerbose (
        echo **** DEBUG IS ON
    )

    echo UnNamedArgument:    "%UnNamedArgument%"

    if defined UnNamedOptionalArg      echo UnNamedOptionalArg: "%UnNamedOptionalArg%"
    if not defined UnNamedOptionalArg  echo UnNamedOptionalArg: not provided

    if defined NamedFlag               echo NamedFlag:          "%NamedFlag%"
    if not defined NamedFlag           echo NamedFlag:          not provided

:end
    call :cleanup
    exit /B

:cleanup
    REM The cleanup function is only really necessary if you
    REM are _not_ using SETLOCAL.
    set "__NAME="
    set "__VERSION="
    set "__YEAR="

    set "__BAT_FILE="
    set "__BAT_PATH="
    set "__BAT_NAME="

    set "OptHelp="
    set "OptVersion="
    set "OptVerbose="

    set "UnNamedArgument="
    set "UnNamedArgument2="
    set "NamedFlag="

    goto :eof

23
2017-07-13 03:32



Gardons cela simple.

Voici le fichier .cmd.

@echo off
rem this file is named echo_3params.cmd
echo %1
echo %2
echo %3
set v1=%1
set v2=%2
set v3=%3
echo v1 equals %v1%
echo v2 equals %v2%
echo v3 equals %v3%

Voici 3 appels depuis la ligne de commande.

C:\Users\joeco>echo_3params 1abc 2 def  3 ghi
1abc
2
def
v1 equals 1abc
v2 equals 2
v3 equals def

C:\Users\joeco>echo_3params 1abc "2 def"  "3 ghi"
1abc
"2 def"
"3 ghi"
v1 equals 1abc
v2 equals "2 def"
v3 equals "3 ghi"

C:\Users\joeco>echo_3params 1abc '2 def'  "3 ghi"
1abc
'2
def'
v1 equals 1abc
v2 equals '2
v3 equals def'

C:\Users\joeco>

18
2017-12-31 17:59



FOR %%A IN (%*) DO (
    REM Now your batch file handles %%A instead of %1
    REM No need to use SHIFT anymore.
    ECHO %%A
)

Cela boucle sur les paramètres du lot (% *), qu'ils soient indiqués ou non, puis répercute chaque paramètre.


16
2017-11-25 04:39