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