扫描特定的每个文件夹的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\
我有很多子目录像00123
,00245
,56002
...而里面每个人我有\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
我不熟悉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}
确定,所以为了澄清我早先提到。你只是在重复你的等待功能。为了向你展示我的意思:
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秒运行一次观察者。
你是对的,但观察者不会像那样工作。 您可以检查此[文档](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 }
对不起,这是怎么工作的罚款? while($ true){sleep 3600} 这将使您的脚本等待永恒,因为$ true将始终为真。你想要做的是一个do {} while() 所以你想要做的是扫描每个有“THE_DIRECTORY_TO_SCAN”这样的名字的子目录吗? 我会做的是使用Get-childitem并搜索文件夹名称中具有该名称的所有路径。当您获得这些名称时,您将开始专注于监控它们。 – Snak3d0c
'睡眠3600'只能每小时监测一次。我缩短了这段代码,因为它更复杂,我在'action'中做了很多事情。无论如何,如何给出'FileSystemWatcher'的路径列表? – Raccoon