Rileva una modifica nel numero di file o cartelle


1

Lo script seguente dovrebbe verificare se il numero di file e cartelle è cambiato dall'ultima volta che è stato eseguito il file batch. In tal caso, stampa un messaggio e aggiorna i conteggi.

Sfortunatamente non funziona del tutto. Penso di avere un problema con le ifistruzioni nei miei confronti di stringhe.

Qualcuno sa come posso far funzionare la sceneggiatura?

@echo off

::Check number of dir's and files in last run    
set /p filecounta=<"countfile.log"
set /p dircounta=<"countdir.log"

::Check number number of dir's and files currently
for /f %%A in ('dir /a-d-s-h /b ^| find /v /c ""') do set filecountb=%%A
for /d %%G in (*) do set /a dircountb=dircountb+1

::Compares the number of counts in the past with the present
if not "%filecountb%"=="%filecounta%" goto :news
if not "%dircountb%"=="%dircounta%" goto :news

CALL :save
echo no news
pause
exit

:news
CALL :save
echo news
pause
exit

:: Subs

:: Put number of dir and files in log file
:save
echo %filecountb% >"countfile.log"
echo %dircountb% >"countdir.log"
GOTO:EOF

Modificare:

Dopo @ suggerimento di Rik Ho provato a rimuovere lo spazio prima >di
echo %filecountb%>"countfile.log"e echo %dircountb%>"countdir.log", ma che non ha funzionato nel mio sistema operativo. La soluzione stava aggiungendo una funzione TRIMper rimuovere gli spazi dopo averli letti dai file di registro.

::Check number of dir's and files in last run    
set /p filecounta=<"countfile.log"
set /p dircounta=<"countdir.log"
CALL :TRIM %filecounta% filecounta
CALL :TRIM %dircounta% dircounta

.
.
.

:TRIM
SET %2=%1
GOTO :EOF

Risposte:


2

Se inserisci un'eco prima delle istruzioni if, vedrai dove si trova l'errore:

echo if NOT "%filecountb%" == "%filecounta%" goto :news
echo if NOT "%dircountb%" == "%dircounta%" goto :news
if NOT "%filecountb%" == "%filecounta%" goto :news
if NOT "%dircountb%" == "%dircounta%" goto :news

Questo è il risultato che ho ottenuto con l'eco:

if NOT "10" == "10 " goto :news
if NOT "22" == "22 " goto :news
news
Press any key to continue . . .

I tuoi arisultati hanno spazi dietro di loro (quelli che leggi dai file di registro).

Se cambi la routine di salvataggio per fare eco alla variabile senza spazio prima, >allora funzionerà:

:save
echo %filecountb%>"countfile.log"
echo %dircountb%>"countdir.log"

Risultato:

if NOT "10" == "10" goto :news
if NOT "22" == "22" goto :news
no news
Press any key to continue . . .

modificato 1 post con soluzione
Rui Branco

@RuiBranco Mmm, strano che rimuovere lo spazio prima >non ha funzionato per te (per me lo fa, sotto Windows 7). Si fa necessario eseguire due volte prima di poter vedere l'effetto perché i vostri esistenti .logs avevano ancora gli spazi in esso. Ma funzionerà anche la tua TRIMfunzione.
Rik,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.