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

Comment surveiller un dossier et déclencher une action en ligne de commande lorsqu'un fichier est créé ou modifié ?

Je dois configurer une sorte de script sur mon ordinateur Vista, de sorte que chaque fois qu'un fichier est ajouté à un dossier particulier, il déclenche automatiquement un processus en arrière-plan qui opère sur le fichier. (Le processus d'arrière-plan est juste un utilitaire de ligne de commande qui prend le nom du fichier comme argument, avec quelques autres options prédéfinies).

J'aimerais le faire en utilisant les fonctionnalités natives de Windows, si possible, pour des raisons de performances et de maintenance. J'ai étudié la possibilité d'utiliser le planificateur de tâches, mais après avoir parcouru le système de déclenchement pendant un certain temps, je n'ai pas pu en tirer grand chose, et je ne suis même pas sûr qu'il soit capable de faire ce dont j'ai besoin.

J'apprécierais toute suggestion. Merci !

Réponses (8)

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

Au travail, nous utilisons Powershell pour surveiller les dossiers. Il peut être utilisé depuis Windows Vista (.NET et PowerShell est préinstallé) sans aucun outil supplémentaire.

Ce script surveille un certain dossier et écrit un fichier journal. Vous pouvez remplacer l'action et faire ce que vous voulez, par exemple appeler un outil externe

Exemple de fichier journal

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}

Comment utiliser

  1. Créer un nouveau fichier texte
  2. Copiez & collez le code ci-dessus
  3. Modifiez les paramètres suivants en fonction de vos besoins :
  4. dossier à surveiller : $watcher.Path = "D:\source"
  5. filtre de fichiers pour n'inclure que certains types de fichiers : $watcher.Filter = "*.*"
  6. inclure des sous-répertoires oui/non : $watcher.IncludeSubdirectories = $true
  7. Enregistrez et renommez le StartMonitoring.ps1
  8. Démarrez la surveillance par Clic droit “ Exécuter avec PowerShell

Pour arrêter la surveillance, il suffit de fermer votre fenêtre PowerShell

Lecture complémentaire

6
6
6
2010-12-29 08:49:30 +0000

Vous semblez être sur la bonne voie - vous pourriez utiliser le planificateur de tâches pour exécuter un .bat ou un . cmd régulièrement et ce fichier pourrait commencer par une ligne pour vérifier l'existence du fichier requis - en fait, je vérifierais la non-existence du fichier ; par exemple :

@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

Vous pourriez aussi modifier ce code et le faire tourner en boucle avec, disons, un retard d'une minute dans la boucle et ensuite mettre une référence au fichier batch dans le dossier de démarrage de Windows : Il y a d'autres moyens d'obtenir un délai selon la version de Windows en cours d'exécution et les kits de ressources supplémentaires qui ont été installés, mais la commande PING fonctionne pratiquement en toutes circonstances. Dans la commande PING ci-dessus, 10 PINGS fantômes sont exécutés avec un délai de 6000ms (soit 6 secondes) entre eux, vous pouvez jouer avec ces valeurs pour obtenir le délai dont vous avez besoin entre les boucles de fichiers batch.

4
4
4
2011-01-07 04:01:48 +0000

Merci à tous pour les suggestions.

J'ai fini par écrire un VBScript qui était en gros basé sur l'idée de Linker3000 d'interroger le dossier, et d'utiliser le planificateur de tâches pour le faire fonctionner au démarrage. J'ai fini par obtenir la syntaxe de base de cette ressource et j'ai fait les ajustements nécessaires.

J'aimerais encore l'optimiser à un moment donné, en faisant tourner le script sur un système piloté par les événements, mais je n'ai plus le temps de travailler dessus, et, bon, c'est suffisant.

Voici le script, au cas où quelqu'un serait intéressé (avec le segment de conversion non pertinent édité pour plus de clarté) :

' 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

(Aussi, je ne veux pas laisser cette question officiellement sans réponse – et je déteste accepter ma propre réponse à la question – mais j'ai voté la réponse de Linker3000 en remerciement !)

3
3
3
2016-11-30 09:15:20 +0000

Si l'action consiste simplement à copier les fichiers modifiés, vous pouvez utiliser robocopy /MON

Ne sait pas si robocopy utilise FileSystemWatcher ou fonctionne en interrogeant les modifications

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

Ou vous pourriez utiliser Watch 4 Folder . Apparemment, c'est un logiciel gratuit, portable et compatible avec Windows 7. Je ne l'ai pas essayé, mais je l'ai trouvé par une recherche sur le web et j'ai pensé le transmettre.

J'aime aussi le script VBS, également présent sur le site.

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

Vous pouvez consulter DropIt (gratuit). Le programme est approprié pour traiter les fichiers entrants de manière automatisée. Vous pouvez déplacer, copier, supprimer et passer des paramètres à d'autres programmes en ligne de commande pour convertir des images, diviser des PDF, etc.

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

J'ai aussi trouvé watchman qui semble être assez grand, et un plus petit watchexec que je n'ai pas essayé.

Watchman est agréable et programmatique. Un utilitaire CLI pour les utilisateurs de puissance.

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

Pour ce faire, nous utilisons l'outil commercial (c'est-à-dire non gratuit) Folder Poll de http://www.myassays.com/folder-poll . Il s'agit d'une application Windows qui comprend une application de gestion conviviale pour permettre une configuration facile. Il existe également une option de configuration XML. Le sondage de dossiers proprement dit fonctionne comme un service Windows (il démarre donc automatiquement à chaque redémarrage). Lorsqu'un nouveau fichier est détecté dans un dossier interrogé, une application peut être lancée automatiquement (vous pouvez spécifier vos propres arguments de ligne de commande personnalisés). Elle peut aussi faire d'autres choses comme copier/déplacer des fichiers. De plus, l'activité peut être enregistrée dans un fichier journal et il existe d'autres opérations avancées.