我们每天都有来自外部实体的数据转储。收到文件后,会触发一个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"
}
}
答案 0 :(得分:0)
看起来很傻,我在这里学到如果PowerShell进程关闭则调用Register-ObjectEvent
,ObjectEvent也会被取消注册。
因为项目的性质要求我们拥有一个永远在线的文件监听器,所以我们认为Powershell对我们来说不是正确的实现。
相反,我们使用.NET库实现了一个Windows服务,这与PowerShell中使用的相同。
感谢PetSerAl的快速回答。