Powershell - 全局注册IO.FileSystemWatcher

时间:2017-07-25 18:56:56

标签: c# powershell events filesystems global

我已经成功创建了一个FileSystemWatcher(C#对象)。我在PowerShell会话中运行下面的代码。

# Filters
$filter = "somefile.txt"
$flagfolder = "C:\path\to\some\folder"

# Instantiate Watcher 
$Watcher = New-Object IO.FileSystemWatcher $flagfolder, $filter -Property @{ 
    IncludeSubdirectories = $false
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}

# EVENT: $filter is created
$onCreated = Register-ObjectEvent $Watcher Created -SourceIdentifier FileCreated -Action {
   $path = $Event.SourceEventArgs.FullPath
   $name = $Event.SourceEventArgs.Name
   $changeType = $Event.SourceEventArgs.ChangeType
   $timeStamp = $Event.TimeGenerated
   Write-Host "The file '$name' was $changeType at $timeStamp"
   Write-Host $path
   someglobalfunction $param
}

运行上面的代码后,如果我执行Get-Job它会报告FileWatcher:

Id     Name            PSJobTypeName   State         HasMoreData     Location  
--     ----            -------------   -----         -----------     --------  
74     FileCreated                     NotStarted    False  

但是,如果我打开一个新的PowerShell会话并执行Get-Job它就不会报告任何内容......

我需要在任何人任何创建文件$pathfolder\somefile.txt时触发...但目前只有在定义{{1创建文件。

1 个答案:

答案 0 :(得分:1)

你需要两件事来完成这项工作。

  1. New-Object System.IO.FileSystemWatcher
  2. Register-ObjectEvent
  3. 我认为这是使FileSystemWatcher工作所需的最少代码。

    设置FileSystemWatcher对象

    $w = New-Object System.IO.FileSystemWatcher
    $w.Path = $PWD
    

    $PWD(当前工作目录)是一个自动变量。

    订阅"创建"事件(为简单起见)

    Register-ObjectEvent -InputObject $w -EventName Created -SourceIdentifier "File.Created" `
        -Action {Write-Host -Object "A file was created" -ForegroundColor Green -BackgroundColor Black}
    

    现在,如果您在当前工作目录中创建一个文件,PowerShell将编写&#34;文件已创建&#34;到屏幕。在当前会话中,在当前会话中,在不同的PowerShell会话中,通过文件资源管理器,使用cmd.exe创建如何并不重要。<无关紧要。< / p>

    This answer有更详细的代码。但这里的简化代码直接基于它。

相关问题