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

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 . . .

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.