windows - variable - script batch




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

Créez un nouveau fichier batch (exemple: openclass.bat) et écrivez cette ligne dans le fichier:

java %~n1

Ensuite, placez le fichier batch dans, disons, le dossier system32, allez dans votre fichier de classe Java, faites un clic droit, Propriétés, Ouvrir avec ..., puis trouvez votre fichier batch, sélectionnez-le et c'est ça ...

Ça marche pour moi.

PS: je ne trouve pas un moyen de fermer la fenêtre cmd lorsque je ferme la classe Java. Pour l'instant...

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 [email protected] > test-log.txt

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>

J'ai écrit un script read_params simple qui peut être appelé en tant que fonction (ou externe .bat ) et mettra toutes les variables dans l'environnement actuel. Il ne modifiera pas les paramètres d'origine car la fonction est call avec une copie des paramètres d'origine.

Par exemple, donné la commande suivante:

myscript.bat some -random=43 extra -greeting="hello world" fluff

myscript.bat serait capable d'utiliser les variables après avoir appelé la fonction:

call :read_params %*

echo %random%
echo %greeting%

Voici la fonction:

:read_params
if not %1/==/ (
    if not "%__var%"=="" (
        if not "%__var:~0,1%"=="-" (
            endlocal
            goto read_params
        )
        endlocal & set %__var:~1%=%~1
    ) else (
        setlocal & set __var=%~1
    )
    shift
    goto read_params
)
exit /B

Limites

  • Impossible de charger des arguments sans valeur, tels que -force . Vous pouvez utiliser -force=true mais je ne peux pas penser à un moyen d'autoriser des valeurs vides sans connaître une liste de paramètres à l'avance qui n'aura pas de valeur.

Changelog

  • 18/02/2016
    • Ne nécessite plus d'expansion retardée
    • Fonctionne maintenant avec d'autres arguments de ligne de commande en recherchant - avant les paramètres.

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 produire 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 une version remarquée 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 l' echo on et à développer le% 1 après une instruction rem (fonctionne également avec% 2 ..% *).
Donc même "&"& pourrait être répercuté sans produire d'erreur, comme on le remarque.

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

Les caractères supplémentaires * # sont utilisés pour être sûrs 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 la sortie du paramètre rem 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.


Pour faire référence à une variable définie dans la ligne de commande, vous devez utiliser "% a%", par exemple:

      set a=100 
      echo %a%  
      output = 100 

Note: Cela fonctionne pour Windows 7 pro.


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

Une autre astuce utile consiste à utiliser% * pour 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.


Voici comment je le fais.

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

Voici à quoi ressemble la ligne de commande:

test.cmd admin [email protected] > 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.


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.





cmd