web-dev-qa-db-fra.com

Symbole équivalent à NEQ, LSS, GTR, etc. dans les fichiers de commandes Windows

En lot, j'utilise toujours == lorsque vous utilisez la commande if. (Par exemple: if "19"=="3" echo My computer doesnt know maths)

Et pour tous les autres (LSS, LEQ, NEQ, etc.)? N'y a-t-il pas quelque chose comme != pour NEQ, ou est-ce que je pense à Unix?

La raison pour laquelle je veux utiliser des symboles est parce que je pensais que quelqu'un avait dit que le texte ou les chiffres étaient plus efficaces que l'utilisation des variantes de texte.

Quoi qu'il en soit, j'aimerais toujours savoir. Merci.

7

Les opérateurs de raison comme > ne sont pas utilisés parce qu'ils ont des significations spéciales dans les scripts Shell. Le > est utilisé pour rediriger la sortie; < utilisé pour rediriger l'entrée, etc.

Le documentation de Microsoft , répertorie les opérateurs suivants:

Operator | Description
EQU      | equal to
NEQ      | not equal to
LSS      | less than
LEQ      | less than or equal to
GTR      | greater than
GEQ      | greater than or equal to

De plus, le mot not est utilisé pour annuler une condition.

La raison pour laquelle je veux utiliser des symboles est parce que je pensais que quelqu'un avait dit que le texte ou les chiffres étaient plus efficaces que l'utilisation des variantes de texte.

Ils faisaient probablement référence à bash et ses grand catalogue d'opérateurs. Il fournit différents opérateurs pour les opérandes entiers et chaînes.

9
Burhan Khalid

