2017-10-17 8 views
1

J'ai ce script qui fonctionne biensous-dossier spécifique d'analyse de chaque dossier dans powershell

$watcher = New-Object System.IO.FileSystemWatcher 
$watcher.Path = "C:\folder_to_scan\" 
$watcher.Filter = "*.nrrd" 
$watcher.IncludeSubdirectories = $true 
$watcher.EnableRaisingEvents = $true 

$action = 
{ 
    $path = $Event.SourceEventArgs.FullPath 
    Write-Host "The file '$path' was $changeType at '$(Get-Date)'" -fore green    
} 
Register-ObjectEvent $watcher "Created" -Action $action 
while ($true) {sleep 3600} 

Mais dans mon C:\folder_to_scan\ j'ai beaucoup de sous-répertoires comme 00123, 00245, 56002 ... Et à l'intérieur de chacun d'entre eux je \THE_DIRECTORY_TO_SCAN

donc j'ai essayé ce $watcher.Path = "C:\folder_to_scan\*\THE_DIRECTORY_TO_SCAN\" et $watcher.Path = "C:\folder_to_scan\[0-9]*\THE_DIRECTORY_TO_SCAN\"

Mais cela ne fonctionne pas. Est-il possible d'utiliser un caractère générique dans cette situation?


Sinon, comment utiliser le chemin avec plusieurs FileSystemWatcher? Parce que je pensais que nous pouvons utiliser cette

Resolve-Path "C:\folder_to_scan\*\THE_DIRECTORY_TO_SCAN\" | Select -ExpandProperty Path 
+0

Je suis désolé, mais comment cela fonctionne bien? while ($ true) {sleep 3600} Ceci gardera votre script en attente d'éternité car $ true sera toujours vrai. Qu'est-ce que vous voulez faire est un do {} while() Alors ce que vous voulez faire est, analyser chaque sous-répertoire qui a un nom comme "THE_DIRECTORY_TO_SCAN"? Ce que je ferais est d'utiliser Get-childitem et rechercher tous les chemins qui ont ce nom dans le nom de fold.When vous obtenez ceux-ci, alors vous commencez à vous concentrer sur les surveiller. – Snak3d0c

+0

Le 'sommeil 3600' est à surveiller seulement une fois par heure. J'ai court-circuité ce code parce qu'il était plus complexe et que je faisais beaucoup plus de choses en «action». Quoi qu'il en soit, comment donner une liste de chemin à 'FileSystemWatcher'? – Raccoon

Répondre

0

Je ne suis pas familier avec FileSystemWatcher donc je suppose que vous avez juste besoin de se nourrir dans les chemins de dossier pour $watcher.Path

Je suppose également votre code fonctionne déjà.

essayez d'utiliser Get-ChildItem et utiliser une boucle:

$watcher = New-Object System.IO.FileSystemWatcher 
Get-ChildItem "C:\folder_to_scan\" -Recurse | ? { $_.PSIsContainer -and $_.Name.EndsWith("THE_DIRECTORY_TO_SCAN")}| %{ 
    $watcher.Path = $_.FullName #change this 
    $watcher.Filter = "*.nrrd" 
    $watcher.IncludeSubdirectories = $true 
    $watcher.EnableRaisingEvents = $true 
} 
    $action = 
    { 
     $path = $Event.SourceEventArgs.FullPath 
     Write-Host "The file '$path' was $changeType at '$(Get-Date)'" -fore green    
    } 
    Register-ObjectEvent $watcher "Created" -Action $action 
    while ($true) {sleep 3600} 
+0

Je peux utiliser 'Get-ChildItem' ou' Resolve-Path' pour récupérer une liste de chemins comme expliqué dans mon article. Mais comment donner plusieurs arguments à 'FileSystemWatcher'? C'est là que je suis coincé. Dois-je utiliser plusieurs instances de 'FileSystemWatcher' à la place? Cela ne semble pas du tout élégant – Raccoon

+0

C'est presque parfait. Le seul problème est lorsqu'un dossier est créé après le lancement du script powershell. Ça ne marchera pas...J'ai essayé de mettre le 'while ($ true) {sleep 3600}' après le '}' final mais il ne fonctionne pas – Raccoon

+0

Oui, j'ai juste essayé de nouveau d'être sûr et oui cela fonctionnait avant – Raccoon

0

Ok, donc de clarifier ce que je parlais plus tôt. Vous répétez seulement votre fonction d'attente. Pour vous montrer ce que je veux dire:

echo "This would be your code running." 
    while ($true) {sleep -second 3} 

Ce imprimerait la phrase une fois, puis continuer à attendre pour l'éternité pendant 3 secondes à chaque fois $ true est vrai.

Ce que vous devez faire est:

do{ 
    echo "This would be your code running." 
    sleep -seconds 3 
} while($true) 

Cela affichera la phrase toutes les 3 secondes. Ou dans votre cas, exécutez votre observateur toutes les 3 secondes.

+0

Vous avez raison, mais les observateurs ne fonctionnent pas comme ça. Vous pouvez vérifier cette [documentation] (https://msdn.microsoft.com/fr-fr/library/system.io.filesystemwatcher (v = vs.110) .aspx? Cs-save-lang = 1 & cs-lang = csharp # code-snippet-2) pour plus de détails – Raccoon

0

je ne trouve pas une solution parfaite, donc je l'ai fait

if ($path -like '*\THE_DIRECTORY_TO_SCAN\*') 
{ Write-Host "File created in \THE_DIRECTORY_TO_SCAN" -fore green } 
else 
{ Write-Host "File created NOT in \THE_DIRECTORY_TO_SCAN" -fore red }