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

时间:2014-09-08 18:37:42

标签: 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

5 个答案:

答案 0 :(得分:4)

我可能会建议一种不同的方法,不知道它是否是最后一项?

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

注意最后一行。 ForEach-Object调用的结果(所有&#34;无逗号&#34;结果)将由,个字符加入。

如果这不是您正在寻找的内容,您能解释一下您希望如何使用最终结果吗?

答案 1 :(得分:2)

如果您还没有生成数组,那么您可能需要执行完整的构造而不是使用foreach。

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

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

但是,在你的情况下,因为你已经有了存储在$ SchemaColumn中的数组,所以你可以使用管道做同样的事情..它看起来像:

if ($_ -eq $SchemaColumn[-1]) { 'stuff' }

答案 2 :(得分:2)

简单的解决方案。如果您知道项目总数,可以使用计数器与以下项进行比较:

foo(PINS(STRIP0));

答案 3 :(得分:1)

或者你可以跳过检查以查看它是否是最后一列,然后只修剪尾随逗号。

ForEach($table in $Tables)
{ 
$SchemaColumn = $Connection.GetSchema("Columns")
    $listarray = $schemaColumn | Where{$_.Table_Name -eq $Table} |
        foreach-Object {"$($_.COLUMN_Name) $(Get-DataType($_.DATA_TYPE)), "}
    $ListArray | ForEach{$_ = $_.TrimEnd(, )}
} #end Foreach-Object

答案 4 :(得分:0)

将每列的信息作为字符串返回。这将创建一个数组,此时您可以使用PowerShell的-join运算符将它们与逗号连接。

foreach( $table in $Tables )
{
    $columns = $Connection.GetSchema('Columns') | 
                    Where-Object { $_.TABLE_NAME -eq $table } |
                    ForEach-Object { '{0} {1}' -f $_.COLUMN_Name,(Get-DataType $_.DATA_TYPE) }
    $columns -join ', '
}

看起来你正在编写某种类型的报告。您是否考虑过返回对象而不是返回字符串?

$Connection.GetSchema('Columns') | 
    Select-Object -Property 'COLUMN_NAME',@{ Name = 'DATATYPE'; Expression = { Get-DataType $_.DATA_TYPE }},'TABLE_NAME'

然后有人可以这样做:

Get-Column |
    Sort-Object 'TABLE_NAME' |
    Format-Table -AutoSize -GroupBy 'TABLE_NAME' |
    Set-Content 'schema.txt'

或者这个:

Get-Column |
    Export-Csv

或者这个:

Get-Column |
    Sort-Object -Property 'TABLE_NAME' |
    Format-Table