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
- in attivazione scegliere "All'avvio del sistema"
- nella azioni creare una nuova azione con
- Operazione: Avvio Programma
- Programma o Script c:\doveHoSalvatoIlBat\script.bat
- Aggiungi argomenti: start
- 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:
- Registro: sistema
- Origine: user32
- Id Evento 1074
Si possono poi creare altre azioni con
- Alla disconnessione della sessione utente locale
- Alla disconnessione della sessione utente RDP
per tutte le attivazioni previste corrisponde l'azione:
- Operazione: Avvio Programma
- Programma o Script c:\doveHoSalvatoIlBat\script.bat
- Aggiungi argomenti: stop
- 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