giovedì 19 luglio 2012

MS-DOS gestire i ritardi

POST AGGIORNATO
Spesso negli script è comodo gestire un ritardo di un tempo definito tra un comando e l'altro.

Da Win Vista (e quindi Wins 2003 server) in poi è possibile utilizzare il comando timeout:
C:\Documents and Settings\mprocida>timeout /?

TIMEOUT [/T] timeout [/NOBREAK]

Description:
    This utility accepts a timeout parameter to wait for the specified
    time period (in seconds) or until any key is pressed. It also
    accepts a parameter to ignore the key press.

Parameter List:
    /T        timeout       Specifies the number of seconds to wait.
                            Valid range is -1 to 99999 seconds.

    /NOBREAK                Ignore key presses and wait specified time.

    /?                      Displays this help message.

NOTE: A timeout value of -1 means to wait indefinitely for a key press.

Examples:
    TIMEOUT /?
    TIMEOUT /T 10
    TIMEOUT /T 300 /NOBREAK
    TIMEOUT /T -1

Ma sui sistemi più "antichi" tale comando non era ancora stato implementato.
Molti si affidavano a degli eseguibili esterni di tipo delay.exe ma io non ho mai amato affidarmi a risorse esterne perché non sempre le avevo a disposizione e perché in realtà sapere cosa fanno esattamente può essere un bel mistero da svelare.

Per risolvere tali problemi mi sono sempre affidato al comando ping.
Eseguendo una riga di tipo "ping -n 300 127.0.0.1>nul" riuscivo ad avere un ritardo di 5 minuti (300 secondi) tra la riga precedente e la successiva, il tutto senza sporcare un eventuale file di log.
Il comando ping, di default, invia 5 pacchetti ICMP di 64 byte ogni secondo al server di destinazione facendo vedere l'output di ogni invio a video.
Nel mio esempio vengono inviati 300 pacchetti da 64 byte ogni secondo a se stessi (ricordiamoci che 127.0.0.1 per default è localhost) senza fa vedere nulla a video (>nul).

Ho sempre trovato questa soluzione comoda, veloce, leggera e "già pronta" su tutti i sistemi, fino a che mamma Microsoft non ha deciso di implementare il comando timeout.