7

У меня есть несколько пакетных скриптов, которые ждут файлов. Цикл ожидания выполняется с помощью типичного цикла IF EXISTS:

:waitloop
IF EXISTS file.zip GOTO waitloopend
sleep.exe 60
goto waitloop
: waitloopend

Я ищу более эффективный способ ожидания файлов. Что-то вроде команды waitfile.exe, которая будет блокировать и ждать, пока файл не появится. Внутренне, он должен использовать класс FileSystemWatcher, чтобы иметь возможность завершить работу, как только файл появится.

В Linux у меня есть свой собственный скрипт на Perl, который внутренне использует Inotify.

Вы знаете, существует ли такой инструмент?

3 ответа3

2

Ваш метод предпочтителен и совершенно приемлем. FileSystemWatcher тратит впустую ресурсы, даже больше, чем ваш цикл.

Даже если вы сделаете ваш цикл таким же напряженным, как с задержкой в одну секунду, вы все равно будете совершенно незаметны на любом мониторе процесса, который измеряет загрузку процессора или жесткого диска.

Кстати, вы можете использовать команду timeout вместо sleep.exe .

Кроме того, у вас есть некоторые опечатки в вашем коде:

:waitloop
IF EXIST "scanning.done" GOTO waitloopend
timeout /t 1
goto waitloop
:waitloopend

Некоторая информация о «потере ресурсов» может быть найдена здесь: https://stackoverflow.com/questions/239988/filesystemwatcher-vs-polling-to-watch-for-file-changes ; главное, что это может быть ненадежным. Но я должен признать, что мой ответ исходит в основном из многолетней практики и опыта.

0

Используйте PowerShell для доступа к API-интерфейсу FileSystemWatcher.

#By BigTeddy 05 September 2011 

#This script uses the .NET FileSystemWatcher class to monitor file events in folder(s). 
#The advantage of this method over using WMI eventing is that this can monitor sub-folders. 
#The -Action parameter can contain any valid Powershell commands.  I have just included two for example. 
#The script can be set to a wildcard filter, and IncludeSubdirectories can be changed to $true. 
#You need not subscribe to all three types of event.  All three are shown for example. 
# Version 1.1 

$folder = 'c:\scripts\test' # Enter the root path you want to monitor. 
$filter = '*.*'  # You can enter a wildcard filter here. 

# In the following line, you can change 'IncludeSubdirectories to $true if required.                           
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'} 

# Here, all three events are registerd.  You need only subscribe to events that you need: 

Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 
$name = $Event.SourceEventArgs.Name 
$changeType = $Event.SourceEventArgs.ChangeType 
$timeStamp = $Event.TimeGenerated 
Write-Host "The file '$name' was $changeType at $timeStamp" -fore green 
Out-File -FilePath c:\scripts\filechange\outlog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"} 

Register-ObjectEvent $fsw Deleted -SourceIdentifier FileDeleted -Action { 
$name = $Event.SourceEventArgs.Name 
$changeType = $Event.SourceEventArgs.ChangeType 
$timeStamp = $Event.TimeGenerated 
Write-Host "The file '$name' was $changeType at $timeStamp" -fore red 
Out-File -FilePath c:\scripts\filechange\outlog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"} 

Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action { 
$name = $Event.SourceEventArgs.Name 
$changeType = $Event.SourceEventArgs.ChangeType 
$timeStamp = $Event.TimeGenerated 
Write-Host "The file '$name' was $changeType at $timeStamp" -fore white 
Out-File -FilePath c:\scripts\filechange\outlog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"} 

# To stop the monitoring, run the following commands: 
# Unregister-Event FileDeleted 
# Unregister-Event FileCreated 
# Unregister-Event FileChanged

Найдено здесь: https://gallery.technet.microsoft.com/scriptcenter/Powershell-FileSystemWatche-dfd7084b

0

Типичный монитор файловой системы обнаруживает создание файла, и если файл будет создан, пока инструмент активен, вы получите событие, но если вы запустите инструмент с уже существующим файлом, последующих событий создания не будет, и инструмент будет ждать вечно.

Похоже, вам нужно реализовать пользовательский инструмент, который сначала проверит, существует ли файл, и если не начнет мониторинг файла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .