Batch file in windows


Log Start and Stop in windows

Il processo si basa su un semplice gile .bat lanciato dallo sheduler di windows. Il Bat contiene poche righe di comand che scrivono su un file di log (download esempio)

@echo off
rem ==================
rem log Start and Stop
rem VERSIONE=1.0
rem ==================

rem *********************************************
rem EQU      equal to
rem NEQ     not equal to
rem LSS     less than
rem LEQ     less than or equal to
rem GTR     greater than
rem GEQ     greater than or equal to
rem Comparison operators
rem *********************************************

rem *********************************************
rem NOTE sull'espansione delle variabili di ambiente
rem
rem %VAR% espande una variabile di ambiente
rem la prossima riga ritarda l'espansione delle variabil
rem setlocal EnableDelayedExpansion
rem !var! invece esegue immediatamente l'espansione
rem *********************************************

rem controlla i parametri

setlocal EnableDelayedExpansion

set LOG="c:\Logs\StartStop.log"

rem For /F "tokens=1,2,3 delims=/ " %%A in ('Date /t') do @(
rem    Set Day=%%A
rem    Set Month=%%B
rem    Set Year=%%C
rem    Set All=%%C%%B%%A
rem )

set DATA=%date%
set ORA=%time%

@if %1*==start* (
    set CMD=Start
    goto ALLORAVAI
)

@if %1*==stop* (
    set CMD=Stop
    goto ALLORAVAI
)

set CMD=Errore:%1

:ALLORAVAI
echo %CMD%, %DATA%, %TIME% >> %LOG%

type %LOG%
rem EOF STARTSTOP.BAT

questo bat deve essere lanciato con start o stop come parametri in linea di comando. Dallo scheduler di windows abbiamo a disposizione tutte le opzioni per avviarlo alla partenza ed allo spegnimento del PC.

