Comment puis-je vérifier si un paramètre est défini lors de l'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 lorsqu'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?

82
demandé sur Daniel Fortunov 2009-05-06 20:45:11

6 réponses

La vérification pour savoir si une ligne de commande est un argument peut être [%1]==[], mais, comme Dave Costa souligne, "%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. En outre, le exit a besoin d'un argument /B sinon {[5] } quittera.

@echo off

if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1
121
répondu Iain 2017-11-05 16:46:55

Un exemple plus avancé:

⍟ arguments illimités.

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

Specify spécifiez si est un fichier

⍟ spécifiez est un répertoire

aucune extension , ne 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 trucs..

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

■ 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 de fichier tout en vérifiant des choses (et de cette façon pas besoin d'envelopper 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 encore, donc à la place l'expression utilise des crochets et l'original non modifié %1 (juste sans l'emballage ", le cas échéant..)

S'il n'y avait pas d'arguments, si nous avons utilisé shift et le pointeur arg-list a passé le dernier, l'expression sera évaluée à [""]==[""].

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

■ exemples d'exécution

Enregistrez-le sous identifier.cmd

Il peut identifier un argument illimité (normalement vous êtes limité à %1-%9), n'oubliez pas d'envelopper les arguments avec des virgules inversées, ou utilisez le nommage 8.3, ou faites-les glisser-déposer (il fait automatiquement l'un des ci-dessus).


Cela 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 plusieurs arguments (bien sûr, c'est le tout-deal..)

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, il peut être beaucoup plus complexe, mais les bons exemples devraient toujours être simples et minimes. :)

J'Espère que ça aide tout le monde :)

publié ici: cmd Ninja-traitement illimité des Arguments, identifiant S'il existe dans le système de fichiers, identifiant si le fichier ou le 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 debug-console (ADB.EXE): faire du Post précédent un installateur APK de masse qui N'utilise pas la syntaxe ADB Install-Multi

13
répondu 2016-01-01 02:17:07

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 prend réellement les parenthèses pour faire partie des chaînes et elles sont comparées.

13
répondu Dave Costa 2017-11-05 18:28:31
IF "%~1"=="" GOTO :Usage

~ supprimera %1 Si %1 lui-même est cité.

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

5
répondu Amr Ali 2014-11-24 16:50:50
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
2
répondu Howard Rothenburg 2012-05-02 11:14:17

Si" %1"==" " échoue, toutes les versions de ceci échoueront sous certaines conditions de caractère poison. Seulement si défini ou si non défini sont sûrs

0
répondu codey 2017-12-26 18:33:42