La commande interne de Windows [~ # ~] si [~ # ~] n'a par défaut que deux opérateurs:

  1. == qui exécute une chaîne comparaison des deux arguments sur l'égalité, c'est-à-dire utilisez strcmp avec la condition étant true sur strcmp retournant 0.
  2. not en combinaison avec == pour inverser le résultat de la comparaison de chaînes sur l'égalité, c'est-à-dire que la condition est vraie si les deux chaînes comparées sont pas égal.

Ainsi, la ligne de commande:

if "19"=="3" echo My computer doesn't know maths

exécute strcmp avec les chaînes "19" et "3" ce qui signifie que les flux d'octets comparés sont hexadécimaux 22 31 39 22 00 et 22 33 22 00. Les guillemets doubles ne sont pas supprimés avant d'exécuter la comparaison de chaînes. Ils sont inclus dans la comparaison des chaînes.

Une aide pour la commande [~ # ~] si [~ # ~] est généré lors de l'exécution dans une fenêtre d'invite de commandes, la commande if /?. Cette aide explique toutes les options et opérateurs supplémentaires qui peuvent être utilisés si les extensions de commande sont activées par défaut.

Il y a l'option /I pour comparer les deux arguments insensibles à la casse en utilisant stricmp au lieu de strcmp.

Exemple:

if /I not "%~1" == "/I" echo First argument is neither /i nor /I.

Et avec les extensions de commandes activées, il y a les opérateurs de comparaison supplémentaires: EQU, NEQ, LSS, LEQ, GTR, GEQ

Les équerres < et > sont utilisés sur la ligne de commande Windows comme opérateurs de redirection . Ils ne peuvent donc pas être utilisés comme opérateurs de comparaison dans une condition [~ # ~] si [~ # ~] . Point d'exclamation également ! n'est pas disponible en tant qu'opérateur car cela signifie le début/la fin d'une référence de variable d'environnement lorsque l'extension des variables d'environnement est activée. Courir set /? et setlocal /? et endlocal /? pour plus de détails sur l'expansion retardée des variables d'environnement.

L'interpréteur de commandes Windows essaie de convertir les deux chaînes d'arguments en entiers 32 bits signés en utilisant strtol avec base 0 (détection automatique de la base) lors de l'utilisation de EQU, NEQ, LSS, LEQ, GTR, GEQ. Une comparaison entière est effectuée si cela réussit pour les deux chaînes d'argument car les deux chaînes comparées sont des nombres décimaux ou des nombres hexadécimaux commençant par 0x ou nombres octaux commençant par 0. Sinon, les deux chaînes d'arguments sont à nouveau comparées avec strcmp et l'opérateur de comparaison est appliqué au résultat entier de cette fonction.

La conversion des deux arguments de chaîne en entiers signés 32 bits nécessite des instructions supplémentaires du processeur (quelques nanosecondes ou microsecondes selon les performances du processeur). Une comparaison entière est donc un peu plus lente, mais pas vraiment plus lente.

Exemples:

if 014 EQU 12 echo Octal number 014 is equal decimal number 12.
if 0x0C EQU 12 echo Hexadecimal number 0C is equal decimal number 12.
if /I 0X0C EQU 014 Hexadecimal number 0C is equal octal number 014.

L'option /I est ignoré lors de l'utilisation d'un opérateur de comparaison autre que == et les deux chaînes se composent uniquement de chiffres numériques, le premier caractère pouvant également être un trait d'union interprété comme signe moins. Cela est prouvé par la troisième ligne ci-dessus.

Si l'un des deux arguments est placé entre guillemets sur l'utilisation de EQU, NEQ, LSS, LEQ, GTR, GEQ, ou l'une des deux chaînes n'est pas une chaîne représentant un nombre entier, la comparaison est toujours effectuée avec l'utilisation de strcmp ou stricmp selon l'utilisation de /I. strcmp et stricmp renvoient tous les deux un entier comme résultat qui peut être un nombre négatif, zéro ou un nombre positif. Ce résultat entier est comparé à la valeur entière 0 selon l'opérateur utilisé.

Exemples:

if 010 NEQ "10" echo String 010 is not equal string "10".
if "100" LSS "20" echo String "100" is less than string "20".

Le deuxième caractère 1 sur le côté gauche a une valeur de code inférieure (49 = 0x31) comme deuxième caractère 2 sur le côté droit (50 = 0x32), ce qui se traduit par strcmp renvoyant une valeur négative résultant en function result LSS 0 être vrai.

Veuillez noter que les variables d'environnement Windows sont toujours de type chaîne et doivent toujours être converties de chaîne en entier en utilisant la comparaison d'entiers ou l'arithmétique d'entiers.

Il est conseillé dans la plupart des cas d'utiliser string1 == string2 ou not string1 == string2 au lieu de string1 EQU string2 ou string1 NEQ string2 en comparant deux chaînes ne représentant pas des valeurs entières à utiliser directement strcmp ou stricmp. Sinon, lors de la comparaison de chaînes avec EQU ou NEQ, seules quelques nanosecondes ou microsecondes sont perdues en laissant le processeur de commandes Windows utiliser d'abord strtol qui ne parvient pas à convertir l'une des deux chaînes à comparer et donc cmd.exe s'exécute ensuite strcmp ou stricmp comme cela se ferait immédiatement lors de l'utilisation de l'opérateur ==.

Un fait plus important:

Une chaîne au lieu d'une comparaison entière lors de l'utilisation des comparateurs EQU, NEQ, LSS, LEQ, GTR, GEQ est traité par cmd.exe à l'exécution de [~ # ~] si la condition [~ # ~] uniquement dans le cas où l'un des deux arguments contient un caractère non valide. Une comparaison entière est néanmoins effectuée sur une condition hors plage comme un argument est inférieur à -2147483648 ou supérieur à 2147483647 comme discuté à résultats étranges avec IF .

La limitation de la plage de valeurs peut être contournée en comparant deux valeurs en tant que chaînes sur lesquelles les deux chaînes de valeurs ont le même nombre de chiffres. Voici un exemple pour savoir si un fichier en a deux ou plus GiB , c'est-à-dire que la taille du fichier est 2147483648 ou plusieurs octets.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if "%~1" == "" ( set "FileName=%~f0" ) else set "FileName=%~1"
for %%I in ("%FileName%") do set "FileSize=000000000000000%%~zI"
if "%FileSize:~-16%" GEQ "0000002147483648" (
    echo "%FileName%" is greater or equal 2 GiB.
) else echo "%FileName%" is less than 2 GiB.
endlocal
pause

La taille du fichier dont le nom est transmis au fichier de commandes est affectée à la variable d'environnement FileSize sous forme de chaîne avec toujours au moins 15 chiffres zéro supplémentaires au début.

Et ensuite, la chaîne FileSize est comparée avec les 16 derniers chiffres à la chaîne 0000002147483648 représentant 2 GiB en octets. strcmp compare les deux chaînes de longueur égale octet par octet, chaque octet des deux chaînes comparées ne pouvant avoir que les valeurs hexadécimales 0x30 à 0x39 . strcmp renvoie immédiatement une valeur négative si l'octet actuel de la chaîne de gauche est inférieur à l'octet actuel de la chaîne de droite, ce qui signifie que la taille du fichier est inférieure à 2 Gio. strcmp renvoie immédiatement avec un valeur positive si l'octet actuel de la chaîne de gauche est supérieur à l'octet actuel de la chaîne de droite, ce qui signifie que la taille du fichier est supérieure à 2 Gio. strcmp les retours avec zéro sur les deux chaînes sont identiques à 100%, ce qui signifie que le fichier la taille est exactement de 2 Gio.

Veuillez noter que la comparaison de valeurs à l'aide d'une comparaison de chaînes nécessite que les deux valeurs aient le même nombre de chiffres pour un résultat précis. La chaîne de valeur avec moins de chiffres doit être ajoutée avec la bonne quantité de 0.

6
Mofi