如何在创建或编辑文件时监视文件夹并触发命令行操作?

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

开始监控.ps1

### 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)

如何使用

  1. 创建一个新的文本文件
  2. 复制并粘贴上面的代码
  3. 根据您自己的需要更改以下设置:
    • 要监控的文件夹: $watcher.Path = "D:\source"
    • 文件过滤器以仅包含某些文件类型: $watcher.Filter = "*.*"
    • 包括子目录是/否: $watcher.IncludeSubdirectories = $true
  4. 保存并重命名为 StartMonitoring.ps1
  5. 通过右键单击开始监视» 使用 PowerShell 执行

要停止监视,关闭 PowerShell 窗口就足够了

进一步阅读


Lin*_*000 6

您似乎在正确的行上 - 您可以使用任务计划程序定期运行 .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 秒),您可以使用这些值来实现批处理文件循环之间所需的延迟。


big*_*tyh 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 的回答表示感谢!)


web*_*rjn 5

如果操作只是复制更改的文件,则可以使用 robocopy /MON:1

我不知道 robocopy 是使用 FileSystemWatcher 还是通过轮询更改来工作。


Pys*_*sis 5

还发现watchman似乎相当大,还有一个较小的watchexec我没有尝试过。

守望者感觉很好并且程序化。面向高级用户的 CLI 实用程序。