La partenza è pià semplice perchè c'e' l'evento previsto; creare un nuov evento con
  1. Programma o Script c:\doveHoSalvatoIlBat\script.bat
  2. Aggiungi argomenti: start
  3. Inizio c:\doveHoSalvatoIlBat\   (ovvero il percorso
Per l'arresto le cose sono leggermente più complesse perchè manca una voce selezionabile quindi occorre creare una voce più complessa con:
Al verificarsi di un evento (evento di Base) e scegliere:
Si possono poi creare altre azioni con
per tutte le attivazioni previste corrisponde l'azione:
  1. Programma o Script c:\doveHoSalvatoIlBat\script.bat
  2. Aggiungi argomenti: stop
  3. Inizio c:\doveHoSalvatoIlBat\   (ovvero il percorso
Nel riquadro generale ricordarsi di selezionare "Esegui con privilegi elevati" ed "Esegui indipendentemente dalla connessione degli utenti"


Salvare il direttorio corrente

for /f "usebackq" %%i in (`cd`) do set CURDIR=%%i
echo %CURDIR%

cicli FOR

il ciclo FOR supporta i nomi nella sintassi 8.3 a meno che ci sia un'istruzione "LFNFOR ON" che abilita il supporto dei nomi lunghi

FOR %%F IN ("c:\miodir\*.txt") DO ECHO.%%F


With LFNFOR ON, this ECHOes long forms of the TXT file names ("quote" path or name if it contains  Space s). Only the first file found will include the path c:\my src, however. For any further files found, only the bare name (not the folder) is returned.


FOR (IN DO, repeat command on files, or strings)

for %%f in (*.txt) do type %%f

per ogni file (non nascosto o di sistema) con estensione txt nel direttorio corrente eseguo il comando type" del file (visualizza)

for %%n in (uno due tre) do echo.%%n

per tutte le parole elencate esegue in comando echo quindi ha l'effetto di tre echo separati

for %%n in (uno due) do echo.%%n>>F.TXT

esegue due echo separati ridiretti sul file F.TXT quindi ha l'effetto di appendere (>>)due linee una per ogni parola

for %%s in ("one two three") do echo.%%s

"one two three" sono trattati come singola stringa quindi si comporta come il semplice echo

la metavariabile %%v può assumere qualsiasi carattere. Nei file batch viene usato il formato %% mentere nel modo immediato da linea di comando si usa il modo abbreviato %

LFNFOR

LFNFOR (uso del Long File Names con il comando FOR)

LFNFOR ON

SET

SET SRC=C:\BKTEST
assegna un valore alla variabile SRC

IF EXIST

C:>if exist *.bat dir /oen /b
miobat1.bat
miobat2.bat

elenca il contenuto del direttorio solo se ci sono dei bat

START /WAIT

start /wait switch ferma l'esecuzione di un bat fino a quando non è partito e terminato un programma grafico in GUI. Il comando START ritorna l'ERRORLEVEL al bat di partenza se il programma gui lo gestisce!.

esempio: start /wait programmaGUI.exe /switch Par1 Par2
esempio:
start /wait "C:\Program Files\ProgrammaGUI.exe" /switch Par1 Par2

ESEMPIO BAT DI GESTIONE DEI BACKUP

download script in formato txt  o scaricare esempi completi di un'applicazione

N.B. gmail.exe è un programma proprietario per l'invio di mail scritto da me

@rem Salvataggio Office per date
@rem aggiornato al 30/03/2016

@rem salva
@rem - d:\DATI\
@rem - d:\PRIVATI\
@rem - d:\MEDIAZIONE\

@Setlocal EnableDelayedExpansion

@rem by Andrea 30/3/2016
@rem ----------------------------------------------------------------------
@rem Partendo dalla data di sistema estrae le variabili DAY, MONTH ed YEAR
@rem calcola poi la settimana in cui mi trovo WOM range 1-5
@rem ed infine il giorno della settimana DOW range 1-7
@rem assegna anche EOM e EOW se sono alla fine della settimana e del mese
@rem ----------------------------------------------------------------------

@For /F "tokens=1,2,3 delims=/ " %%A in ('Date /t') do @(
   Set DAY=%%A
   Set MONTH=%%B
   Set YEAR=%%C
)

@rem %TM:~0,1% si legge come il primo carattere ovvero da OFFSET 0 per 1 Carattere
@rem è la correzione per eliminare lo 0 in testa alle date

@set TM=%MONTH%
@set TM=%TM:~0,1%
@if %TM% == 0 ( set /a NMONTH=%MONTH:~1,1% ) else ( set NMONTH=%MONTH%)

@set TM=%DAY%
@set TM=%TM:~0,1%
@if %TM% == 0 ( set /a NDAY=%DAY:~1,1% ) else ( set NDAY=%DAY%)

@Set /a  WEEK = ( NDAY - 1 ) / 7
@Set /a  DOW = %NDAY% - ( %WEEK% * 7 )

@rem --- controlla fine mese e fine settimana
@set EOW=0
@set EOM=0
@if %DOW% == 7 ( Set EOW = %WEEK%)
@for %%A in (11 4 6 9)        do @if %NMONTH% == %%A ( if %NDAY% == 31 ( set EOM=%NMONTH%) )
@for %%A in (1 3 5 7 8 10 12) do @if %NMONTH% == %%A ( if %NDAY% == 30 ( set EOM=%NMONTH%) )
@for %%A in (2)               do @if %NMONTH% == %%A ( if %NDAY% == 28 ( set EOM=%NMONTH%) )

@echo DAY(%DAY%) MONTH(%MONTH%) WEEK(%WEEK%)  DOW(%DOW%)  End Of Month EOM(%EOM%)  End Of Week EOW(%EOW%)
@rem ----------------------------------------------------------------------

@set SRC=\\192.168.200.2
@set TRG=\\192.168.200.3\Zip
@set PRG=\\127.0.0.1\Manutenzione\AggiornaPL\7z.exe
@set LOG7Z=\\192.168.200.3\Zip\Log\log-7z.txt
@set LOGFILE=\\192.168.200.3\Zip\Log\log.txt
@set LOGMAIL=\\192.168.200.3\Zip\Log\log-mail.txt
@set TOEML="<andrea.sommaruga@gmail.com>"
@set BODY=Vedi Log allegato:%LOG7Z%
@set SUBJECT=ColGeoMB_Backup_Giornalieri_QNAP-zip

@echo %DATA% >%LOG7Z%

@del smtp-??.log

@call :ZIPPONE PRIVATI
@call :ZIPPONE MEDIAZIONE
@call :ZIPPONE DATI

@if !ERRORE!A == A (   @set MSG=OK: ) else ( @set MSG=!ERRORE! )
@echo %MSG% %DATA% >>%LOGFILE%
gmail.exe %TOEML% "%MSG% %SUBJECT%"  "%BODY%"  "%LOG7Z%" >> %LOGMAIL%

@goto FINE

:ZIPPONE
    @set BKUPSRC=%SRC%\%1\*.doc* %SRC%\%1\*.xsl* %SRC%\%1\*.pdf
    @set BKUPFILE=%TRG%\%1\%1-Day-%DOW%.7zippato
    @set BKUPWEEK=%TRG%\%1\%1-Week-%WEEK%.7zippato
    @set BKUPMONTH=%TRG%\%1\%1-Month-%MONTH%.7zippato

    %PRG% a -t7z "%BKUPFILE%" -r %BKUPSRC%   >>%LOG7Z%

    @if %ERRORLEVEL% == 0 (
        @echo OK;    %DATA%; %1 >>%LOGFILE%
    ) else (
        set ERRORE=!ERRORE! Errore in: %DATA%
        @echo ERROR; %DATA%; %1  >>%LOGFILE%
    )
    @if %EOW% GTR 0 copy %BKUPFILE% %BKUPWEEK%
    @if %EOM% GTR 0 copy %BKUPFILE% %BKUPMONTH%
@EXIT /B !ERRORLEVEL!

:FINE
@rem EOF Backup_QNAP_Giornalieri.bat

Per ulteriori informazioni si consiglia di leggere help set, help date ed help if dai prompt del dos
.

SECONDO ESEMPIO DI GESTIONE BAKUP SU DISCO IN READONLY

@echo off
rem ---------------------------------------------------------
rem Abilita disco Z in lettura/scrittura quindi lancia backup
rem Andrea versione 1.0 2/6/2016
rem ---------------------------------------------------------
set DEBUG=0


rem test administrator right
rem ------------------------
net session >nul 2>&1
if %errorLevel% NEQ 0 (
        echo ERRORE: richiede di essere eseguito con i permessi di amministratore
        echo --------------------------------------------------------------------
        pause
        goto STOP
    )


rem CREA script per diskpart
rem ------------------------
echo list volume > e:\diskpart-script.txt
echo EXIT >e:\diskpart-exit.txt

rem Cerca la label backupRO
rem -----------------------
start /min diskpart.exe
diskpart /s e:\diskpart-script.txt > e:\diskpart-output.txt

if %DEBUG% NEQ 0 (
    for /f "skip=8 tokens=2,4 delims= " %%a in (e:\diskpart-output.txt) do echo %%a %%b
    pause
    )

set NRVOL=0
for /f "tokens=2,4 delims= " %%a in (e:\diskpart-output.txt) do if /I %%b==backupRO set NRVOL=%%a
if %DEBUG% NEQ 0 (
   echo %NRVOL%
   pause
   )

if %NRVOL% NEQ 0 goto OKDISKFOUND

echo ----------------------------------------------------
echo ERRORE: non esiste una partizione con label backupRO
echo ----------------------------------------------------
pause
goto FINE

 
:OKDISKFOUND
  echo SELECT VOLUME %NRVOL%            >  e:\diskpart_enableRW.txt
  echo ATTRIBUTES VOLUME CLEAR READONLY >> e:\diskpart_enableRW.txt
  echo SELECT VOLUME %NRVOL%            >  e:\diskpart_disableRW.txt
  echo ATTRIBUTES VOLUME SET   READONLY >> e:\diskpart_disableRW.txt
   
  echo --------------------
  echo Abilito la scrittura
  echo --------------------
  diskpart /s e:\diskpart_enableRW.txt
  if %DEBUG% NEQ 0 pause
 
  echo start /min diskpart.exe               >  e:\diskpart_enableRW.bat
  echo diskpart /s .\diskpart_enableRW.txt   >> e:\diskpart_enableRW.bat
  echo taskkill /f /im diskpart.exe          >> e:\diskpart_enableRW.bat
  echo start /min diskpart.exe               >  e:\diskpart_disableRW.bat
  echo diskpart /s .\diskpart_disableRW.txt  >> e:\diskpart_disableRW.bat
  echo taskkill /f /im diskpart.exe          >> e:\diskpart_disableRW.bat
  copy e:\diskpart_enableRW.txt z:\
  copy e:\diskpart_disableRW.txt z:\
  copy e:\diskpart_enableRW.bat z:\
  copy e:\diskpart_disableRW.bat z:\

  echo ------------------
  echo .... fai il backup
  echo ------------------
  call D:\aggiornaPL\aggiorna_Backup-Z.bat
  pause
 
  echo -------------
  echo disabilita RW
  echo -------------
  diskpart /s e:\diskpart_disableRW.txt
  if %DEBUG% NEQ 0 pause

:FINE
diskpart /s e:\diskpart-exit.txt
if %DEBUG% NEQ 0 pause
:STOP
rem secca le istanze di diskpart
taskkill /f /im diskpart.exe

Deve essere eseguito con diritti di amministratore