Como monitorar uma pasta e disparar uma ação de linha de comando quando um arquivo é criado ou editado?

75

Eu preciso configurar algum tipo de script na minha máquina Vista, de modo que sempre que um arquivo for adicionado a uma pasta específica, ele automaticamente acionará um processo em segundo plano que opere no arquivo. (O processo em segundo plano é apenas um utilitário de linha de comando que usa o nome do arquivo como um argumento, juntamente com algumas outras opções predefinidas.)

Gostaria de fazer isso usando recursos nativos do Windows, se possível, por motivos de desempenho e manutenção. Eu olhei para o uso do Agendador de Tarefas, mas depois de examinar o sistema de gatilho por um tempo, eu não fui capaz de fazer muito sentido, e eu nem tenho certeza se é capaz de fazer o que eu preciso.

Eu gostaria de receber sugestões. Obrigado!

    
por bigmattyh 29.12.2010 / 09:06

8 respostas

3

Obrigado a todos, pelas sugestões.

Acabei escrevendo um VBScript que era baseado na idéia do Linker3000 de pesquisar a pasta e usar o Agendador de Tarefas para que ele fosse executado na inicialização. Acabei recebendo a sintaxe básica de este recurso e fiz os ajustes necessários.

Eu ainda gostaria de otimizá-lo em algum momento, tendo a coragem de executar o script em um sistema orientado a eventos, mas fiquei sem tempo para trabalhar nele e, bem, isso é bom o suficiente .

Aqui está o script, caso alguém esteja interessado (com o segmento de conversão irrelevante redigido para maior clareza):

' 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

(Além disso, eu não quero deixar esta questão oficialmente sem resposta - e eu odeio aceitar minha própria resposta para a pergunta - mas eu fiz a resposta do Linker3000 como um agradecimento!)

    
por 07.01.2011 / 05:01
85

No trabalho, usamos o Powershell para monitorar pastas.
Ele pode ser usado desde o Windows Vista (o .NET e o PowerShell são pré-instalados) sem nenhuma ferramenta adicional.

Este script monitora uma determinada pasta e grava um arquivo de log. Você pode substituir a ação e fazer o que quiser, por exemplo, chamar uma ferramenta externa

Exemplo de arquivo de log

11/23/2014 19:22:04, Created, D:\source\New Text Document.txt
11/23/2014 19:22:09, Changed, D:\source\New Text Document.txt
11/23/2014 19:22:09, Changed, D:\source\New Text Document.txt
11/23/2014 19:22:14, Deleted, D:\source\New Text Document.txt

StartMonitoring.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}

Como usar

  1. Crie um novo arquivo de texto
  2. Copiar & cole o código acima
  3. Altere as seguintes configurações para suas próprias necessidades:
    • pasta para monitorar: $watcher.Path = "D:\source"
    • filtro de arquivos para incluir apenas determinados tipos de arquivo: $watcher.Filter = "*.*"
    • incluir subdiretórios sim / não: $watcher.IncludeSubdirectories = $true
  4. Salve e renomeie para StartMonitoring.ps1
  5. Iniciar o monitoramento por clique com o botão direito do mouse em »Executar com o PowerShell

Para interromper o monitoramento, basta fechar a janela do PowerShell

Leitura adicional

por 23.11.2014 / 19:26
5

Você parece estar no caminho certo - você poderia usar o agendador de tarefas para executar um arquivo .bat ou .cmd regularmente e esse arquivo poderia começar com uma linha para verificar a existência do arquivo necessário - em Na verdade, eu verificaria a inexistência do arquivo; por exemplo:

@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

Você também pode modificar esse código e executá-lo em um loop com um atraso de 1 minuto no loop e, em seguida, colocar uma referência ao arquivo em lotes na pasta de inicialização do 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

Existem outras maneiras de conseguir um atraso de acordo com a versão do Windows em execução e com os kits de recursos adicionais que foram instalados, mas o comando PING praticamente funciona em todas as circunstâncias. No comando PING acima, 10 PINGs fantasmas são executados com um atraso de 6000ms (ou seja: 6 segundos) entre eles, você pode jogar com esses valores para obter o atraso necessário entre os loops de arquivos em lote.

    
por 29.12.2010 / 09:49
2

Se a ação é apenas para copiar arquivos alterados, você pode usar o robocopy / MON

Não sei se o robocopy usa o FileSystemWatcher ou funciona pesquisando alterações

    
por 30.11.2016 / 10:15
1

Ou você pode usar a Assista 4 pastas . Aparentemente, é freeware, portátil e compatível com o Windows 7. Eu não tentei, mas achei através de uma pesquisa na web e pensei em passá-lo.

Eu também gosto do script VBS, também apresentado no site.

    
por 12.03.2011 / 14:01
1

Você pode procurar em DropIt (gratuito). O programa é apropriado para processar arquivos recebidos de algumas maneiras automatizadas. Você pode mover, copiar, excluir e passar parâmetros para outros programas de linha de comando para converter imagens, dividir PDFs, etc.

    
por 16.05.2016 / 19:14
1

Também foi encontrado vigia que parece ser bem grande, e um menor watchexec Eu não tentei.

    
por 20.12.2017 / 03:16
0

Usamos a ferramenta comercial (ou seja, não gratuita) na Pesquisa de Pastas do link para fazer exatamente isso. É um aplicativo do Windows que inclui um aplicativo gerenciador fácil de usar para permitir fácil configuração. Além disso, existe uma opção de configuração XML. A pesquisa de pasta real é executada como um serviço do Windows (portanto, inicia automaticamente em cada reinicialização). Quando um novo arquivo é detectado em uma pasta pesquisada, um aplicativo pode ser iniciado automaticamente (você pode especificar seus próprios argumentos de linha de comando personalizados). Pode fazer outras coisas como copiar / mover arquivos também. Além disso, a atividade pode ser registrada em um arquivo de log e há outras operações avançadas.

    
por 14.04.2016 / 10:34