Page 1 of 1

directory command output

Posted: 19 Nov 2007 08:46
by HankBrandenburg
I am trying to generate a list of complete path names to directories whose content has been modified after a specific date/time stamp. I am currently using dir /b /o:n /a:d /t:w \\%1\*.* to generate a list of folder names.

My questions:

1 - How do I restrict the list to folders with content modified after a certain date/time?
2 - How do I eliminate folders from the list that end with a specific character?
3 - How do I add the complete path to the directory name.

Posted: 20 Nov 2007 02:59
by jeb
Hi Hank,
2 - How do I eliminate folders from the list that end with a specific character?

Look at :checkForValidName, first I copy the first parameter to a local var.
And on the local var I use the string manipulation function %var:~-3% (not possible on a parameter like %1).

3 - How do I add the complete path to the directory name.

On a parameter you can use %~f1 or here %%~fa (full help at for /?), to expand the name to a full pathname.

1 - How do I restrict the list to folders with content modified after a certain date/time?

A bit more difficult, but depends on the specific problem you want to solve.
I use a solution for comparing two file dateTimes for updating the "object" files if they are older (like make).
But perhaps you need some other solution.
Please post your special problem.

Code: Select all

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set dateTime="23.12.2007 23:55"

rem *** Iterate through all directories
FOR /f "tokens=*" %%a IN ('dir /b /o:n /a:d /t:w *.*') DO (
  call :checkForValidName "%%~a" result
  echo ValidName=!result! --- %%a
  if !result!==1 (
    call :checkForModifications "%%~fa" %dateTime% modified
  )
)
goto :eof



::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:checkForValidName "<name>" <resultVar>
SETLOCAL

rem *** copy to local var for processing
set checkForValidName.tmp=%~1

rem *** Check the last 3 characters for the string "obj"
if "%checkForValidName.tmp:~-3%" EQU "obj" (
  set checkForValidName.result=0
) ELSE (
  set checkForValidName.result=1
)

rem *** set the result and return
(
  ENDLOCAL
  set %~2=%checkForValidName.result%
  goto :eof
)

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:checkForModifications "<path>" <DateTime> <resultVar>

SETLOCAL
echo    checkForModifications %1
REM *** ToDo: some usefull code
(
  ENDLOCAL
   rem *** Dummy, returns always 0
  set %~3=0
  goto :eof
)

Posted: 21 Nov 2007 12:12
by HankBrandenburg
Thanks Jeb - I am trying to locate directory names whose content has been modified after a specific date, and whose name does not end in a $

Posted: 21 Nov 2007 14:51
by jeb
Hi Hank,

I changed :checkForModifications a bit
and adding some comments, it should work for it.

Code: Select all

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

REM **** Format "YYYYMMDD"
set dateTime=20070719

rem *** Iterate through all directories
FOR /f "tokens=*" %%a IN ('dir /b /o:n /a:d /t:w *.*') DO (
  call :checkForValidName "%%~a" result
 rem *** echo ValidName=!result! --- %%a
  if !result!==1 (
    call :checkForModifications "%%~fa" "%dateTime%" modified
    if !modified! EQU 1 ECHO One or more files in "%%~a" are modified
  )
)
goto :eof



::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:checkForValidName "<name>" <resultVar>
SETLOCAL

rem *** copy to local var for processing
set checkForValidName.tmp=%~1

rem *** Check the last character for the string "$"
if "%checkForValidName.tmp:~-1%" EQU "$" (
  set checkForValidName.result=0
) ELSE (
  set checkForValidName.result=1
)

rem *** set the result and return
(
  ENDLOCAL
  set %~2=%checkForValidName.result%
  goto :eof
)

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:checkForModifications "<path>" <Date> <resultVar>
:: checks all files in a directory if one or more are newer than <date>
:: FileDate (%%~tf) expected in German/normal format TT.MM.JJJJ
:: resultVar is 0, when no modifications found after <Date>, else it will set to 1


SETLOCAL
rem echo - checkForModifications %1
set modified=0

rem *** Iterate through all files in <path>
FOR %%f IN ("%~1\*.*") DO (

rem   echo  - check file:%%f  with dateTime:%%~tf
  rem *** Split the date from the rest
  FOR /F "tokens=1,2,3 delims=. " %%a IN ("%%~tf") DO (   
    REM *** Format date to a form "YYYYMMDD" so it can compare
    set fileDate=%%c%%b%%a
rem   echo    - !fileDate! %~2
    IF "!fileDate!" GTR "%~2" (
   set modified=1
    )       

  )

)
rem echo modifications(!modified!) in %1

(
  ENDLOCAL
  rem *** Move the result to <resultVar>
  set %~3=%modified%
  goto :eof
)


I suppose, your system use german date/time format, if not you have
to change this line, so it fits to your format.

Code: Select all

FOR /F "tokens=1,2,3 delims=. " %%a IN ("%%~tf")


greetings from nrw
jeb