Lote espera em tempo real por um arquivo

7

Eu tenho alguns scripts em lote que aguardam por arquivos. O loop de espera é feito com o loop IF EXISTS típico:

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

Estou procurando uma maneira mais eficiente de esperar por arquivos. Algo como um comando waitfile.exe que irá bloquear e aguardar até que o arquivo apareça. Internamente, ele deve usar a classe FileSystemWatcher para poder sair assim que o arquivo aparece.

No Linux, eu tenho meu próprio script Perl que usa internamente o Inotify.

Você sabe se existe uma ferramenta como essa?

    
por Francisco R 21.06.2011 / 10:48

3 respostas

2

Seu método é preferível e perfeitamente aceitável. FileSystemWatcher desperdiça recursos, até mais do que o seu loop.

Mesmo que você faça o loop com um atraso de um segundo, você ainda será totalmente imperceptível em qualquer monitor de processo que mede a carga da CPU ou do disco rígido.

BTW, você pode usar o comando timeout em vez de sleep.exe .

Além disso, você tem alguns erros de digitação no seu código:

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

Algumas informações sobre "recursos desperdiçados" podem ser encontradas aqui: link ; o ponto principal é que poderia ser não confiável. Mas tenho que admitir, minha resposta vai principalmente dos anos de prática e experiência.

    
por 07.10.2015 / 21:43
0

Um típico monitor de sistema de arquivos detecta criações de arquivos e, se o arquivo for criado enquanto a ferramenta estiver ativa, você receberá o evento, mas se iniciar a ferramenta com um arquivo já existente, não haverá eventos de criação subseqüentes. a ferramenta vai esperar para sempre.

Parece que você precisa implementar uma ferramenta personalizada, que primeiro verificará se o arquivo já existe e se não iniciar o monitoramento do arquivo.

    
por 21.06.2011 / 11:40
0

Use o PowerShell para acessar a 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

Encontrado aqui: link

    
por 18.06.2015 / 14:29