cmd.exe: conditions complexes?
dans des fichiers batch DOS, Dans un IF
déclaration, est-il possible de combiner deux ou plusieurs conditions à l'aide de ET ou OU ? Je n'étais pas en mesure de trouver toute la documentation pour que
Modifier - help if
et le MS docs ne rien dire sur l'utilisation de plus d'un état dans un si.
J'imagine une solution de contournement pour ET serait de faire
if COND1 (
if COND2 (
cmd
)
)
mais c'est exactement ce que j'essaie d'éviter.
- Lorsque vous avez tapé
HELP IF
qu'avez-vous vu? Quelque chose d'utile? Veuillez lireHELP IF
et ensuite mettre à jour votre question pour être plus précise, en fonction de ce que vous lisez.
Vous devez vous connecter pour publier un commentaire.
Non, il n'y a pas de moyen plus facile.
Pour
and
vous pouvez aussi tout simplement de la chaîne d'eux, sans introduire des blocs:qui, franchement, n'est-ce pas pire que les
Cependant, pour
or
il devient plus laide, en effet:ou:
Une fois j'ai vu un lot de préprocesseur qui a utilisé C-comme syntaxe pour le contrôle de flux et le lot choses entre et ensuite converti ces conditions en de multiples sauts et des contrôles. Cependant, cette chose a été pour des fichiers batch DOS et a peu ou pas de l'utiliser dans un environnement Windows.
Parfois, je me demande, ce que les gens apprennent à l'école aujourd'hui! Bien sûr, "OU", il est possible aussi. Tout système qui peut vous fournir avec un " PAS "et un "ET", vous offre automatiquement un " OU " trop, parce que:
x OU y = PAS ( (PAS de x) ET (N'y) ) voir http://en.wikipedia.org/wiki/De_Morgan%27s_laws
Donc, tant que l'expression "si (x ET y), alors ne z" peut être écrit comme ceci:
... nous devrions être en mesure d'écrire l'expression "si (x OU y), alors ne z", mais il y a un problème:
Où nous avons mis le premier "PAS"? Eh bien, la réponse est nulle part, il convient de le réformer l'équation ci-dessus d'abord à:
PAS ( x OU y ) = (PAS de x) ET (N'y)
En fonction de cela, nous pouvons écrire que "si (NON(x OU y)), alors (ne z)" comme:
"si ((PAS de x) ET (N'y)), alors (ne z)"
Avoir cela et sachant comment exprimer ET comme indiqué ci-dessus, nous pouvons maintenant écrire l'expression "si (NON(x OU y)), alors (ne z)" comme:
Nous savons aussi que l'expression:
"si (NON p) alors (q) autre (ne r)"
... est équivalent à:
"si (p) alors (ne r) else (q)
Ainsi, nous pouvons écrire pour "si (x OU y), alors (ne z)":
"si (NON(x OU y)), alors (ne rien faire) autre (ne z)"
Afin que nous puissions exprimer "si (x OU y), alors (ne z)" comme:
Mais ce n'est pas encore complète, car ce n'est pas un vrai "ET de" mais un "simulé" un. Ce qui manque, c'est la deuxième d'autre. Donc la remplir le formulaire pour obtenir le résultat correct devrait être:
... qui a le vilain double d'autre part. Vous pouvez résoudre qu'avec un "goto" et nous enfin ont:
La solution je suis d'accord avec Joey, je ne vois pas d'autre solution.
Pour le OU une solution de contournement, je propose le "truc":
Disons que vous voulez tester si l'utilisateur a demandé de l'aide sur la ligne de commande tout en appelant à votre fichier de commandes, quelque chose comme:
thebatch /?
.Mais vous ne savez pas si l'utilisateur va taper
/?
ou plutôt (soit un Unix habitués de l'utilisateur)--help
ou-h
ou même oublier de passer un argument à tous.Votre code pourrait ressembler à:
Toutefois, de noter que les essais "/?" ou "-?" les chaînes ne fonctionnent pas avec ce truc (
FOR
boucles n'aime pas le?
méta caractère).Pour cela, il suffit d'ajouter la ligne:
if "%1"=="/?" goto help
sur le dessus du bloc (voir la':help'
étiquette à l'intérieur de lafor
boucle ?)Noter que cette syntaxe ne fonctionne pas (c'est juste complètement ignoré et le code ne sera pas exécuté) avec des fichiers batch sous TCC.EXE (le Prendre interpréteur de Commande, soit en totalité ou en version lite) mais dans ce cas il suffit d'utiliser leur syntaxe, leur
.OR.
et.AND.
mots-clés.Espère que cette aide.
Si vos conditions sont à vérifier pour des valeurs d'une variable, vous pourriez être en mesure de mettre en place comme une instruction case. J'ai eu un besoin de vérifier si le TYPE était un membre individuel ou un groupe de (ou tous les).
Remarque: étiquettes sont insensibles à la casse.
Si les conditions sont remplies (si
TYPE==ALL
ouTYPE==GROUP1
ouTYPE==GROUP2
), puis le bloc de code est exécuté, sinon, l'exécution saute sur le bloc.Je n'aime pas Mehrdad d'Ingénierie Électrique (électronique numérique) approche. Bien que précis, avec des logiciels de l'ingénierie, de l'idée, comme indiqué par l'OP, est de rendre les choses plus simples à comprendre. Instructions if imbriquées ajouter de la Complexité (McCabe). En ajoutant plus Démunis ne l'aide pas.
Ma solution est un peu bizarre si vous ne connaissez pas le goto label/erreur, mais c'est un plat de la structure qui est à peu près semblable à celle d'un if avec plusieurs OU souhaitez des conditions qui ne sont pas difficile à déchiffrer.
ET:
OU:
Pour la mise en œuvre OU de cette façon, vous avez besoin d'extensions de commande.
Aussi longtemps que les extensions de commandes sont activées, vous pouvez utiliser compare-opérateurs.
C'est directement collé à partir d'aide "si":
Si les Extensions de commandes sont activées SI des changements comme suit:
où comparez-op peut être:
et le commutateur /I, si elle est spécifiée, a dit de le faire de la casse de la chaîne de
compare. Le commutateur /I peut également être utilisé sur la forme chaîne1==chaîne2
de SI. Ces comparaisons sont génériques que si chaîne1 et
chaîne2 sont tous deux constitués de tous les chiffres, alors que les chaînes sont
converties en nombres, et une comparaison numérique est effectuée.
and
etor
l'OP demandé à ce sujet? La question n'était pas sur la simple comparaison des conditions.