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?
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
Un exemple plus avancé:
⍟ arguments illimités.
⍟ existent sur le système de fichiers (soit
file
oudirectory
?) ou un génériquestring
.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 :)
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
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.
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
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
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