checking consecutive dates

Discussion forum for all Windows batch related topics.

Moderator: DosItHelp

Post Reply
Message
Author
alo
Posts: 3
Joined: 14 Jul 2009 13:30

checking consecutive dates

#1 Post by alo » 15 Jul 2009 15:31

ok here's an interesting problem that i have an idea on how to solve but wanted to get some expert advice so i'll post it here...

i have a folder with 0 to thousands of subfolders where all the subfolders are exactly 10 characters long named YYYY-MM-DD (on the day it was created)

i'm trying to make a .bat file that will print names of subfolders that aren't consecutive.

in a simple example there would be a directory structure like

Code: Select all

-- DATA
  -- 2009-01-01
  -- 2009-01-02
  -- 2009-01-03
  -- 2009-01-05
  -- 2009-01-09
  -- 2009-01-10
  ...


and the batch file would loop through the folders in DATA\* and print something like

Code: Select all

  2009-01-04 missing
  2009-01-06 missing
  2009-01-07 missing
  2009-01-08 missing

ghostmachine4
Posts: 319
Joined: 12 May 2006 01:13

#2 Post by ghostmachine4 » 15 Jul 2009 20:04

here's a vbscript

Code: Select all

Set objFS = CreateObject("Scripting.FileSystemObject")
strFolder = "c:\test"
Dim ArrFolders()
i=0
Set objFolder = objFS.GetFolder(strFolder)
Go (objFolder)

Sub Go(objDIR)
  If objDIR <> "\System Volume Information" Then
    For Each eFolder in objDIR.SubFolders
       strFolderName = Replace(eFolder.Name,"-","")
       If InStr(strFolderName,"2009") > 0 Then
         ReDim Preserve ArrFolders(i)
         ArrFolders(i)=strFolderName
         i=i+1   
      End If
         Go eFolder
    Next

  End If 
End Sub
' sort folder datetime from earliest to latest
For t=LBound(ArrFolders) To UBound(ArrFolders)
    For n = (t + 1) To  UBound(ArrFolders)
        If ArrFolders(t) >= ArrFolders(n) Then
            temp = ArrFolders(n)
            ArrFolders(n) = ArrFolders(t)
            ArrFolders(t) = temp
        End If 
    Next
Next

For j=ArrFolders(LBound(ArrFolders)) To ArrFolders(UBound(ArrFolders))
   found=0
   For t=LBound(ArrFolders) To UBound(ArrFolders)
      If StrComp(ArrFolders(t),j) =0 Then
         found=1
         Exit For
      End If
   Next
   If found=0  Then
      WScript.Echo "Missing " & j
   End If
Next



save as missing.vbs and on command line

Code: Select all

C:\test>cscript /nologo missing.vbs
Missing 20090104
Missing 20090106
Missing 20090107
Missing 20090108

avery_larry
Expert
Posts: 391
Joined: 19 Mar 2009 08:47
Location: Iowa

#3 Post by avery_larry » 16 Jul 2009 19:45

Hmmm . . . I'd probably use a for loop on a dir ouput that's sorted alphabetically, converting the directory name to a julian date (using the date scripts on this site), and then compare to a simple incremented counter that starts with the first date and then output when the increment doesn't match the folder (and increment until it does match the folder).

That would assume the folder structure is exactly as you said, and it never deviates, and there's never any other folder in the list.


psuedo-code:

Code: Select all

setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%a in ('dir /on /b /s "path\to\folders"') do (
   for /f "tokens=1-3 delims=-" %%b in ("%%~a") do (
      set yr=%%b
      set /a mnth=100%%c %% 100
      set /a dy=100%%d %% 100
      call :setjuliandate !yr! !mnth! !dy! (I didn't look up the correct syntax)
      call :datecompare
   )
)
goto :eof

:setjuliandate
::This code can be found on this site somewhere.  Make sure to
::set the variable juliandate in this section
goto :eof

:datecompare
if not defined datecount (
   set /a datecount=%juliandate% + 1
   goto :eof
)
if not %datecount%==%juliandate% (
   call :findnormaldate %datecount%
   set /a datecount+=1
   goto :datecompare
)
goto :eof

:datecompare
::Again, there is code on this site that will convert
::a julian date to year, month, day.  Once you use that code to
::convert, then echo the results as missing.
set mnth=0%mnth%
set dy=0%dy%
echo Missing %yr%-%mnth:~-2%-%dy:~-2%
goto :eof

Post Reply