big*_*tyh 105 windows windows-vista automation scheduled-tasks
我需要在我的 Vista 机器上设置某种脚本,以便每当将文件添加到特定文件夹时,它都会自动触发对该文件进行操作的后台进程。(后台进程只是一个命令行实用程序,它将文件名作为参数以及其他一些预定义选项。)
如果可能,出于性能和维护原因,我想使用本机 Windows 功能执行此操作。我已经研究过使用 Task Scheduler,但是在仔细研究了触发系统一段时间后,我一直无法理解它,我什至不确定它是否能够做我需要的事情。
我很感激任何建议。谢谢!
nix*_*xda 112
在工作中,我们使用 Powershell 来监控文件夹。
它可以在 Windows Vista(预装 .NET 和 PowerShell)后使用,无需任何其他工具。
此脚本监视某个文件夹并写入日志文件。您可以替换操作并做任何您想做的事情,例如调用外部工具
11/23/2014 19:22:04,已创建,D:\source\New Text Document.txt 11/23/2014 19:22:09,已更改,D:\source\New Text Document.txt 11/23/2014 19:22:09,已更改,D:\source\New Text Document.txt 11/23/2014 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}
Run Code Online (Sandbox Code Playgroud)
$watcher.Path = "D:\source"$watcher.Filter = "*.*"$watcher.IncludeSubdirectories = $trueStartMonitoring.ps1要停止监视,关闭 PowerShell 窗口就足够了
您似乎在正确的行上 - 您可以使用任务计划程序定期运行 .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
Run Code Online (Sandbox Code Playgroud)
您还可以修改此代码并让它在循环中运行,例如在循环中延迟 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
Run Code Online (Sandbox Code Playgroud)
根据运行的 Windows 版本和已安装的其他资源包,还有其他实现延迟的方法,但 PING 命令在所有情况下几乎都有效。在上面的 PING 命令中,执行 10 次幻像 PINGS,它们之间的延迟为 6000 毫秒(即:6 秒),您可以使用这些值来实现批处理文件循环之间所需的延迟。
谢谢大家的建议。
我最终编写了一个 VBScript,它大致基于 Linker3000 的轮询文件夹的想法,并使用任务计划程序让它在启动时运行。我最终从这个资源中获得了基本语法并进行了必要的调整。
我仍然想在某个时候对其进行优化,让脚本在事件驱动的系统上运行,但我已经没有时间来处理它了,而且,这已经足够了。
这是脚本,以防万一有人感兴趣(为了清晰起见,不相关的转换段已被编辑):
' 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
Run Code Online (Sandbox Code Playgroud)
(另外,我不想让这个问题没有得到正式答复——我讨厌接受我自己对这个问题的回答——但我确实对 Linker3000 的回答表示感谢!)
| 归档时间: |
|
| 查看次数: |
310314 次 |
| 最近记录: |