我喜欢在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
这是我想要的,但不是真的。我认为有更好的方法。
答案 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