首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Powershell从Avaya导出数据

使用Powershell从Avaya导出数据
EN

Stack Overflow用户
提问于 2019-10-03 22:28:07
回答 2查看 868关注 0票数 0

我在Access数据库(32位)中有一个宏,用于从Avaya CMS下载数据,但由于一些软件更改,我不能再使用它。我考虑过使用Powershell (在32位模式下运行)来获取所需的数据,但由于某种原因,它无法工作……

Access数据库中的宏过去看起来像这样:

代码语言:javascript
复制
Option Compare Database
Option Explicit
    Dim cvsApp As cvsApplication
    Dim cvsCon As cvsConnection
    Dim cvsSrv As cvsServer
    Dim cvsacd As cvsacd
    Dim cvsCatalog As cvsCatalog
    Dim cvsRpt As cvsReport
    Dim b As Object
    Dim Info As Object
    Global Const myAppName As String = "CMS Agent Data"
    Global Const myPath As String = "\\Data\Avaya\TempFiles\"

Sub AvayaLogin()
    Set cvsApp = CreateObject("acsup.cvsApplication")
    If cvsApp.CreateServer("login", "password", "", "server", False, "ENU", cvsSrv, cvsCon) Then
        If cvsCon.Login("login", "password", "server", "ENU") Then
        End If
    End If
End Sub

Sub AvayaLogout()
    On Error Resume Next
     'Closes out all Avaya
    cvsCon.Logout
    cvsCon.Disconnect
    Set cvsSrv = Nothing
    Set cvsCon = Nothing
    Set cvsApp = Nothing
End Sub

Sub AbnCallsData()
On Error Resume Next

Dim MyStartDate, MyStartTime(4), MyStopDate, MyStopTime(4), LastUpdateDate, LastUpdateTime, TimeZoneCounter As Integer, NNow, CNow
Dim TEXT1 As String
Dim FSO
Const TimeZone = 4

'Mop up previous days with this query
LastUpdateDate = DMin("Date", "SQL_LastUpdate")
LastUpdateTime = DMin("Time", "SQL_LastUpdate")
If LastUpdateDate = Date Then
    LastUpdateDate = DMax("Date", "SQL_LastUpdate")
    LastUpdateTime = DMax("Time", "SQL_LastUpdate")
End If
NNow = Format(Now(), "yyyy/mm/dd hh:nn:ss")
    MyStartDate = LastUpdateDate
    MyStartTime(1) = "00:00:00"
     MyStopTime(1) = "10:00:00"
    MyStartTime(2) = "10:00:00"
     MyStopTime(2) = "12:00:00"
    MyStartTime(3) = "12:00:00"
     MyStopTime(3) = "15:00:00"
    MyStartTime(4) = "15:00:00"
     MyStopTime(4) = "23:59:59"

    DoCmd.OpenForm "FrmPleaseWait"
    'Forms!FrmUpdatecms.Visible = False
    DoCmd.RepaintObject acForm, "FrmPleaseWait"

Do Until MyStartDate = Date + 1
    MyStopDate = MyStartDate

    For TimeZoneCounter = 1 To TimeZone
        If LastUpdateDate = Date And Format(LastUpdateTime, "hh:mm:ss") > MyStopTime(TimeZoneCounter) Then
        'Skip first few time zones if applicable
        Else
            CNow = Format(MyStartDate, "yyyy/mm/dd") & " " & MyStartTime(TimeZoneCounter)
            'End if after last time zone
            If NNow < CNow Then
                cvsRpt.Quit
                Exit For
            End If

            If LastUpdateDate = Date And Format(LastUpdateTime, "hh:mm:ss") >= MyStartTime(TimeZoneCounter) And Format(LastUpdateTime, "hh:mm:ss") <= MyStopTime(TimeZoneCounter) Then
