使用批处理脚本查找比昨天更新的文件

使用批处理脚本查找比昨天更新的文件

我正在尝试编写一个批处理脚本,该脚本可以查找特定文件夹中自昨天以来创建/修改/更新的文件和/或从今天开始的任何特定日期。然后需要将这些文件复制到不同的位置。

我尝试使用该forfiles命令,但我的 XP 没有该命令。

任何帮助都是极好的!

答案1

你可以使用 Horst Schaeffer 的优秀执行文件工具:

for /r c:\particular_folder %i in (*.*) do @wasfile.exe %i created after Today-1 > nul && @copy %i f:\different_location

你可以改变创建修改的 根据您的需要:

WasFile, ver. 2.2 (c) 2006-2007, Horst Schaeffer
compares ..
    the time&date of two files (or directories),
    the date only, time ignored
    the date of a file with TODAY-n (days)
    the time&date of a file with NOW-n (minutes)
Examples:
    WasFile this.zip created before that.zip
    WasFile this.zip modified after today-8
Syntax:
    WasFile File1 [Stamp] [not] before|after|sametime File2 [Stamp] [Option]
    WasFile File1 [Stamp] [not] before|after|sametime today-n [Option]
    WasFile File1 [Stamp] [not] before|after|sametime now-n
Stamp is either:
    created, modified (default) or accessed
    (by default second stamp = first stamp)
Options to compare date only, ignore time:
    /DateLocal or /DateUTC
    (if TODAY is used, default is /DateLocal)
Result by errorlevel:
    0: true, 1: false, 255: error (message to STDERR)

顺便问一下,当您输入 (.) 时,是否意味着查找任何格式/类型的文件?我可以只输入 *.csv 来搜索 csv 文件吗?

我想你的意思是 (*.*)?是的,这会告诉你你感兴趣的集合。*.csv 只会隔离 csv 文件。

另外为什么使用@wasfile.exe、nul、@copy 和 switch %i(两个地方)

阅读一些网站的背景知识可能会对你有所帮助:
http://www.netikka.net/tsneti/http/tsnetihttpprog.php#batch
http://www.netikka.net/tsneti/info/tscmd.php

谷歌批量教程更多网站。

在批处理文件中,@命令 表示不将命令行回显到屏幕上。否则,您将看到您要求的内容以及结果。&&表示“如果命令成功,则处理接下来的操作”,并通过以下方式确定错误级别。如果我想要“没有成功”,我会用||

在这种情况下,您可以这样理解代码:文件是否比我的目标日期更新,如果是 (&&),则将其复制到某个位置。不要显示我的命令“>nul”的任何输出,
好吗?

答案2

使用 VBScript 及其 GetFile() 和 DateDiff() 函数可以轻松实现这一点。VBScript 是 XP 的原生语言。

Option Explicit
On Error Resume Next
Err.Clear

processFolder "c:\temp"

WScript.Quit


Function processFolder( strPath )

    On Error Resume Next

    Dim objFSO
    Dim objFolder
    Dim intRc
    Dim colFiles
    Dim objFile

    intRc = 0

    Set objFSO = CreateObject( "Scripting.FileSystemObject" )
    If Err.Number <> 0 Then
        intRc = -1
        Err.Clear
    Else

        Set objFolder = objFSO.GetFolder( strPath )
        If Err.Number <> 0 Then
            intRc = -2
            Err.Clear
        Else

            Set colFiles = objFolder.Files
            If Err.Number <> 0 Then
                intRc = -3
                Err.Clear
            Else

                For Each objFile in colFiles
                    checkFile strPath, objFile.Name, (24 * 60 * 60)
                Next

                Set colFiles = Nothing
            End If

            Set objFolder = Nothing

        End If

        Set objFSO = Nothing
    End If

processFolder = intRc

End Function



Function checkFile( ByVal strPath, strName, intThreshold )

    On Error Resume Next

    Dim objFSO
    Dim objFile
    Dim intRc
    Dim strFileName
    Dim intModificationPeriodSecs
    Dim objDateLastModified

    intRc = 0
    strFileName = strPath & "\" & strName

    Set objFSO = CreateObject( "Scripting.FileSystemObject" )
    If Err.Number <> 0 Then
        intRc = -1
        Err.Clear
    Else

        Set objFile = objFSO.GetFile( strFileName )
        If Err.Number <> 0 Then
            intRc = -2
            Err.Clear
        Else

            'intRc = objFile.Size
            objDateLastModified = objFile.DateLastModified
            intModificationPeriodSecs = DateDiff( "s", objDateLastModified, Now )

            If intModificationPeriodSecs > intThreshold Then
                WScript.Echo "File [" & strFileName & "] last modified [" & intModificationPeriodSecs & "] seconds ago."
            End If

            Set objFile = Nothing

        End If

        Set objFSO = Nothing
    End If

checkFile = intRc

End Function

答案3

forfiles /P C:\someDirectory /S /D -1

成立这里。 蛮快。

相关内容