我需要在Vista机器上设置某种脚本,以便将文件添加到特定文件夹时,它会自动触发对该文件进行操作的后台进程。(后台进程只是一个命令行实用程序,它将文件名和一些其他预定义选项作为参数。)
出于性能和维护的原因,如果可能,我想使用Windows的本机功能。我已经研究过使用Task Scheduler,但是在仔细研究了触发系统一段时间之后,我仍然无法充分理解它,而且我甚至不确定它是否能够满足我的需求。
我将不胜感激任何建议。谢谢!
我需要在Vista机器上设置某种脚本,以便将文件添加到特定文件夹时,它会自动触发对该文件进行操作的后台进程。(后台进程只是一个命令行实用程序,它将文件名和一些其他预定义选项作为参数。)
出于性能和维护的原因,如果可能,我想使用Windows的本机功能。我已经研究过使用Task Scheduler,但是在仔细研究了触发系统一段时间之后,我仍然无法充分理解它,而且我甚至不确定它是否能够满足我的需求。
我将不胜感激任何建议。谢谢!
Answers:
在工作中,我们使用Powershell监视文件夹。
自Windows Vista(已预安装.NET和PowerShell)以来,就可以使用它,而无需任何其他工具。
该脚本监视特定的文件夹并写入日志文件。您可以替换操作并执行所需的任何操作,例如调用外部工具
2014年11月23日19:22:04,创建,D:\ source \ New Text Document.txt 2014年11月23日19:22:09,已更改,D:\ source \ New Text Document.txt 2014年11月23日19:22:09,已更改,D:\ source \ New Text Document.txt 2014年11月23日19:22:14,已删除,D:\ source \ New Text Document.txt
### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "D:\source"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
$action = { $path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$logline = "$(Get-Date), $changeType, $path"
Add-content "D:\log.txt" -value $logline
}
### DECIDE WHICH EVENTS SHOULD BE WATCHED
Register-ObjectEvent $watcher "Created" -Action $action
Register-ObjectEvent $watcher "Changed" -Action $action
Register-ObjectEvent $watcher "Deleted" -Action $action
Register-ObjectEvent $watcher "Renamed" -Action $action
while ($true) {sleep 5}
$watcher.Path = "D:\source"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
StartMonitoring.ps1
要停止监视,仅需关闭PowerShell窗口即可
StartWatching.ps1
窗口即可停止监视。如果包括它在你的第一个脚本,第二脚本不只是工作,以节省变量$created
,$changed
,$deleted
或$renamed
您似乎处在正确的位置上-您可以使用任务计划程序定期运行.bat或.cmd文件,并且该文件可以以一行开头以检查所需文件的存在-实际上,我d检查文件是否不存在;例如:
@ECHO OFF
REM Example file
IF NOT EXIST C:\SOMEWHERE\SUBFOLDER\THISFILE.THS EXIT 1
REM All this gets done if the file exists...
:
:
EXIT 0
您还可以修改此代码,并使其在循环中运行,例如在循环中延迟1分钟,然后将对批处理文件的引用放在Windows启动文件夹中:
@ECHO OFF
REM Example file
:LOOP
IF NOT EXIST C:\SOMEWHERE\SUBFOLDER\THISFILE.THS GOTO SKIP01
REM All this gets done if the file exists...
:
:
:SKIP01
REM Crafty 1 minute delay...
PING 1.1.1.1 -n 10 -w 6000 >NUL
GOTO LOOP
根据Windows的运行版本以及安装了哪些其他资源包,还有其他方法可以实现延迟,但是PING命令在任何情况下都可以正常工作。在上面的PING命令中,执行10个幻像PINGS,它们之间的延迟为6000ms(即6秒),您可以使用这些值来实现批处理文件循环之间所需的延迟。
IF NOT EXIST C:\NO_SUCH_FILE_EVER.foo
。骇人听闻,但有效。谢谢你的主意。
谢谢大家的建议。
我最终编写了一个大致基于Linker3000轮询文件夹的思想并使用Task Scheduler在启动时运行它的VBScript。我最终从该资源中获取了基本语法,并进行了必要的调整。
我仍然想在某个时刻对其进行优化,使脚本的全部内容在事件驱动的系统上运行,但是我已经没有时间来处理它了,而且,这足够好了。
这是脚本,以防万一有人感兴趣(为清晰起见,删除了不相关的转化细分):
' FOLDER TO MONITOR
strFolder = "J:\monitored-folder"
' FREQUENCY TO CHECK IT, IN SECONDS
nFrequency = 10
strComputer = "."
strQueryFolder = Replace(strFolder, "\", "\\\\")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery ("SELECT * FROM __InstanceCreationEvent WITHIN " & nFrequency & " WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' and TargetInstance.GroupComponent='Win32_Directory.Name=""" & strQueryFolder & """'")
Do
Set objLatestEvent = colMonitoredEvents.NextEvent
strNewFile = objLatestEvent.TargetInstance.PartComponent
arrNewFile = Split(strNewFile, "=")
strFilePath = arrNewFile(1)
strFilePath = Replace(strFilePath, "\\", "\")
strFilePath = Replace(strFilePath, Chr(34), "")
strFileName = Replace(strFilePath, strFolder, "")
strTempFilePath = WScript.CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2) & "\TEMP.M4A"
' DO THE OPERATION STUFF
' ...
Loop
(此外,我不想让这个问题没有得到正式答复-我不想接受我对问题的回答-但我确实感谢Linker3000的回答!)
我们使用http://www.myassays.com/folder-poll上的商业工具(即非免费)“文件夹调查” 来执行此操作。这是一个Windows应用程序,包括一个用户友好的管理器应用程序,可轻松进行配置。另外,还有一个XML配置选项。实际的文件夹轮询作为Windows服务运行(因此,每次重新启动时都会自动启动)。当在轮询文件夹中检测到新文件时,可以自动启动应用程序(您可以指定自己的自定义命令行参数)。它也可以做其他事情,例如复制/移动文件。此外,活动可以记录到日志文件中,并且还有其他高级操作。