'               Go back 30 minutes from latest record for same day
                MyStartTime(TimeZoneCounter) = (Format(LastUpdateTime - 1 / 48, "hh:mm:ss"))
            End If

            cvsSrv.Reports.ACD = "1"
            Set cvsCatalog = cvsSrv.Reports

    'OPENS THE AVAYA REPORT FOR CALL RECORDS
            Set cvsRpt = New cvsReport
            'cvsCatalog.CreateReport cvsCatalog.Reports.Item("Historical\Other\Call Records"), cvsRpt
            Set Info = cvsSrv.Reports.Reports("Historical\Designer\Call Records SL")
            b = cvsSrv.Reports.CreateReport(Info, cvsRpt)

                 'INPUTS THE REPORT CRITERIA
                 'STARTDATE
                If cvsRpt.SetProperty("Start Date", MyStartDate) Then
                Else
                End If
                'STARTTIME
                If cvsRpt.SetProperty("Start Time", MyStartTime(TimeZoneCounter)) Then
                Else
                End If
                'STOP DATE
                If cvsRpt.SetProperty("Stop Date", MyStopDate) Then
                Else
                End If
                'STOP TIME
                If cvsRpt.SetProperty("Stop Time", MyStopTime(TimeZoneCounter)) Then
                Else
                End If

                'Exports the Avaya report
                cvsRpt.FastLoad = True
                cvsRpt.ExportData myPath & "CallRecords" & ".CSV", 44, 0, True, True, True
                'Copy to SQL Server Box
                Set FSO = CreateObject("Scripting.FileSystemObject")
                If (FSO.FileExists(TSQLPath & "CallRecords" & ".CSV")) Then FSO.DeleteFile (TSQLPath & "CallRecords" & ".CSV")
                If (FSO.FileExists(myPath & "CallRecords" & ".CSV")) Then FSO.CopyFile myPath & "CallRecords" & ".CSV", TSQLPath & "CallRecords" & ".CSV"

                'Update Data in TSQl Server
                Call Update_SQL1

                If (FSO.FileExists(TSQLPath & "CallRecords" & ".CSV")) Then FSO.DeleteFile (TSQLPath & "CallRecords" & ".CSV")

                cvsRpt.Quit
            End If
        Next TimeZoneCounter

        MyStartDate = MyStartDate + 1
        Loop
        DoCmd.Close acForm, "FrmPleasewait"
        Call Update_SQL2
        Call AvayaLogout
End Sub

我已经在Powershell中将其转换为如下所示:

代码语言:javascript
复制
$cvsApp = New-Object -ComObject "ACSUP.cvsApplication"
$cvsCon = New-Object -ComObject "ACSCN.cvsConnection"
$cvsSrv = New-Object -ComObject "ACSUPSRV.cvsServer"
$Rep = New-Object -ComObject "ACSREP.cvsReport"

function Get-CallRecordDates {
some sql queries to get the dates I need to run it for
}

$dates = Get-CallRecordDates

$cvsCon.bAutoRetry = $true

$cvsApp.CreateServer("", "", "", "", $False, "ENU", [ref] $cvsSrv, [ref] $cvsCon) #Thank you HAL9256
$cvsCon.Login("", "", "", "ENU")
$cvsSrv.Reports.ACD = "1"

