2017-02-22 23 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 code в новое время (например, 5 секунд), чтобы он действительно выполнялся, когда ничего не было изменено в течение 5 секунд. – wOxxOm

+0

, поэтому я добавил $ timer.Interval = 20000 в действии перед добавлением-содержимым. Но как мне получить дополнение или любую другую часть, которая будет выполняться после истечения таймера? – Soorman

+0

add-content должно быть внутри 'таймера' таймера – 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 и закрытиях.

Надеюсь, что это поможет.