2017-02-22 70 views
1

我想运行一个脚本,该脚本在使用一堆文件(例如一堆.pdf)的窗口上执行特定程序。问题是我正在将这些文件从另一个位置接收到共享文件夹。所以我需要检查这个共享文件夹,并且只有当所有文件都完成了我不能控制的另一个驱动器的拷贝时才执行该程序。检查一个文件夹是否被拷贝过

无论如何要做到这一点?我所有的搜索都让我使用PowerShell和这样的脚本,除了我的操作记录文件外,我需要执行程序,但我不知道如何做到这一点,最后复制的文件/文件夹已经完成。

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO 
    $watcher = New-Object System.IO.FileSystemWatcher 
    $watcher.Path = "C:\Users\User\Desktop\monitor_this" 
    $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 "C:\Users\User\Desktop\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} 
+0

使用滑动计时器技术:将$ action代码内部的计时器重置为新的时间(例如5秒),以便在5秒内没有任何内容被修改时实际执行。 – wOxxOm

+0

所以我在添加内容之前添加了$ timer.Interval = 20000。但是,一旦定时器用完,我怎么才能得到添加内容或其他任何部分? – Soorman

+0

添加内容应该在计时器的“动作”内 – wOxxOm

回答

2

基于wOxxOm的意见,我想上面的例子扩展:

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO 
 
    $watcher = New-Object System.IO.FileSystemWatcher 
 
    $watcher.Path = "C:\Users\User\Desktop\monitor_this" 
 
    $watcher.Filter = "*.*" 
 
    $watcher.IncludeSubdirectories = $true 
 
    $watcher.EnableRaisingEvents = $true 
 

 
### Create timer 
 
    $timer = new-object timers.timer 
 
    $timer.Interval = 5000 #5 seconds 
 
    $timer.Enabled = $true 
 

 
### DEFINE ACTIONS AFTER AN EVENT IS DETECTED 
 
    $fileWatcherAction = { 
 
     # Reset the timer every time the file watcher reports a change 
 
     write-host "Timer Elapse Event: $(get-date -Format ‘HH:mm:ss’)" 
 
     $timer.Stop() 
 
     $timer.Start() 
 
    } 
 

 
    $timerAction = { $path = $Event.SourceEventArgs.FullPath 
 
       $changeType = $Event.SourceEventArgs.ChangeType 
 
       $logline = "$(Get-Date), $changeType, $path" 
 
       Add-content "C:\Users\User\Desktop\log.txt" -value $logline 
 
       }  
 

 
### When timer fires timerAction is called 
 
    Register-ObjectEvent $timer "Elapsed" -Action $timerAction 
 

 
### DECIDE WHICH EVENTS SHOULD BE WATCHED, every call of below events resets the timer 
 
    Register-ObjectEvent $watcher "Created" -Action $fileWatcherAction 
 
    Register-ObjectEvent $watcher "Changed" -Action $fileWatcherAction 
 
    Register-ObjectEvent $watcher "Deleted" -Action $fileWatcherAction 
 
    Register-ObjectEvent $watcher "Renamed" -Action $fileWatcherAction 
 
    while ($true) {Start-Sleep 5}

什么实际上,我不知道是$timer封闭处理,也许你还有一些关于Powershell和关闭的研究。

希望有所帮助。