Windows Shell Command to Show File Name and Last Access Time

后端 未结 1 788
一生所求
一生所求 2020-12-20 16:35

I am trying to write a Windows command to list files and their last access times, sorted by access time.

I have used

dir [directory] /O:D /T:A /S /B         


        
相关标签:
1条回答
  • 2020-12-20 17:05

    from within a batch file:

    >output.txt (
      for /f "delims=" %%F in ('dir /o:d /t:a /s /b "c:\myPath\*"') @echo %%~tF %%F
    )
    

    However, there are some things you need to be aware of:

    • The files are sorted by access timestamp within a directory. It does not sort by access timestamp across all the directories. Your original code has the same problem. To sort accross directories requires parsing the access timestamp and converting it into a string that will sort chronologically when ordered via SORT. Something like "yyyy-mm-dd hh24:mm". Even that is not particularly good because you don't have access to the seconds. You could use WMIC DATAFILE to list file names with last access timestamps at a sub-second level. But why bother, considering that...

    • The last access timestamp maintained by Windows is not reliable! There are many situations whereby an application can read a file and yet the last access timestamp is not updated. I've seen some reference material somewhere that talks about that, but I don't remember where.

    If you still think you want to get a list of files sorted by last access timestamp for an entire folder hierarchy, then the following will work. Assume you want to list all files under "c:\test\"

    wmic datafile where "drive='c:' and path like '\\test\\%'" get name, lastaccessed | sort
    

    The timestamp will have the format YYYYMMDDhhmmssffffdffffdZZZZ where

    • YYYY = year
    • MM = month
    • DD = day
    • hh = hour (24 hour format)
    • mm = minutes
    • ss = seconds
    • ffffdffffd = micro seconds
    • ZZZZ = timezone, expressed as minutes difference from GMT (the 1st character is the sign)


    EDIT

    The wildcard search in WMIC causes terrible performance. Here is a version that iterates through all the folders in the root hierarchy, running WMIC against each specific folder (no wildcard). It has decent performance.

    @echo off
    setlocal disableDelayedExpansion
    set "root=c:\test"
    set "output=output.txt"
    
    set "tempFile=%temp%\dir_ts_%random%.txt"
    (
      for /d /r "%root%" %%F in (.) do (
        set "folder=%%~pnxF\"
        set "drive=%%~dF"
        setlocal enableDelayedExpansion
        2>nul wmic datafile where "drive='!drive!' and path='!folder:\=\\!'" get name, lastaccessed|findstr /brc:[0-9]
        endlocal
      )
    ) >"%tempFile%
    sort "%tempFile%" >"%output%"
    del "%tempFile%"
    
    0 讨论(0)
提交回复
热议问题