for($i=0; $i -lt $dates.Table.Rows.Count; $i++)
{
    $maindate = Get-Date "$(Get-Date $dates.Table.Rows.Item($i).Date -Format 'dd/MM/yyyy') $(Get-Date $dates.Table.Rows.Item($i).Time -Format 'HH:mm')"

    if($dates.Item($i).Commentary -eq "Last"){
        $startdatetime = $maindate.AddHours(-2)
        $enddatetime = Get-Date
        }else{
        $startdatetime = $maindate.AddHours(-1)
        $enddatetime = $maindate.AddHours(1)
    }

    $startdate = Get-Date $startdatetime -Format "dd/MM/yyyy"
    $starttime = Get-Date $startdatetime -Format "HH:mm"
    $enddate = Get-Date $enddatetime -Format "dd/MM/yyyy"
    $endtime = Get-Date $enddatetime -Format "HH:mm"

    $Info = $cvsSrv.Reports.Reports("Historical\Designer\Call Records SL")

    If($cvsSrv.Reports.CreateReport($Info,$Rep)){
        $Rep.TimeZone = "default"
        $Rep.SetProperty("Start Date",$startdate)
        $Rep.SetProperty("Start Time",$starttime)
        $Rep.SetProperty("Stop Date",$enddate)
        $Rep.SetProperty("Stop Time",$endtime)
        $Rep.FastLoad = $True
        $Rep.ExportData("C:\Users\me\Desktop\CallRecords$($i).csv", 44, 0, $True, $True, $True)
    }
    $dates = Get-CallRecordDates
}
$Rep.Quit()
$cvsCon.Logout()
$cvsCon.Disconnect()

对象$cvsSrv根本看不到连接。在$cvsSrv.Reports.ACD = "1“行失败,提示”在此对象上找不到属性'ACD‘。请验证该属性是否存在并且可以设置。“脚本使用$cvsSrv的任何行都会返回错误。

我试着上网找,但我觉得我是地球上唯一一个想要和Avaya和Powershell结婚的人……

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-10 23:15:45

经过多次尝试和错误,我无法让它工作,所以我放弃了,并尝试了一种不同的方法。下面是我使用PowerShell将数据从Avaya上传到SQL Server所运行的整个脚本:

代码语言:javascript
复制
if(Get-Module -ListAvailable -Name SqlServer) {} else {Install-Module -Name SqlServer -AllowClobber -Confirm:$False -Force} #installs SqlServer module if not installed

function Get-CallRecordDates {
Invoke-Sqlcmd -Query “SELECT [Date],[Time],[Commentary] FROM [CallRecords].[dbo].[ForSQLload] order by [Date],[Time]” -ServerInstance "myserver"
}

$dates = @(Get-CallRecordDates)

#declare where the csv files will be saved
$csv = "G:\SQLDataLoad\Avaya"

#declare where the .acsauto file will be saved
$acsauto = "G:\SQLDataLoad\Avaya\CallRecordsJS.acsauto"

#These will format the acsauto file just right
$blockstart = "'LANGUAGE=ENU
'SERVERNAME=AvayaServerAddress
Public Sub Main()

On Error Resume Next

