302 votes

Les opérateurs logiques ("and", "or") dans les scripts batch DOS

Comment implémenteriez-vous les opérateurs logiques dans les fichiers batch DOS ?

7 votes

Je soumets pour votre plaisir de visionner : pi.bat :) thedailywtf.com/Articles/…

353voto

paxdiablo Points 341644

Vous pouvez faire et avec des conditions imbriquées :

if %age% geq 2 (
    if %age% leq 12 (
        set class=child
    )
)

Vous pouvez également le faire sous cette forme abrégée :

if %age% geq 2 if %age% leq 12 set class=child

Vous pouvez faire ou avec une variable distincte :

set res=F
if %hour% leq 6 set res=T
if %hour% geq 22 set res=T
if "%res%"=="T" (
    set state=asleep
)

Remarquez que cette réponse est conçue pour le langage batch cmd, celui trouvé dans Windows. Vous mentionnez "batch DOS" mais, selon plusieurs points, je pense que le premier choix est le plus sûr(1).

Si vous vouliez vraiment dire le langage batch MS-DOS d'origine, gardez à l'esprit que l'instruction if était beaucoup plus simple, et vous pourriez avoir besoin d'utiliser des blocs if ... goto pour le flux de contrôle, plutôt que (par exemple) des parenthèses ou un else.


(1) Appuyé par les points suivants :

  • La présence des balises cmd et windows-console ;
  • La précédente expérience de certaines personnes qui ont échoué à reconnaître la différence très réelle entre les langages batch cmd et MS-DOS, et qui ont confondu le DOC avec la fenêtre terminal cmd ;
  • La question utilisant le terme plus générique "DOS" plutôt que spécifiquement "MS-DOS" (où "DOS" pourrait éventuellement être n'importe quel système d'exploitation de disque) ;
  • Le fait que ceci est Stack Overflow plutôt que le site sœur retro-computing, où une question sur MS-DOS serait bien plus appropriée (je suis souvent aussi sur ce site, c'est sympa pour ceux d'entre nous qui se souviennent et apprécient l'histoire de l'informatique) ; et
  • L'acceptation (éventuelle) de la réponse par le demandeur initial, indiquant que la solution a fonctionné.

17 votes

Vous pouvez également simplement utiliser set res= ou set res=1 et ensuite if defined res ce qui est un peu plus robuste contre les fautes de frappe et fonctionne même dans les blocs sans activer explicitement l'expansion différée.

7 votes

Juste pour améliorer un peu votre réponse... vous n'avez pas besoin de imbriquer explicitement les déclarations "if" ... vous pouvez simplement les "enchaîner", comme le démontre Dave Jarvis ci-dessous

0 votes

Veillez à ne laisser aucun espace après le set=true, sinon cela ne fonctionnera pas correctement. Cela stockerait la valeur "true " dans la variable...

86voto

Dave Jarvis Points 12598

La déclaration IF ne prend pas en charge les opérateurs logiques AND et OR. Les déclarations IF en cascade impliquent une conjonction implicite :

IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL

Si les fichiers File1.Dat et File2.Dat existent, alors sauter à l'étiquette FILE12_EXIST_LABEL.

Voir aussi: IF /?

65voto

anomal Points 758

Lois de De Morgan nous permettent de convertir des disjonctions ("OU") en équivalents logiques en n'utilisant que des conjonctions ("ET") et des négations ("NON"). Cela signifie que nous pouvons enchaîner des disjonctions ("OU") sur une seule ligne.

Cela signifie que si le nom est "Yakko" ou "Wakko" ou "Dot", alors afficher "Frère ou soeur Warner".

set warner=true
if not "%name%"=="Yakko" if not "%name%"=="Wakko" if not "%name%"=="Dot" set warner=false
if "%warner%"=="true" echo Frère ou soeur Warner

Il s'agit d'une autre version de l'exemple "OU" de paxdiablo, mais les conditions sont enchaînées sur une seule ligne. (Notez que l'opposé de leq est gtr, et l'opposé de geq est lss.)

set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep

8voto

Timo Salmi Points 136

OU est légèrement difficile, mais pas excessivement. Voici un exemple

set var1=%~1
set var2=%~2
::
set or_=
if "%var1%"=="Stack" set or_=true
if "%var2%"=="Overflow" set or_=true
if defined or_ echo Stack OU Overflow

0 votes

Ne fonctionne pas. Si je lui donne Stack, il répète. Si je lui donne Overflow, il ne le fait pas - il devrait.

1 votes

@Unknow0059 : cela résonne si le premier argument est Stack ou si le deuxième argument est Overflow. Je soupçonne que cela ait pu être une erreur de Timo (aurait dû simplement utiliser var1 mais cela ne signifie pas que le concept ne fonctionne pas.

6voto

GinDiamond Points 31

Les exemples suivants montrent comment faire une déclaration AND (utilisée pour définir des variables ou inclure des paramètres pour une commande).

Pour démarrer le Bloc-notes et fermer la fenêtre CMD :

start notepad.exe & exit

Pour définir les variables x, y et z à des valeurs si la variable 'a' est égale à "blah".

IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X