2017-10-14 2 views
0

J'ai essayé de comparer la date actuelle d'être égal à une date spécifique en utilisant ce code:Pourquoi la comparaison d'une valeur de variable d'environnement avec une chaîne entraîne-t-elle un message d'erreur?

@echo on 
if %date%=="Sun 10/15/2017" (echo "Today is Sunday") else (echo "Today is Unknown") 
pause 

Mais sur l'exécution du fichier batch je reçois le message d'erreur juste sortie:

10/15/2017 == "Dim 10/15/2017" était inattendu en ce moment.

Quelle est la cause de cette erreur?

+2

Nichie, s'il vous plaît mettre à jour [votre dernière question] (https://stackoverflow.com/q/46744276/6738015) avec la solution que vous avez trouvé, et publiez aussi les informations demandées dans [la question précédente] (https://stackoverflow.com/a/46743856/6738015) aussi! Les membres hésitent souvent à fournir des réponses à ceux qui ne respectent pas les demandes raisonnables. En réponse à cette question, vous n'avez pas trouvé les doubles quotes de chaque côté de la comparaison et nous n'avons aucune idée du format de votre '% date%' variable! – Compo

+1

Vous avez des guillemets d'un côté de la comparaison pour protéger les espaces. Pourquoi pensez-vous que vous n'en auriez pas besoin de l'autre côté? – Squashman

Répondre

1

L'environnement date référence variable %date% est remplacé par interpréteur de commandes de Windows pendant l'état de pré-traitement par la région (pays) chaîne dépendante avant la commande IF est exécutée du tout.

sur l'exécution du fichier de commandes à partir d'une invite de commande, on peut voir que la ligne de commande IF est après traitement préalable:

if Sun 10/15/2017=="Sun 10/15/2017" (echo "Today is Sunday") else (echo "Today is Unknown") 

Ainsi, la syntaxe de commande IF est incorrect après l'environnement expansion de variable car il y a Sun comme premier argument, un espace et Sun 10/15/2017=="Sun 10/15/2017" étant interprété comme un opérateur inattendu.

Chaque fois que vous comparez des chaînes, il est recommandé d'utiliser des guillemets, car le caractère espace n'est pas interprété comme un séparateur d'argument. Et les caractères &()[]{}^=;!'+,`~|<> sont également interprétés en tant que caractères littéraux dans une chaîne entre guillemets doubles.

Les guillemets sont également comparés par IF lors de l'exécution de la comparaison de chaîne. Il est donc nécessaire que les deux chaînes comparées soient placées entre guillemets.

@echo off 
if "%DATE%"=="Sun 10/15/2017" (echo "Today is Sunday.") else (echo "Today is unknown.") 
pause 

Une autre solution si la date dépend de la région contient également le jour de la semaine abrégé.

@echo off 
if not "%DATE:Sun=%"=="%DATE%" (echo "Today is Sunday.") else (echo "Today is unknown.") 
pause 

Ce fichier batch compare la chaîne de date avec toutes les occurrences insensibles à la casse de Sun remplacés par rien avec la chaîne de date non modifiée. La substitution de chaîne est réussie uniquement sur la chaîne de date contenant l'abréviation de jour de la semaine Sun et dans ce cas, les deux chaînes comparées ne sont pas égales.

Sur mon ordinateur le IF condition est jamais vrai que %DATE% déplie sur une chaîne de date ne contenant pas de jour de la semaine selon la configuration dans la région de Windows et Langue paramètres. Pour comprendre les commandes utilisées et leur fonctionnement, ouvrez une fenêtre d'invite de commande, exécutez les commandes suivantes et lisez attentivement toutes les pages d'aide affichées pour chaque commande.

  • echo /?
  • if /?
  • set /?