如何让Powershell函数返回表格?

时间:2015-07-14 14:06:03

标签: function powershell return

我喜欢在PowerShell脚本中使用表格。因为如果我需要不同的表,它总是需要很多重复的代码来创建它们,所以我决定创建一个函数来返回一个功能齐全的表给我。

到目前为止,我的尝试看起来像这样:

>>> myval=3
>>> print myval
3

或者我试过:

Function MakeTable ($btab, $TableName, $ColumnArray)
{
$btab = New-Object System.Data.DataTable("$TableName")
foreach($Col in $ColumnArray)
  {
    $MCol = New-Object System.Data.DataColumn $Col;
    $btab.Columns.Add($MCol)
  }
}
$acol = @("bob","wob","trop")
$atab = $null
MakeTable $atab "Test" $acol

我使用相同的代码测试了两个版本:

Function MakeTable ($TableName, $ColumnArray)
{
$btab = New-Object System.Data.DataTable("$TableName")
foreach($Col in $ColumnArray)
  {
    $MCol = New-Object System.Data.DataColumn $Col;
    $btab.Columns.Add($MCol)

  }
return $btab
}
$acol = @("bob","wob","trop")
$atab = MakeTable "Test" $acol

两个人都遗憾地没有按照我的预期行事。

$aRow = $atab.NewRow()
$aRow["bob"] = "t1"
$aRow["wob"] = "t2"
$aRow["trop"] = "t3"
$atab.Rows.Add($aRow)
$atab 

你能帮助我吗?

修改

You cannot call a method on a null-valued expression.
At line:13 char:1
+ $aRow = $atab.NewRow()
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

这是我想要的,但不是真的。我认为有更好的方法。

2 个答案:

答案 0 :(得分:3)

要使代码正常工作,只需在返回后根据this solution添加逗号。

“return,$ btab”而不是“return $ btab”

默认情况下,它返回DataTable的可枚举内容,DataRows,在这种情况下为null,因为还没有创建DataRows。

DataTable对象之前的逗号($ btab)表示一个数组,其中$ btab本身是一个元素。但是没有为第一个元素(在逗号的左边)提供任何内容,因此管道外是唯一的另一个元素:DataTable本身。

    Function MakeTable ($TableName, $ColumnArray)
{
$btab = New-Object System.Data.DataTable("$TableName")
foreach($Col in $ColumnArray)
  {
    $MCol = New-Object System.Data.DataColumn $Col;
    $btab.Columns.Add($MCol)

  }
return , $btab
}

$acol = @("bob","wob","trop")
$atab = MakeTable "Test" $acol

$aRow = $atab.NewRow()
$aRow["bob"] = "t1"
$aRow["wob"] = "t2"
$aRow["trop"] = "t3"
$atab.Rows.Add($aRow)
$atab 

答案 1 :(得分:1)

如果练习的目的是简化,那么使用PSObject而不是DataTable要容易得多。像这样:

function MakeTable ($ColumnArray)
{
    $o = New-Object PSObject
    $ColumnArray | % {$o | Add-Member -MemberType NoteProperty -Name $_ -Value $null}
    $o
}

$atab = @()

$atab += MakeTable(@('bob','wob','trop')) | % {
    $_.bob = 't1'
    $_.wob = 't2'
    $_.trop = 't3'
    $_
}

$atab