PowerShell ForEach循环仅返回一个结果

时间:2014-09-02 13:47:18

标签: arrays oracle powershell foreach scripting

我觉得也许我在这里忽略了一些简单的东西,但是我在PowerShell中遇到ForEach循环时遇到了麻烦,实际上返回了我期望的所有项目。我有一个脚本,它将查询Oracle数据库并收集基础数据集。收集完成后,我需要对返回的内容进行一些调整并构建一些额外的信息(目前不在脚本中,目前已完成基础知识)

我正在做的是将数据添加到数组,然后尝试使用ForEach循环检查数组中的每个项目并将该数据泵出到另一个数组,该数组将具有我需要填充的新属性基础数据集的一些计算。我得到的返回变量$ finaloutput只有一行数据(我在这里发布的示例我只是寻找一个等于CPOD-018的报告编号,其中有5个数据集中有不同的其他属性填充包括我填充的网站名称,但仍然只得到一个结果。)

我尝试使用ForEach循环中的嵌套if语句而不是管道Where-Object,但收到了相同的结果。以下是该脚本的当前版本,非常感谢任何帮助。

param(
    [parameter(mandatory=$True)]$username,
    [parameter(mandatory=$True)]$password
    )

# setup the finaloutput variable
$finaloutput = New-Object psobject

$finaloutput | Add-Member -MemberType NoteProperty -name ReportNumber -value NotSet
$finaloutput | Add-Member -MemberType NoteProperty -name sitename -value NotSet

# the connection string to be used by the OlEDB connection
$connString = @"
    Provider=OraOLEDB.Oracle;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST="host.host.host")(PORT="1521"))
    (CONNECT_DATA=(SERVICE_NAME="name.name.name")));User ID="$username";Password="$password"
"@

# the query that will be used to gather data from Oracle
$qry= @"
    select VP_EXPECTED_DETAILS.REPORTNUMBER, VP_EXPECTED_DETAILS.SITE_NAME, VP_ACTUAL_FILENAME_DETAILS.FILE_NAME, VP_EXPECTED_DETAILS.MAX_EXPECTED_LOAD_TIME, VP_EXPECTED_DETAILS.EXPECTED_FREQUENCY, 
    VP_EXPECTED_DETAILS.DATE_TIMING, VP_EXPECTED_DETAILS.FREQUENCY_DAY, VP_EXPECTED_DETAILS.JOB_NO, 
    TO_CHAR(VP_ACTUAL_RPT_DETAILS.GEN_PARSE_IN,'YYYYMMDDHH24MISS') AS GEN_PARSE_IN, 
    TO_CHAR(VP_ACTUAL_RPT_DETAILS.GEN_PARSE_OUT,'YYYYMMDDHH24MISS') AS GEN_PARSE_OUT, 
    TO_CHAR(VP_ACTUAL_RPT_DETAILS.ETLLOADER_IN,'YYYYMMDDHH24MISS') AS ETLLOADER_IN, 
    TO_CHAR(VP_ACTUAL_RPT_DETAILS.ETLLOADER_OUT,'YYYYMMDDHH24MISS') AS ETLLOADER_OUT

    from MONITOR.VP_EXPECTED_DETAILS

    LEFT JOIN MONITOR.VP_ACTUAL_RPT_DETAILS on VP_EXPECTED_DETAILS.REPORTNUMBER = VP_ACTUAL_RPT_DETAILS.REPORTNUMBER and VP_EXPECTED_DETAILS.SITE_NAME = VP_ACTUAL_RPT_DETAILS.SITE_NAME

    LEFT JOIN MONITOR.VP_ACTUAL_FILENAME_DETAILS on VP_ACTUAL_RPT_DETAILS.FNKEY = VP_ACTUAL_FILENAME_DETAILS.FNKEY where VP_EXPECTED_DETAILS.EXPECTED_FREQUENCY = 'DAILY' or 
    (VP_EXPECTED_DETAILS.EXPECTED_FREQUENCY = 'MONTHLY' AND VP_EXPECTED_DETAILS.FREQUENCY_DAY = EXTRACT(DAY from SYSDATE))
"@

# the function that will open the database connection and execute the query
function Get-OLEDBData ($connectstring, $sql) {
    $OLEDBConn = New-Object System.Data.OleDb.OleDbConnection($connectstring)
    $OLEDBConn.open()
    $readcmd = New-Object system.Data.OleDb.OleDbCommand($sql,$OLEDBConn)
    $readcmd.CommandTimeout = '300'
    $da = New-Object system.Data.OleDb.OleDbDataAdapter($readcmd)
    $dt = New-Object System.Data.DataTable
    [void]$da.fill($dt)
    $OLEDBConn.close()
    return $dt
}

# populate $output with the data from the Get-OLEDBData function
$output = Get-OLEDBData $connString $qry

# build the final output that will generate alerts
ForEach ($lines in $output | Where-Object {$_.reportnumber -eq "CPOD-018"})
    {
        $finaloutput.reportnumber = $lines.reportnumber
        $finaloutput.sitename = $lines.SITE_NAME
    }

$finaloutput

1 个答案:

答案 0 :(得分:2)

看起来正在发生的事情是你正在不正确地创建对象。在foreach循环内部,您可以覆盖相同的值而不是附加新对象

看起来应该更像这样:

$FinalOutput = ForEach ($lines in $output | Where-Object {$_.reportnumber -eq "CPOD-018"})
    {
        $Prop = @{
        'reportnumber' = $lines.reportnumber
        'sitename' = $lines.SITE_NAME
        }
        New-Object -Type PSObject -Property $Prop
    }
$FinalOutput

您需要在脚本的前面注释掉最终输出行。