cvsSrv.Reports.ACD = 1
Set Info = cvsSrv.Reports.Reports(`"Historical\Designer\Call Records SL`")

If Info Is not Nothing Then
"

$blockend = "If Not cvsSrv.Interactive Then cvsSrv.ActiveTasks.Remove Rep.TaskID
Set Rep = Nothing

End If
Set Info = Nothing

End Sub"

#Start creating the content for acsauto file
$contentacsauto = $blockstart

#looping through the missing records. If there are none, it will only download the latest data.
for($i=0; $i -lt $dates.Count; $i++)
{
    $maindate = Get-Date "$(Get-Date $dates.Item($i).Date -Format 'dd/MM/yyyy') $(Get-Date $dates.Item($i).Time -Format 'HH:mm')"

    if($dates.Item($i).Commentary -eq "Last"){
        $startdatetime = $maindate.AddHours(-3)
        $enddatetime = Get-Date
        Write-Host "Adding time range to the script; from $startdatetime to $enddatetime `nIt will be exported to $csv\CallRecords-$i.csv`nTime is $(Get-Date) now."
        }else{
        $startdatetime = $maindate.AddHours(-1)
        $enddatetime = $maindate.AddHours(1)
        Write-Host "Adding time range to the script as some CallID is missing in that period; from $startdatetime to $enddatetime `nIt will be exported to $csv\CallRecords-$i.csv"
    }

    #formating the dates and times for the parameters
    $startdate = Get-Date $startdatetime -Format "dd/MM/yyyy"
    $starttime = Get-Date $startdatetime -Format "HH:mm"
    $enddate = Get-Date $enddatetime -Format "dd/MM/yyyy"
    $endtime = Get-Date $enddatetime -Format "HH:mm"

    $MiddleBlock = "
If cvsSrv.Reports.CreateReport(Info,Rep) Then
Rep.TimeZone = `"default`"
Rep.SetProperty `"Start Date`",`"$startdate`"
Rep.SetProperty `"Start Time`",`"$starttime`"
Rep.SetProperty `"Stop Date`",`"$enddate`"
Rep.SetProperty `"Stop Time`",`"$endtime`"
b = Rep.ExportData(`"$csv\CallRecords-$i.csv`", 44, 0, True, True, True)
Rep.Quit
End If
"

    $contentacsauto = $contentacsauto + $MiddleBlock
}

$contentacsauto = $contentacsauto + $blockend

$contentacsauto | Out-File $acsauto -Encoding ascii

& $acsauto

$stop = (Get-Date).AddMinutes(10)

while (((Get-ChildItem $csv -Filter "CallRecord*.csv").Count -lt $i) -and ($(Get-Date) -lt $stop)) {Start-Sleep -Seconds 2}

if($(Get-Date) -ge $stop) {
    Write-Host "This thing timed out as it took longer than 10 minutes to export, at $(Get-Date)"
    Get-Process "acs*" | Stop-Process -PassThru | Out-Null}
else{
Write-Host "Saved $((Get-ChildItem $csv -Filter "CallRecord*.csv").Count) file(s) at $(Get-Date)"

Start-Sleep -Seconds 2

$csvfiles = Get-ChildItem $csv -Filter "CallRecord*.csv"

$callrecords = Import-Csv -Path $csvfiles | Sort-Object 'Call ID','Segment' -Unique

Remove-Item $csvfiles -Force | Out-Null

Invoke-Sqlcmd -Query "delete from CallRecords.dbo.TempCallDataTemp" -ServerInstance "myserver"

Write-SqlTableData -InputData $callrecords -ServerInstance "myserver" -DatabaseName "CallRecords" -SchemaName "dbo" -TableName "TempCallDataTemp" -force
}

基本上,我创建了一个"CallRecords.acsauto“文件,然后运行,等待所有的文件准备就绪(带有检查,如果它冻结了10分钟,它就会关闭它),导入它们并上传到sql server。然后,我调用一组sql命令对其进行格式化并将其复制到主表中。

票数 0
EN

Stack Overflow用户

发布于 2019-10-04 07:49:23

该消息暗示$csvSrv从未被赋予任何值

创建COM对象时,它们是空的。当您调用函数并将变量作为参数传递给它时,您必须传递变量by reference,以便函数获取对象并填充它。即

代码语言:javascript
复制
$cvsApp = New-Object -ComObject "ACSUP.cvsApplication"
$cvsCon = New-Object -ComObject "ACSCN.cvsConnection"
$cvsSrv = New-Object -ComObject "ACSUPSRV.cvsServer"
$Rep = New-Object -ComObject "ACSREP.cvsReport"

...

$cvsApp.CreateServer("login", "password", "", "server", $False, "ENU", [ref] $cvsSrv, [ref] $cvsCon)

同样,(从注释中)您将不得不对$Rep对象执行相同的操作:

代码语言:javascript
复制
...

$Info = $cvsSrv.Reports.Reports("Historical\Designer\Call Records SL")

...

If($cvsSrv.Reports.CreateReport($Info, [ref] $Rep)){
    $Rep.TimeZone = "default"
    ...

请注意,在这种情况下,您没有通过引用传递$Info。这是因为您直接将函数的返回值赋给了$Info变量。但对于$Rep,因为它是作为参数传递的,所以您必须通过[ref]传递它才能使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58221289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档