我想编写一个批处理文件,每当有新文件添加到特定文件夹时就会触发该文件。
我可以使用 schtasks 安排任务。但我正在寻找一种基于中断而不是轮询的解决方案。还有其他方法吗?
答案1
有一种方法可以实现您想要的功能,在 Linux/Unix 上称为 iNotify,操作系统可以根据其“监视”的目录中的活动运行脚本。Windows 和 Mac 具有类似的功能,只是名称不同。
这stackoverflow 上的问题涵盖了各种操作系统的所有选项。
通知是一个不错的选择,它用 Java 编写,可以在所有操作系统上运行。它需要编写一些 Java 代码,不确定您是否正在寻找这种选项。
答案2
批处理无法轮询,但您可以尝试这个 VBScript:
Option Explicit
Const Path = "%userprofile%\Documents\Folder"
Const Interval = 1
Const Delay = 60
Dim oWSH, oFSO, oWMI, oEvent, oTarget, colEvents
Dim sPath, sDrive, sFolder, sNewPath
Set oWSH = CreateObject("WScript.Shell")
Set oFSO = CreateObject("Scripting.FileSystemObject")
oWSH.CurrentDirectory = oFSO.GetParentFolderName(WScript.ScriptFullName)
sPath = oWSH.ExpandEnvironmentStrings(Path)
sPath = oFSO.GetAbsolutePathName(sPath)
If Not oFSO.FolderExists(sPath) Then oFSO.CreateFolder(sPath)
sDrive = oFSO.GetDriveName(sPath)
sFolder = Replace(Mid(sPath, 3) & "\", "\", "\\", 1, -1, vbTextCompare)
Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colEvents = oWMI.ExecNotificationQuery( _
"SELECT * FROM __InstanceCreationEvent" _
& " WITHIN " & CStr(Interval) _
& " WHERE Targetinstance ISA 'CIM_DataFile'" _
& " AND TargetInstance.Drive='" & sDrive & "'"_
& " AND TargetInstance.Path='" & sFolder & "'")
Do
Set oEvent = colEvents.NextEvent()
sNewPath = Year(Now) & "_" & Right("0" & Month(Now), 2) & "_" & Right("0" & Day(Now), 2)
sNewPath = oFSO.BuildPath(sPath, sNewPath)
If Not oFSO.FolderExists(sNewPath) Then oFSO.CreateFolder(sNewPath)
Set oTarget = oEvent.TargetInstance
WScript.Sleep Delay * 1000
On Error Resume Next
oFSO.MoveFile oTarget.Name, oFSO.BuildPath(sNewPath, oFSO.GetFileName(oTarget.Name))
On Error Goto 0
Loop
答案3
我们使用的工具是http://www.myassays.com/folder-poll就是为了实现这一点。它是一个 Windows 应用程序,包含一个用户友好的管理器应用程序,以便于配置。此外,还有一个 XML 配置选项。实际文件夹轮询作为 Windows 服务运行(因此每次重新启动时都会自动启动)。当在轮询文件夹中检测到新文件时,可以自动启动应用程序(您可以指定自己的自定义命令行参数)。它还可以执行其他操作,例如复制/移动文件。此外,可以将活动记录到日志文件中,还有其他高级操作。请注意,这是一个商业工具(即不免费)。