Detecta un cambio en la cantidad de archivos o carpetas

1

Se supone que el siguiente script verifica si la cantidad de archivos y carpetas ha cambiado desde la última vez que se ejecutó el archivo por lotes. Si es así, imprime un mensaje y actualiza los recuentos.

Lamentablemente no funciona del todo. Creo que tengo un problema con las ifdeclaraciones en mis comparaciones de cadenas.

¿Alguien sabe cómo puedo hacer que el script funcione?

@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

Editar:

Después @ sugerencia de Rik traté de retirar el espacio antes >de
echo %filecountb%>"countfile.log"y echo %dircountb%>"countdir.log"pero eso no funcionó en mi sistema operativo. La solución fue agregar una TRIMfunción para eliminar los espacios después de leerlos de los archivos de 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
Rui Branco
fuente

Respuestas:

2

Si coloca un eco antes de las declaraciones if, verá dónde está el error:

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

Este es el resultado que obtuve con el eco:

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

Sus aresultados tienen espacios detrás de ellos (los que lee de los archivos de registro).

Si cambia su rutina de guardar para hacer eco de la variable sin el espacio anterior, >entonces funcionará:

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

Resultado:

if NOT "10" == "10" goto :news
if NOT "22" == "22" goto :news
no news
Press any key to continue . . .
Rik
fuente
editado 1 publicación con solución
Rui Branco
@RuiBranco Mmm, extraño que eliminar el espacio antes >no funcionó para ti (para mí sí, bajo Windows 7). Usted no tiene que ejecutar dos veces antes de poder ver el efecto debido a sus existentes .logs todavía tenían espacios en ella. Pero su TRIMfunción también funcionará.
Rik
1

Pruebe NEQ en lugar de NOT y ==

ver: http://ss64.com/nt/if.html

sahmeepee
fuente
La parte esencial que intentaba elegir era probar NEQ en lugar de ==
sahmeepee
1
Ah, perdón, mi error.
ChrisF
No hay problema ... Mi respuesta fue sin duda demasiado breve y creo que Rik lo ha clavado de todos modos: /
sahmeepee