Register-ObjectEvent事件订阅正常运行时间

时间:2015-07-14 12:45:27

标签: powershell listener powershell-v3.0

我们每天都有来自外部实体的数据转储。收到文件后,会触发一个Object Event Listener,将文件移动到两个不同的位置(一个实时,一个备份),然后调用MS SQL存储过程将文件导入数据库。

这个过程和我的脚本似乎运行得很好。文件移动,执行SQL。但是,每天早上当我检查是否触发时,都没有触发。我通过调用Get-EventSubscriber来检查事件订阅者,并且没有注册侦听器。一旦我注册了监听器并将文件移动到输入位置,一切运行正常。

我了解事件订阅不会在重新启动后持续存在,但它们会保持打开多长时间?是否有可能关闭它们?还是他们超时?

$watchFolder = "\\server\c$\path\to\inbound\"
$filter = "*.txt"

$fsw = New-Object IO.FileSystemWatcher $watchFolder, $filter -Property @{
    IncludeSubdirectories = $false
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}

$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileMonitor -Action {
    $filePath = $Event.SourceEventArgs.FullPath
    $fileName = $Event.SourceEventArgs.Name
    Write-Host "Source File: $fileName"
    $success = copyFile($fileName, $filePath) #custom function to copy file to multiple destinations

    if ($success) {
        Write-Host "Starting SQL_JOB_NAME Job"
        Set-Location SQLSERVER:\SQL\server\DEFAULT\Databases\msdb\
        $execute_import = "EXEC dbo.sp_start_job N'SQL_JOB_NAME';"
        Invoke-Sqlcmd -SuppressProviderContextWarning -Query $execute_import
    } else {
        Write-Host "Something failed along the way: `r`n"
    }
}

1 个答案:

答案 0 :(得分:0)

看起来很傻,我在这里学到如果PowerShell进程关闭则调用Register-ObjectEvent,ObjectEvent也会被取消注册。

因为项目的性质要求我们拥有一个永远在线的文件监听器,所以我们认为Powershell对我们来说不是正确的实现。

相反,我们使用.NET库实现了一个Windows服务,这与PowerShell中使用的相同。

感谢PetSerAl的快速回答。