【问题标题】:Scan specific sub-folder of every folder in powershell扫描powershell中每个文件夹的特定子文件夹
【发布时间】:2017-10-17 11:49:11
【问题描述】:

我有这个运行良好的脚本

$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

【问题讨论】:

  • 我很抱歉,但它工作得怎么样? while ($true) {sleep 3600} 这只会让你的脚本等待永恒,因为 $true 将永远为真。您想要做的是 do{}while() 那么您想要做的是扫描每个名称如 "THE_DIRECTORY_TO_SCAN" 的子目录?我要做的是使用 Get-childitem 并在文件夹名称中搜索所有具有该名称的路径。当你得到这些,然后你开始专注于监视它们。
  • sleep 3600 每小时只监控一次。我缩短了这段代码,因为它更复杂,而且我在action 中做了很多事情。无论如何,如何给出FileSystemWatcher的路径列表?

标签: powershell wildcard


【解决方案1】:

我不熟悉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} 

【讨论】:

  • 我可以使用Get-ChildItemResolve-Path 来检索路径列表,如我的帖子中所述。但是如何给FileSystemWatcher 提供多个参数呢?这就是我卡住的地方。我是否必须改用FileSystemWatcher 的多个实例?这似乎一点也不优雅
  • 这几乎是完美的。唯一的问题是在启动 powershell 脚本后创建文件夹时。它不起作用...我尝试将 while ($true) {sleep 3600} 放在最后的 } 之后,但它不起作用
  • 是的,我只是再次尝试确定,是的,它之前工作过
  • 您是否收到任何错误消息?它在哪里停止工作?
  • 使用您的代码,这仅适用于循环的第一个路径,因为由于while(我认为),脚本被卡在循环中。在外面使用while,我没有任何错误,但它适用于已经存在的每个文件夹(不是新文件夹),但Write-Host 被多次触发(与我认为的给定路径的数量有关)
【解决方案2】:

好吧,澄清一下我之前在说什么。你只是在重复你的等待功能。向你展示我的意思:

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

这将打印一次句子,然后每次 $true 为真时等待永恒 3 秒。

你需要做的是:

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

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

【讨论】:

  • 你是对的,但观察者不是那样工作的。您可以查看documentation了解更多详情
【解决方案3】:

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

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 }  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-20
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多