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?
batch-file
arguments
Daniel Fortunov
la source
la source
Réponses:
La vérification pour savoir si un argument de ligne de commande a été défini peut être
[%1]==[]
, mais, comme le souligne Dave Costa , fonctionnera également."%1"==""
J'ai également corrigé une erreur de syntaxe dans l'écho d'utilisation pour échapper aux signes supérieur à et inférieur à. De plus, les
exit
besoins d'un/B
argument seCMD.exe
termineront autrement .la source
set
variables (je ne connais pas la terminologie correcte des lots), vous voudrez peut-être utiliser"%myvar%"==""
car s'ilmyvar
contient des espaces et n'est pas entre guillemets, vous obtiendrez le "inattendu pour le moment " message.IF NOT DEFINED VarName
block. Également +1 à tukushan pour ne pas utiliser de guillemets en comparaison. Ne fais pas ça. Jamais."%~1"==""
fonctionnera également et s'occupera du cas où% 1 a des guillemets doubles"%~1"==""
gère les espaces dans la variable alors que la[]
version ne le fait pas.✨ d'autres trucs..✨
■ in
%~1
- le~
supprime tout emballage"
ou'
.■ in
%~s1
- thes
crée le cheminDOS 8.3 naming
, ce qui est une bonne astuce pour éviter les espaces dans le nom du fichier lors de la vérification des éléments (et de cette façon, il n'est pas nécessaire 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 le"
wrapping, le cas échéant ..)s'il n'y avait aucun argument de si nous avons utilisé
shift
et que le pointeur arg-list a passé le dernier, l'expression sera évaluée[""]==[""]
.■ c'est aussi spécifique que vous pouvez l'être sans utiliser plus d'astuces (cela fonctionnerait même dans les scripts 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
), rappelez-vous simplement de placer les arguments avec des virgules inversées, ou d'utiliser un nom 8.3, ou de les glisser-déposer (il fait automatiquement l'une des deux ci-dessus).cela vous permet d'exécuter les commandes suivantes:
⓵
identifier.cmd c:\windows
et pour obtenir⓶
identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
et pour obtenir⓷ et de multiples arguments (bien sûr, c'est l'affaire complète ..)
identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
et pour obtenir
naturellement, cela peut être beaucoup plus complexe, mais les bons exemples doivent toujours être simples et minimaux. :)
J'espère que cela aide n'importe qui :)
publié ici: CMD Ninja - Traitement illimité des arguments, identifiant s'il existe dans le système de fichiers, identifiant 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 de débogage (ADB.exe): Faites de l'article précédent un programme d'installation APK de masse qui n'utilise pas la syntaxe ADB Install-Multi
la source
Débarrassez-vous des parenthèses.
Exemple de fichier batch:
Sortie de l'exécution du script ci-dessus:
Je pense qu'il faut en fait prendre les parenthèses pour faire partie des chaînes et elles sont comparées.
la source
if "%1"==""
plantera si l'argument a des espaces. Par exemple:run.bat "a b"
. @amr a la meilleure réponse à utiliserif "%~1"==""
~ supprimera% 1 si% 1 lui-même est cité.
"" protégera des caractères spéciaux passés. par exemple en appelant le script avec & ping
la source
run.bat "a b"
run.bat ""
ne sera pas attrapé par avec[%1]==[]
.la source
run.bat "a b"
C'est la même chose que les autres réponses, mais n'utilise qu'une seule étiquette et met l'utilisation en premier, ce qui en fait également une sorte de documentation recommandée pour le script qui est également généralement placé en haut:
Cependant, si vous n'avez pas à utiliser cmd / batch, utilisez bash sur WSL ou powershell, ils ont une syntaxe plus saine et moins de fonctionnalités arcanes.
la source
SI "% 1" == "" échouera, toutes les versions de ceci échoueront sous certaines conditions de caractère empoisonné. Seuls SI DEFINI ou SI NON DEFINI sont sûrs
la source
if [not] defined ...
ne fonctionne pas avec des paramètres comme%1
. Avez-vous un exemple, oùif "%~1" ...
ne fonctionne pas?