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