3 votes

Exécuter script en dehors des heures de début et de fin dans le langage de programmation C sur la plate-forme Windows

Introduction

J'ai un script que je crée lorsque les enfants se connectent à leurs ordinateurs dans le cadre de mon domaine personnel. Le script vérifie l'heure actuelle et, si elle est en dehors de l'heure de début et de fin, il éteint l'ordinateur automatiquement.

Le script en C

Le script que j'ai jusqu'à présent est le suivant ;

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[])
{  
    int i;
    char current_time[100];
    char *start;
    char *finish;

    if(argc>=2)
    {
        for(i=0;i<argc;i++)
        {

            if(strcmp(argv[i],"-s") == 0) 
            {
                start = argv[i+1];         
            }
            else if (strcmp(argv[i],"-f") == 0) 
            {
                finish = argv[i+1];
            }

        }
    }       

    time_t curr_time_value = time( NULL );
    strftime(current_time, 100, "%T", localtime(&curr_time_value));

    if(current_time < start && current_time > finish)
    {
        system("shutdown /s /t 0");
    }
    else
    {
        printf("%s\n", current_time);     
    }

    return 0;
}

Le problème

La partie du script qui me pose problème est la comparaison du temps ;

if(current_time < start && current_time > finish)
{
    system("shutdown /s /t 0");
}

Je comprends que le script est une chaîne et, à ma connaissance, il n'est pas possible de comparer deux chaînes de cette manière, comme dans lower than ou greater than. Mais ce que je dois faire, c'est changer ces valeurs en int afin d'utiliser ce type de comparaison.

Je cherchais des conseils sur la façon de procéder pour faire fonctionner cette comparaison script. J'ajouterai une boucle while à l'avenir pour lancer plusieurs fois le script afin de m'assurer que l'ordinateur s'éteint.

Ce que j'ai essayé

J'ai essayé d'autres scripts tels que powershell et des fichiers batch avec des tâches planifiées mais ce n'est pas fiable. Les enfants démarrent simplement leurs machines et se reconnectent ensuite. Donc, étant donné le peu de temps dont je dispose, j'ai besoin d'une méthode plus infaillible, ce qui m'amène ici.

Jean-François Fabre Fix

time_t curr_time_value = time( NULL ); 
strftime(current_time, 100, "%H:%M", localtime(&curr_time_value));

if(strcmp(current_time,start) < 0 || strcmp(current_time,finish) > 0)
{
    system("shutdown /s /t 0");
}

1voto

Jean-François Fabre Points 94672

Vous pourriez utiliser un format "pseudo-ISO" pour votre chaîne :

strftime(current_time, 100, "%H:%M", localtime(&curr_time_value));

qui génère quelque chose comme 20:59 o 09:00 (zéro rembourré) (note : je n'ai pas pu faire de %T fonctionne sur ma machine Windows, il génère juste une chaîne vide, d'ailleurs je suppose que vous n'avez pas besoin des secondes)

Dans ce cas, si vos arguments respectent ce format, la comparaison de chaînes fonctionne correctement, mais vous devez corriger votre condition :

  • il doit utiliser || parce que l'arrêt se produit dans l'une ou l'autre des conditions, et non dans les deux en même temps
  • il doit utiliser strcmp sinon vous comparez les pointeurs et le comportement est indéfini/n'est pas celui que vous souhaitez

fixer :

if (strcmp(current_time,start) < 0 || strcmp(current_time,finish) > 0)

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