如何从管道foreach-object cmdlet识别最后一项

Jen*_*son 4 powershell

如何确定流程是否在管道化的ForEach-Object cmdlet的最后一项上?

示例:假设我之前已经定义了OLEDB到Access数据库的连接,以获取每个本地表的列定义。我想用逗号定界符列出所有这些列-除了处理LAST列时。我想省略逗号。

  ForEach($table in $Tables)
    { 
    $SchemaColumn = $Connection.GetSchema("Columns")
     $listarray = $schemaColumn |
     foreach-Object {

        If($_.Table_Name -eq $Table) { 

            IF "Last Item in Pipeline"   <---------------------------what would go here?
                {
                 "$($_.COLUMN_Name) $(Get-DataType($_.DATA_TYPE))"   <---- no comma!
                }
            ELSE   ## not the end of pipeline listing
                {
                 "$($_.COLUMN_Name) $(Get-DataType($_.DATA_TYPE)), "  <----yes comma!
                }
        }
     } #end Foreach-Object
Run Code Online (Sandbox Code Playgroud)

Noa*_*rks 8

如果您还没有生成数组,您会想要做一个完整的构造而不是管道到 foreach。

$testarray = 1..10
Foreach ($Item in $TestArray) 
{
    if ($Item -eq $testarray[-1])
    { "last item in array is $Item"}
}
Run Code Online (Sandbox Code Playgroud)

澄清一下,每次遍历数组时,它都会检查 $item 是否与 $testarray 中的最后一项匹配。[-1] 选择数组中的最后一项

但是,在您的情况下,由于您已经将数组存储在 $SchemaColumn 中,您可以使用管道执行与我上面所说的相同的操作..它看起来像:

if ($_ -eq $SchemaColumn[-1]) { 'stuff' }
Run Code Online (Sandbox Code Playgroud)


bri*_*ist 5

我可能会建议一种不依赖于是否不是最后一项的不同方法吗?

ForEach($table in $Tables)
{ 
$SchemaColumn = $Connection.GetSchema("Columns")
 $listarray = $schemaColumn |
 foreach-Object {

    If($_.Table_Name -eq $Table) { 
             "$($_.COLUMN_Name) $(Get-DataType($_.DATA_TYPE))"  # <---- no comma!
    }
 } -join ',' #end Foreach-Object
Run Code Online (Sandbox Code Playgroud)

注意最后一行。ForEach-Object调用结果(所有“无逗号”结果)将由,字符连接。

如果这不是您想要的,您可以解释一下如何使用最终结果吗?