扫描特定的每个文件夹的PowerShell中的子文件夹

扫描特定的每个文件夹的PowerShell中的子文件夹

问题描述:

我有这个脚本是工作的罚款扫描特定的每个文件夹的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} 

但在我C:\folder_to_scan\我有很多子目录像001230024556002 ...而里面每个人我有\THE_DIRECTORY_TO_SCAN

所以,我想这个$watcher.Path = "C:\folder_to_scan\*\THE_DIRECTORY_TO_SCAN\"$watcher.Path = "C:\folder_to_scan\[0-9]*\THE_DIRECTORY_TO_SCAN\"

但是,这是行不通的。在这种情况下可以使用通配符吗?


如果不是,如何使用多路径与FileSystemWatcher? 因为我想通了,我们可以利用这个

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

对不起,这是怎么工作的罚款? while($ true){sleep 3600} 这将使您的脚本等待永恒,因为$ true将始终为真。你想要做的是一个do {} while() 所以你想要做的是扫描每个有“THE_DIRECTORY_TO_SCAN”这样的名字的子目录吗? 我会做的是使用Get-childitem并搜索文件夹名称中具有该名称的所有路径。当您获得这些名称时,您将开始专注于监控它们。 – Snak3d0c

+0

'睡眠3600'只能每小时监测一次。我缩短了这段代码,因为它更复杂,我在'action'中做了很多事情。无论如何,如何给出'FileSystemWatcher'的路径列表? – Raccoon

我不熟悉FileSystemWatcher所以我假设你只需要在文件夹路径喂到$watcher.Path

我也假设你的代码已经工作了。

尝试使用Get-ChildItem并使用一个for循环:

$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

我可以使用'Get-ChildItem'或'Resolve-Path'来检索我的文章中解释的路径列表。但如何给'FileSystemWatcher'多个参数?这就是我卡住的地方。我是否必须使用'FileSystemWatcher'的多个实例?这似乎并不高雅 – Raccoon

+0

这几乎是完美的。唯一的问题是在启动powershell脚本后创建文件夹。不起作用...我试图在最后一个'}之后放置'while($ true){sleep 3600}',但它不起作用 – Raccoon

+0

是的,我只是再次尝试确定,并且是在 – Raccoon

确定,所以为了澄清我早先提到。你只是在重复你的等待功能。为了向你展示我的意思:

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

这将打印句一次,然后继续等待永远持续3秒,每次$真实不虚。

你需要做的是:

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

这将打印句子每3秒。 或者你的情况,每3秒运行一次观察者。

+0

你是对的,但观察者不会像那样工作。 您可以检查此[文档](https://msdn.microsoft.com/fr-fr/library/system.io.filesystemwatcher(v = vs.110).aspx?cs-save-lang = 1&cs-lang = csharp#code-snippet-2)了解更多详情 – Raccoon

我没有找到一个完美的解决方案,所以我做了这个

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 }