web-dev-qa-db-fra.com

Comment puis-je vérifier si un argument est défini lors du démarrage/appel d'un fichier de commandes?

J'essaie d'utiliser la logique de validation suivante dans un fichier de commandes mais le bloc "utilisation" ne s'exécute jamais, même si aucun paramètre n'est fourni au fichier de commandes.

if ("%1"=="") goto usage

@echo This should not execute

@echo Done.
goto :eof

:usage
@echo Usage: %0 <EnvironmentName>
exit 1

Qu'est-ce que je fais mal?

85
Daniel Fortunov

La vérification permettant de déterminer si un argument de ligne de commande a été défini peut être [%1]==[], mais comme Dave Costaindique , "%1"=="" fonctionnera également.

J'ai également corrigé une erreur de syntaxe dans l'écho d'utilisation pour échapper aux signes supérieur à et inférieur à. De plus, la variable exit nécessite un argument /B, sinon CMD.exe se ferme.

@echo off

if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1
126
Iain

Débarrassez-vous des parenthèses.

Exemple de fichier batch:

echo "%1"

if ("%1"=="") echo match1

if "%1"=="" echo match2

Résultat de l'exécution du script ci-dessus:

C:\>echo "" 
""

C:\>if ("" == "") echo match1 

C:\>if "" == "" echo match2 
match2

Je pense qu'il faut en fait que les parenthèses fassent partie des chaînes et qu'elles soient comparées.

13
Dave Costa

Un exemple plus avancé:

Arguments arguments illimités.

⍟ existe sur le système de fichiers (file ou directory?) Ou générique string.

Spécifier s'il s'agit d'un fichier

⍟ spécifier est un répertoire

non _ extensions, fonctionneraient dans des scripts hérités!

code minimal

 @ echo off 

: boucle 
 :: -------------------------- a l'argument? 
 if ["% ~ 1"] == [""] (
 écho effectué .
 goto end 
) 
 :: -------------------------- argument existe? 
 sinon,% ~ s1 (
 echo n'existe pas 
) else (
 echo existe 
 s'il existe% ~ s1\NUL (
 echo est un répertoire 
) else (
 echo est un fichier 
) 
) 
 :: --------------------------
 décalage
 goto loop 


: end 

 pause 

_ {Stuff autres choses..✨

■ dans %~1 - le ~ supprime tout wrapping " ou '.

■ dans %~s1 - la s fait que le chemin soit DOS 8.3 naming, ce qui est une astuce intéressante pour éviter les espaces dans le nom du fichier lors de la vérification (ce qui évite de surcharger la ressource avec plus de "s.

■ le ["%~1"]==[""] "ne peut pas être sûr" si l'argument est encore un fichier/répertoire ou juste une chaîne générique; l'expression utilise donc des crochets et le %1 d'origine non modifié (sans le sautage ", le cas échéant).

s'il n'y a pas eu d'argument ou si nous avons utilisé shift et que le pointeur de la liste arg a passé le dernier, l'expression sera évaluée à [""]==[""].

■ c'est aussi spécifique que vous pouvez être sans utiliser plus de trucs (cela fonctionnerait même dans les scripts de batch de Windows-95 ...)

■ exemples d'exécution

enregistrez-le sous identifier.cmd

il peut identifier un nombre illimité d'arguments (normalement, vous êtes limité à %1-%9), n'oubliez pas de placer les arguments entre guillemets, d'utiliser la dénomination 8.3 ou de les glisser-déplacer (cette option effectue automatiquement l'une des actions ci-dessus).


cela vous permet d'exécuter les commandes suivantes:

identifier.cmd c:\windows Et pour obtenir

 exist
 est un répertoire 
 done 

identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE" Et pour obtenir

 exist
 est un fichier 
 done 

⓷ et plusieurs arguments (bien sûr c'est le deal-complet ..)

identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world

et pour obtenir

 exist
 est un répertoire
exist
 est un fichier
existe
 est un fichier 
 n'existe pas 
 fait .

Naturellement, cela peut être beaucoup plus complexe,/ mais les bons exemples doivent toujours être simples et minimaux. :)

J'espère que ça aide n'importe qui :)

publié ici: CMD Ninja - Traitement d'arguments illimités, Identifier s'il existe dans un système de fichiers, Identifier si un fichier ou un répertoire

et voici un exemple de travail qui prend n'importe quelle quantité de fichiers APK (applications Android) et les installe sur votre appareil via la console debug (ADB.exe): Créez le post précédent. Un installateur APK de masse qui n'utilise pas ADB Install-Multi Syntax

13
user257319
IF "%~1"=="" GOTO :Usage

~ annulera% 1 si% 1 lui-même est cité.

"" protégera des caractères spéciaux passés. par exemple appeler le script avec & ping

6
Amr Ali
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
2

SI "% 1" == "" échouera, toutes les versions de celui-ci échoueront sous Certaines conditions de caractère poison . Seulement SI DEFINI ou SI NON DEFINI sont sans danger

0
codey

C'est la même chose que pour les autres réponses, mais n'utilise qu'un seul libellé et donne la priorité à l'utilisation, ce qui en fait également une sorte de recommandation de la documentation associée au script, généralement placé en haut:

@echo off
:: add other test for the arguments here...
if not [%1]==[] goto main
:: --------------------------
echo This command does something.
echo.
echo %0 param%%1 param%%2
echo       param%%1 the file to operate on
echo       param%%1 another file

:: --------------------------
exit /B 1

:main
:: --------------------------
echo do something with all arguments (%%* == %*) here...

Cependant, si vous n'avez pas besoin d'utiliser cmd/batch, utilisez bash sur WSL ou powershell, ils ont une syntaxe plus saine et des fonctionnalités moins mystérieuses.

0
masterxilo