如何确定进程是否位于流水线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
答案 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