使用命令行查找在给定日期之后修改的Windows上的文件

时间:2013-07-12 13:28:17

标签: windows powershell search cmd find

我需要使用命令行搜索在给定日期之后修改的磁盘上的文件。

例如:

   dir /S /B WHERE modified date > 12/07/2013

7 个答案:

答案 0 :(得分:29)

{7}} forfiles命令在Windows 7上对我有用。文章在这里:

http://www.windows-commandline.com/find-files-based-on-modified-time/

Microsoft Technet doc:http://technet.microsoft.com/en-us/library/cc753551.aspx

对于上面的示例:

forfiles /P <dir> /S /D +12/07/2013
  • / P搜索的起始路径
  • / S递归到子目录
  • / D搜索日期,&#34; +&#34;意味着&#34;大于&#34;或&#34;自&#34;

答案 1 :(得分:22)

您可以使用PowerShell执行此操作,尝试:

Get-ChildItem -Recurse | Where-Object { $_.LastWriteTime -ge "12/27/2016" }

答案 2 :(得分:3)

我的文件大小已经改变,没有Powershell我使用了以下内容,但线索来自另一篇文章

http://www.scotiasystems.com/blog/it-hints-and-tips/quick-way-to-find-recently-changed-files-in-windowsWindows command for file size only?

set Target=E:\userdata
rem Date format is M-D-YYYY
set date=12-13-2013
set Filelist=d:\temp\filelist.txt
set Sizelist=d:\temp\sizelist%date%.csv

echo Target is %Target%
echo Start date is %date%
echo file list is %Filelist%
echo Sizelist is %sizelist%

Xcopy %Target% /D:%date% /L /S  > %Filelist%
echo FileSize (bytes), FileName > %sizelist%

For /f "tokens=1 delims=;" %%j in (%Filelist%) do (
                call :Size "%%j"
                )    
Goto :EOF

:Size
@echo off
echo %~z1, %1 >> %sizelist%

答案 3 :(得分:2)

我遇到了同样的问题,所以我使用XCOPY和我正在寻找的修改日期创建了一个列表,然后使用for循环遍历列表并将每个文件所需的日期/时间信息添加到日志中。

xcopy X:\file_*.log X:\temp /D:07-17-2014 /L /Y > X:\files.txt
for /f "tokens=* delims=" %%a in (X:\files.txt ) do (
    @echo %%~ta %%a >> X:\files.log
)

导致类似下面的内容,这正是我想要的。

X:\>()
07/17/2014 09:41 AM X:\file_201407170600.log

X:\>()
07/17/2014 09:41 AM X:\file_201407170615.log

X:\>()
07/17/2014 09:23 AM X:\file_201407170630.log

答案 4 :(得分:1)

如果您决定使用电源外壳,这也适用于时间和日期范围:

Get-ChildItem -Recurse | Where-Object {($_.LastWriteTime -ge "04/15/2018 20:00:00") -and ($
_.LastWriteTime -lt "04/15/2018 21:00:00")}

使用编程日期或区域设置不可知日期时间:

Get-ChildItem -Recurse | Where-Object {($_.LastWriteTime -ge (new-object System.DateTime 2018, 1, 10, 12, 30, 00)) -and ($_.LastWriteTime -lt (new-object System.DateTime 2018, 1, 14, 12, 15, 59))}

在增加时间特异性顺序中输入日期和时间:

年,月,日,小时,分钟,秒

答案 5 :(得分:1)

如本例所示,您可以使用XCOPY搜索在给定日期之后修改的文件,查找自2018年最后一天起的文件:

xcopy *.* c:\temp\*.* /D:12-31-2018 /L /S

在此示例中,您位于搜索开始的目录中。

c:\ temp *。*仅是语法要求,不会在此处复制任何内容。

/ D:12-31-2018指定要查找的文件修改日期,包括指定的日期。

/ L显示文件名,包括驱动器和路径,也使xcopy不复制任何文件。

/ S在子目录中搜索。

答案 6 :(得分:0)

我也遇到了类似的挑战。我使用了forfiles,但是我注意到它给出了> =而不只是>。输入日期是一个变量,因此,我不想经过一堆圈/循环来计算date + 1 day(想想月最后一天或一年最后一天的逻辑)。

我创建了一个在特定日期运行forfiles的函数。这样我们得到的所有文件的修改日期均为>= _date_。并且对于每个文件,我检查修改日期是否为_date_,并且当且仅当不相等时才将输出打印到文件中。这意味着输出文件仅包含> _date_文件的条目。

然后我可以检查输出文件是否存在,以确定当前目录中是否有任何文件大于输入日期。此外,如果我想知道哪些文件是较新的,可以查看输出文件的内容。

最后,我的输入是从使用日期格式MM / DD / YYYY的文件中解析的,这意味着7月1日将是07/01/2019。但是,FORFILES中的日期不使用前导零,因此我需要通过删除前导零来进行翻译。

我的第一个尝试是使用/ A认为它会删除前导零。它不是将值读取为八进制-不要重复我第一次尝试的错误。因此,我刚刚创建了一个小辅助函数:getNum,该函数会删除前导零。

:: ########################################################################
:: :findNewerFiles
::
::     Windowsfile interface will only tell you if a file is
::     greater than OR EQUAL to the current date. Had to figure a way
::     to get just greater than.
::
::     Use 'forfiles' to find all files that are >= the specific date, and for
::     each file if the files date is not equal to the specific date then echo
::     the file information into the new-file-log.
::
::     If the new-file-log exists after we're all done, then it means there is
::     at least one file newer than the specified date.
::
:: PARMS:
::
::     %1 - MONTH
::
::     %2 - DAY
::
::     %3 - YEAR
::
:: ERRORLEVEL:
::     0  if no newer files found
::     !0 if a newer file was found
::
:findNewerFiles
SETLOCAL
    CALL :getNum M "%~1"
    CALL :getNum D "%~2"
    CALL :getNum Y "%~3"


    SET "RETVAL=1"

    %bu.callecho% PUSHD %G[3PROOT_UNC]%

    ECHO Last build date was: %M%/%D%/%Y%
    del "%G[NEW_FILE_LOG]%" >nul 2>&1

    FORFILES /p .\ /S /D +%M%/%D%/%Y% ^
             /c "cmd /c if /I @ISDIR == false if not @fdate==%M%/%D%/%Y% echo @fdate @path>>%G[NEW_FILE_LOG]%"

    IF EXIST "%G[NEW_FILE_LOG]%" (
        SET "RETVAL=0"
        TYPE "%G[NEW_FILE_LOG]%"
    )

    %bu.callecho% POPD
(ENDLOCAL
 EXIT /B %RETVAL%)





:: ########################################################################
:: :getNum
::
::     Remove leading 0 from input number and place results in output variable
::
:: PARMS:
::
::     %1 - OUTPUT VARIABLE
::          Name of the output variable to be populated
::
::     %2 - INPUT VARIABLE
::          The number to have leading zeros trimmed from
::
:: ERRORLEVEL:
::     0  always
::
:getNum
SETLOCAL
    SET "D=%~1"
    SET "M=%~2"

    IF "%M:~0,1%" EQU "0" (
        SET "M=%M:~1%"
    )

(ENDLOCAL
 SET "%D%=%M%"
 EXIT /B 0)