这里有2个等效的代码示例,唯一的区别是第一个示例使用函数,而其他示例不使用函数。
此代码失败,因为函数返回无效的对象:
function Initialize-Table
{
param (
[parameter(Mandatory = $false)]
[string] $TableName = "InstallationTable"
)
# Create Table object
$InstallTable = New-Object System.Data.DataTable "$TableName"
# Define Columns
$UserColumn = New-Object System.Data.DataColumn User, ([string])
$InstallColumn = New-Object System.Data.DataColumn InstallRoot, ([string])
# Add the Columns
$InstallTable.Columns.Add($UserColumn)
$InstallTable.Columns.Add($InstallColumn)
return $InstallTable
}
Write-Host "Initialize-Table"
Write-Host "***************************"
$InstallTable = Initialize-Table
if (!$InstallTable)
{
Write-Warning "Table not initialized"
exit
}
但是,以下内容完全相同,只是将功能代码直接放入脚本中,并且该表有效!
Write-Host "Initialize-Table"
Write-Host "***************************"
$TableName = "InstallationTable"
# Create Table object
$InstallTable = New-Object System.Data.DataTable "$TableName"
# Define Columns
$UserColumn = New-Object System.Data.DataColumn User, ([string])
$InstallColumn = New-Object System.Data.DataColumn InstallRoot, ([string])
# Add the Columns
$InstallTable.Columns.Add($UserColumn)
$InstallTable.Columns.Add($InstallColumn)
if (!$InstallTable)
{
Write-Warning "Table not initialized"
exit
}
为什么我的功能不起作用(第一个示例)?这是该死的代码。
答案 0 :(得分:1)
这对我有用:
return ,$InstallTable
逗号运算符创建具有1个成员的数组。返回时它将展开,使$ InstallTable对象保持不变。
答案 1 :(得分:1)
根据PowerShell的官方文档,即使没有包含Return关键字的语句,每个语句的结果也将作为输出返回。诸如C或C#之类的语言仅返回return关键字指定的一个或多个值。
但是当您从脚本块或函数返回集合时, PowerShell会自动展开成员,然后将其传递给 时间通过管道。这是由于PowerShell一次一次 处理
。
要强制脚本块或函数将集合作为单个对象返回到管道,请使用一元数组表达式或带有NoEnumerate参数的写入输出
例如return Write-Output -NoEnumerate $InstallTable;
或返回(,$ InstallTable);
因此下面的代码片段效果很好
function Initialize-Table
{
param (
[parameter(Mandatory = $false)]
[string] $TableName = "InstallationTable"
)
# Create Table object
$InstallTable = New-Object System.Data.DataTable "$TableName"
# Define Columns
$UserColumn = New-Object System.Data.DataColumn User, ([string])
$InstallColumn = New-Object System.Data.DataColumn InstallRoot, ([string])
# Add the Columns
$InstallTable.Columns.Add($UserColumn)
$InstallTable.Columns.Add($InstallColumn)
return Write-Output -NoEnumerate $InstallTable;
}
Write-Host "Initialize-Table"
Write-Host "***************************"
$InstallTable = Initialize-Table
if (!$InstallTable)
{
Write-Warning "Table not initialized"
exit
}