【问题标题】:PowerShell ForEach loop returning only One ResultPowerShell ForEach 循环仅返回一个结果
【发布时间】:2014-10-26 19:30:47
【问题描述】:

我觉得我可能在这里忽略了一些简单的事情,但是我在 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

【问题讨论】:

  • 尝试 $outputFiltered = $output | Where-Object {$_.reportnumber -eq "CPOD-018"}) then: foreach ($lines in $output) etc...
  • 虽然您的建议将为我提供 $outputfiltered 内的正确输入数据集,但它并不能满足我仍然遍历每个对象并对返回的数据执行操作的需要。我最终需要做的是获取数组中的一个值,并根据我将使用的每个项目的值设置日期/时间值。使用您的建议仍然只返回 FinalOutput 变量中的一个对象。

标签: arrays oracle powershell foreach scripting


【解决方案1】:

看起来正在发生的事情是您错误地创建了对象。在 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

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

【讨论】:

  • 非常感谢,我知道这将是我所缺少的一些简单的东西,您的建议让我重回正轨,非常感谢!
  • 太棒了,很高兴我能帮上忙。
猜你喜欢
  • 2020-05-06
  • 2021-09-24
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 2013-12-15
  • 1970-01-01
相关资源
最近更新 更多