Powershell函数返回无效对象

时间:2019-12-25 03:23:27

标签: powershell

这里有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
}

为什么我的功能不起作用(第一个示例)?这是该死的代码。

2 个答案:

答案 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
}
相关问题