2010-12-29 08:06:29 +0000 2010-12-29 08:06:29 +0000
87
87

Come monitorare una cartella e attivare un'azione a riga di comando quando un file viene creato o modificato?

Ho bisogno di impostare una sorta di script sulla mia macchina Vista, in modo che ogni volta che un file viene aggiunto ad una particolare cartella, esso innesca automaticamente un processo in background che opera sul file. (Il processo in background è solo un'utilità a riga di comando che prende il nome del file come argomento, insieme ad alcune altre opzioni predefinite).

Vorrei farlo utilizzando le funzioni native di Windows, se possibile, per ragioni di prestazioni e manutenzione. Ho cercato di usare Task Scheduler, ma dopo aver esaminato il sistema di trigger per un po’ di tempo, non sono riuscito a capirne il senso, e non sono nemmeno sicuro che sia in grado di fare ciò di cui ho bisogno.

Apprezzerei qualsiasi suggerimento. Grazie!

Risposte (8)

96
96
96
2014-11-23 18:26:49 +0000

Al lavoro usiamo Powershell per monitorare le cartelle. Può essere utilizzato da Windows Vista (.NET e PowerShell è preinstallato) senza strumenti aggiuntivi.

Questo script monitora una certa cartella e scrive un file di log. Si può sostituire l'azione e fare quello che si vuole, ad esempio chiamare uno strumento esterno

Esempio di file di 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

StartMonitoraggio.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}
``` &001 


# Come usare 


1. 1. Creare un nuovo file di testo 
2. 2. Copiare e incollare il codice di cui sopra 
3. 3. Modificare le seguenti impostazioni secondo le proprie esigenze: 
- cartella da monitorare: `$watcher.Path = "D:\source"` 
- filtro file per includere solo alcuni tipi di file: `$watcher.Filter = "*.*"` 
- includere sottodirectory sì/no: `$watcher.IncludeSubdirectories = $true` 
4. Come utilizzare 



4. Salvarlo e rinominarlo in `StartMonitoring.ps1` 
5. Avviare il monitoraggio con _Right click " Esegui con PowerShell_ 


Per interrompere il monitoraggio, è sufficiente chiudere la finestra PowerShell 

### Ulteriore lettura 


- [ Documentazione per il FileSystemWatcher di PowerShell ](http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110). aspx) 
- [ Documentazione per il Register-Event di PowerShell ](http://technet.microsoft.com/en-us/library/hh849929.aspx) 
- [ Ispirazioni ](https://social.technet.microsoft.com:443/Forums/scriptcenter/en-US/c75c7bbd-4e32-428a-b3dc-815d5c42fd36/powershell-check-folder-for-new-files) per [ script ](http://dereknewton.com/2011/05/monitoring-file-system-changes-with-powershell/)
6
6
6
2010-12-29 08:49:30 +0000

Sembra che tu sia sulla strada giusta - potresti usare il task scheduler per eseguire un .bat o . cmd su base regolare e quel file potrebbe iniziare con una linea per verificare l'esistenza del file richiesto - in effetti, io controllerei l'assenza del file; per esempio:

@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

Si potrebbe anche modificare questo codice e farlo girare in un ciclo con un, diciamo, ritardo di 1 minuto nel ciclo e poi mettere un riferimento al file batch nella cartella di avvio di 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
``` &001 


Ci sono altri modi per ottenere un ritardo a seconda della versione di Windows in esecuzione e di quali kit di risorse aggiuntive sono stati installati, ma il comando PING funziona praticamente in tutte le circostanze. Nel comando PING di cui sopra, 10 PIN fantasma vengono eseguiti con un ritardo di 6000ms (cioè: 6 secondi) tra di loro, si può giocare con questi valori per ottenere il ritardo necessario tra i loop di file batch.
4
4
4
2011-01-07 04:01:48 +0000

Grazie a tutti, per i suggerimenti.

Ho finito per scrivere un VBScript che si basava più o meno sull'idea di Linker3000 di interrogare la cartella e di usare il Task Scheduler per farlo girare all'avvio. Ho finito per ottenere la sintassi di base da questa risorsa e ho apportato le necessarie modifiche.

Vorrei ancora ottimizzarlo ad un certo punto, facendo girare le budella dello script su un sistema guidato da un evento, ma ho finito il tempo per lavorarci, e, beh, questo è abbastanza buono.

Ecco lo script, nel caso in cui qualcuno fosse interessato (con l'irrilevante segmento di conversione redatta per chiarezza):

' 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
``` &001 



(Inoltre, non voglio lasciare questa domanda ufficialmente senza risposta - e odio accettare la mia stessa risposta alla domanda - ma ho votato la risposta di Linker3000 come ringraziamento!)
3
3
3
2016-11-30 09:15:20 +0000

Se l'azione è solo quella di copiare i file modificati, è possibile utilizzare robocopy /MON

Non so se robocopy utilizza FileSystemWatcher o funziona tramite polling per le modifiche

2
2
2
2011-03-12 13:01:15 +0000

Oppure si può usare Watch 4 Folder . Apparentemente è Freeware, portatile e compatibile con Windows 7. Non l'ho provato, ma l'ho trovato attraverso una ricerca sul web e ho pensato di passarlo.

Mi piace anche lo script VBS, anch'esso presente sul sito.

2
2
2
2016-05-16 17:14:11 +0000

Potresti guardare DropIt (gratis). Il programma è appropriato per l'elaborazione dei file in entrata in alcuni modi automatizzati. È possibile spostare, copiare, cancellare e passare parametri ad altri programmi a riga di comando per convertire immagini, dividere PDF, ecc.

2
2
2
2017-12-20 02:16:44 +0000

Ho anche trovato watchman che sembra essere abbastanza grande, e un più piccolo watchexec che non ho provato.

Watchman si sente bello e programmatico. Un'utilità CLI per gli utenti di energia.

1
1
1
2016-04-14 08:34:08 +0000

Utilizziamo lo strumento commerciale (cioè non gratuito) Folder Poll di http://www.myassays.com/folder-poll per fare proprio questo. È un'applicazione Windows che include un'applicazione di gestione facile da usare per consentire una facile configurazione. Inoltre, c'è un'opzione di configurazione XML. Il sondaggio delle cartelle vero e proprio funziona come un servizio di Windows (quindi si avvia automaticamente ad ogni riavvio). Quando un nuovo file viene rilevato in una cartella di polling, un'applicazione può essere lanciata automaticamente (è possibile specificare gli argomenti della riga di comando personalizzati). Può fare anche altre cose come copiare/spostare i file. Inoltre, l'attività può essere registrata in un file di log e ci sono altre operazioni avanzate.