我创建了以下函数,我想将其用于一个非常简单的CTI解决方案,我必须在工作中使用它。此CTI进程正在将所有已接收的调用写入文本logile。 此函数启动一个新的PowerShell作业并检查.log是否在过去2秒内保存并获取日志的最后4行(接收调用总是创建4个新行)。 在作业更新期间,我使用正则表达式查找带有phonenumber和time的行,并将其附加到表单中的richtextbox。
理论上,这完全符合我的要求。如果我手动添加新行并保存文件,它始终显示时间码和电话号码。 但是,在该字段中,这不起作用,因为CTI进程正在打开文件,除非进程正在关闭,否则不会保存它。
我知道我可以使用get-content -wait来显示新行。我已经在控制台中对此进行了测试,并且只要从CTI进程更新.log就会显示新行。我不知道的是如何重写函数来处理它,在第一次运行脚本时只显示新行而不是所有旧东西。我需要将其保留在工作中以获得响应形式。另一件事是,运行表单的计算机没有那么多的功能。我不知道get-content -wait是否会在几个小时后导致高内存使用量。对于像这样的案例,也许还有一些替代解决方案?
function start-CTIlogMonitoring
{
Param ($CTIlogPath)
Write-Debug "startCTI monitor"
Add-JobTracker -Name "CTILogger" -ArgumentList $CTIlogPath `
-JobScript {
#--------------------------------------------------
#TODO: Set a script block
#Important: Do not access form controls from this script block.
Param ($CTIlogPath) #Pass any arguments using the ArgumentList parameter
while ($true)
{
$diff = ((Get-ChildItem $CTIlogPath).LastWriteTime - (get-date)).totalseconds
Write-Debug "diff $diff"
if ($diff -gt -2)
{
Write-Debug "cti log DIFF detected"
Get-Content -Path "$CTIlogPath" -Tail 4
Start-Sleep -Seconds 1
}
}
#--------------------------------------------------
}`
-CompletedScript { Param ($Job) }`
-UpdateScript {
Param ($Job)
$results = Receive-Job -Job $Job | Out-String # Out-String required to get new lines in RTB
#get the stuff from results and make it more appearing to read for humans
if ($results -match '(Ein, E, (\d+))')
{
Write-debug "Incoming Call:"
$time = ([regex]'[0-9]{2}:[0-9]{2}:[0-9]{2}').Match($results)
$phoneNumber = ([regex]'Ein, E, (\d+)').Split($results)[1]
Write-Debug "$time ----> $phoneNumber"
if ($richtextboxCTIlogs.lines.count -eq 0)
{
$richtextboxCTIlogs.AppendText("$time ----> $phoneNumber")
}
else
{
$richtextboxCTIlogs.AppendText("`n$time ----> $phoneNumber")
}
$richtextboxCTIlogs.SelectionStart = $richtextboxCTIlogs.TextLength;
$richtextboxCTIlogs.ScrollToCaret()
}
<#else
{
Write-Debug "found nothin"
}#>
}
}