114 votes

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

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

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 de mal ?

0 votes

1 votes

@double-beep - La question ici (par daniel-fortunov) a été posée en premier, environ un an avant que la question à laquelle vous faites référence ne soit postée. Quel est le doublon (possible) ?

1 votes

@KevinFegan parce que l'autre question a plus de vues et plus de réponses.

182voto

Iain Points 2909

La vérification de l'existence d'un argument de la ligne de commande peut être [%1]==[] mais, comme Dave Costa souligne , "%1"=="" fonctionnera également.

J'ai également corrigé une erreur de syntaxe dans l'utilisation de echo pour échapper aux signes plus grand que et moins grand. En outre, le exit a besoin d'un /B argument contraire CMD.exe va démissionner.

@echo off

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

26 votes

[%1]==[] est préférable à "%1"=="" car il gère correctement le cas où %1 contient lui-même des guillemets doubles. "%1"=="" provoquera une erreur avec un message "unexpected at this time".

2 votes

Notez que, si vous n'utilisez pas d'arguments en ligne de commande mais que set (je ne connais pas la terminologie correcte pour les lots), vous pourriez vouloir utiliser "%myvar%"=="" car si myvar contient des espaces et n'est pas cité, vous obtiendrez le message "unexpected at this time".

1 votes

@Pat Les variables SET pourraient être vérifiées avec IF NOT DEFINED VarName bloc. Aussi +1 à tukushan pour ne pas utiliser de guillemets dans la comparaison. Mais ne le faites pas. Jamais.

27voto

Un exemple plus avancé :

⍟ arguments illimités.

⍟ existent sur le système de fichiers (soit file o directory ?) ou un générique string .

⍟ spécifier si c'est un fichier

⍟ specify is a directory

no extensions, fonctionnerait dans les scripts hérités !

code minimal ☺

@echo off

:loop
      ::-------------------------- has argument ?
      if \["%~1"\]==\[""\] (
        echo done.
        goto end
      )
      ::-------------------------- argument exist ?
      if not exist %~s1 (
        echo not exist
      ) else (
        echo exist
        if exist %~s1\\NUL (
          echo is a directory
        ) else (
          echo is a file
        )
      )
      ::--------------------------
      shift
      goto loop

:end

pause

✨ d'autres choses..✨

■ dans %~1 - le ~ supprime tout emballage " o ' .

■ dans %~s1 - le s fait que le chemin soit DOS 8.3 naming ce qui est une bonne astuce pour éviter les espaces dans le nom du fichier lors de la vérification (et de cette façon, il n'est pas nécessaire d'entourer la ressource avec plus de " s.

■ le ["%~1"]==[""] "ne peut pas être sûr" si l'argument est un fichier/répertoire ou juste une chaîne générique, donc à la place l'expression utilise des parenthèses et l'original non modifié %1 (juste sans le " l'emballage, le cas échéant )

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

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

■ exemples d'exécution

l'enregistrer comme identifier.cmd

il peut identifier un nombre illimité d'arguments (normalement vous êtes limité à %1 - %9 ), n'oubliez pas d'entourer les arguments de guillemets, ou d'utiliser le nommage 8.3, ou encore de les glisser-déposer (il fait automatiquement l'une ou l'autre de ces opérations).


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

identifier.cmd c:\windows et pour obtenir

exist
is a directory
done

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

exist
is a file
done

⓷ et des arguments multiples (bien sûr, c'est tout le problème..)

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

et pour obtenir

exist
is a directory
exist
is a file
exist
is a file
not exist
done.

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

J'espère que cela aidera tout le monde :)

publié ici : <a href="http://icompile.eladkarako.com/cmd-unlimited-arguments-identifying-directory-file-or-none/" rel="noreferrer">CMD Ninja - Traitement des arguments illimités, identification de l'existence d'un système de fichiers, identification d'un fichier ou d'un répertoire</a>

et voici un exemple fonctionnel qui prend n'importe quelle quantité de fichiers APK (applications Android) et les installe sur votre appareil via la console de débogage (ADB.exe) : <a href="http://icompile.eladkarako.com/mass-apk-installer-wo-adb-install-multi/" rel="noreferrer">Faire du post précédent un installateur APK de masse qui n'utilise pas la syntaxe Install-Multi de ADB</a>

16voto

Dave Costa Points 25282

Débarrassez-vous des parenthèses.

Exemple de fichier batch :

echo "%1"

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

if "%1"=="" echo match2

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

C:\>echo "" 
""

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

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

Je pense qu'il considère en fait que les parenthèses font partie des chaînes de caractères et qu'elles sont comparées.

1 votes

if "%1"=="" se plantera si l'argument contient des espaces. Par exemple : run.bat "a b" . @amr a la meilleure réponse à utiliser if "%~1"==""

6voto

Amr Ali Points 1295
IF "%~1"=="" GOTO :Usage

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

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

3voto

masterxilo Points 134

C'est la même chose que les autres réponses, mais elle n'utilise qu'une seule étiquette et place l'utilisation en premier, ce qui lui permet en plus de servir de recommandation de documentation du script qui est aussi habituellement 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 moins de fonctionnalités obscures.

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