#include  // fce Sleep(seconds)#include  CMD tools

CMD tools ~ Dashův web(log)

Dashův web(log)

CMD tools

06.11. 2009 napsal(a) Petr v kategorii programování, skriptování a správa

Obsah článku

Před časem jsem se rozhodl sepsat si utilitku, která by rozšířila možnosti interních aplikací systému Windows. Současná verze přidává aplikaci shutdown možnost načasovat odhlášení, hibernaci, restart i vypnutí. Čas zbývající do konce je indikován pomocí ukazatele a proces lze kdykoliv přerušit. Pro zájemce přikládám zdrojový kód této „C++ Win32 konzolové aplikace (měla by být po zkompilování funkční na všech verzích MS Windows).

/*
    Autor: Petr Knap (kontakt@petrknap.cz)
    Web: http://petrknap.cz
    OS: MS Windows
    Verze:
        06/11/2009: 0.1.0 - shutdown
        08/11/2009: 0.2.0 - timer
        12/11/2009: 0.3.0 - debug mode
        12/11/2009: 0.3.1 - opraveny textove hlasky
        15/11/2009: 0.3.2 - vylepseny debug mode
*/
#include "stdafx.h"
#include <conio.h>
#include <windows.h> // fce Sleep(seconds)
#include <time.h>
#define CLS   {system("cls");}
#define TITLE {printf("\t\tCMD tools\n\n");}
#define    DEBUG 1
char mode;
char a[256] = "";
void wait(int t, bool print);
void timer(void);
int shutdown(void);
// hlavni menu
int main(void)
{
    CLS
    TITLE

    shutdown();

#if DEBUG
    getch();
#endif
    return 0;
}
// FCE pro vypnuti PC
int shutdown(void)
/*
    i - GUI
    l - odhlaseni
    s - vypnuti
    r - restart
    h - hibernace
    f - vynucene ukonceni aplikaci
*/
{
    bool f;

start:
    CLS
    TITLE

    // menu
    printf("Zvolte akci:\n");
    printf("\tl - odhlaseni\n");
    printf("\tr - restartovani\n");
    printf("\th - hibernace (tvrdy spanek)\n");
    printf("\ts - vypnuti\n");
    mode = getch();

    // shutdown
    printf("\n");
    switch(mode)
    {
        case 'l':
            sprintf(a, "odhlaseni");
            f = true;
            break;
        case 'r':
            sprintf(a, "restartovani");
            f = true;
            break;
        case 'h':
            sprintf(a, "hibernace");
            f= false;
            break;
        case 's':
            sprintf(a, "vypnuti");
            f = true;
            break;
        default:
            goto start;
            break;
    }
    printf("\n");
    timer();
    sprintf(a, "start shutdown /%c", mode);
    if(f) sprintf(a, "%s /f", a);
#if DEBUG
    printf("%s\n",a);
#else
    system(a);
#endif

    // konec
    return 0;
}
// FCE pro cekani (cas, tisk)
void wait(int t, bool print)
{
    int d = 60; // pocet dilku ukazatele

    if(print)
    {
        printf("["); // tisk sablony ukazatele
        for(int i = 0; i < d; i++)
            printf(" ");
        printf("]\b");
        for(int i = 0; i < d; i++)
            printf("\b"); // navrat na zacatek ukazatele
    }
    else
        d = 1;

    for(int i = 0; i < d*3; i++)
    {
        Sleep((unsigned int)((float)t/d/3*1000)); // uspani na dobu jednoho dilku
        if(print)
        {
            switch(i%3) // vyplnovani ukazatele
            {
                case 0:
                    printf("-\b");
                    break;
                case 1:
                    printf("+\b");
                    break;
                case 2:
                    printf("#");
                    break;
            }
        }
    }
    if(print)
    {
        printf("]\n"); // uzavreni ukazatele
    }
}
void timer(void)
{
    int t, th, tm, ts;
#if DEBUG
    time_t start,end;
    double dif;
#endif
    printf("Zadejte cas do %s [h:m:s]: ", a);
    scanf("%d:%d:%d",&th,&tm,&ts);
    t = ts + tm*60 + th*60*60;
    printf("\nPro zruseni %s stisknete CTRL+C.\n", a);
#if DEBUG
    time(&start);
#endif
    wait(t, true);
#if DEBUG
    time(&end);
    dif = difftime (end,start);
    printf("Proces trval %.2lf sekund.\n", dif);
#endif
}

Pokud byste měli nápad jak něco zlepšit, napište. V opačném případě se sem sem tam koukněte. Za určitý čas se tu objeví další verze a pokud bude dobře fungovat, přidám sem i zkompilovaný program. Pokud nechcete čekat, aplikaci si můžete zkompilovat sami například v MS Visual Studiu.

  • Položky označené takto jsou povinné.
  • Na e-mailovou adresu bude zaslán odkaz pro potvrzení komentáře.
    Pokud Vám potvrzovací e-mail nedorazí do 24 hodin, zkontrolujte si nevyžádanou poštu (SPAM).
  • E-mailová adresa nebude zveřejněna.
  • URL adresa webu bude možná zveřejněna v menu.