ValueFromPipelineByPropertyName不能按预期运行

时间:2018-11-20 20:34:07

标签: powershell

我有一个函数,该函数应该采用服务器和数据库名称或服务器名称的集合,并遍历数据库并缩小其事务日志。当我运行它传递服务器和数据库名称的集合时,它运行良好,当我运行它传递服务器名称和数据库名称的集合时,它不能按预期运行。

我这样称呼它:

@([pscustomobject]@{
SqlServer = "sqlserver1\instance"
}) ,
@([pscustomobject]@{
SqlServer = "sqlserver2\instance"
}) | Recover-LogSpace

我收到以下消息:

Working on database @{SqlServer=sqlserver2\instance}
Connecting to @{SqlServer=sqlserver1\instance}
Working on database @{SqlServer=Tsqlserver1\instance}

函数是:

Function Recover-LogSpace
{
    [CmdletBinding()]
    Param(
[parameter(ParameterSetName='Multiple')]
[parameter(ValueFromPipelineByPropertyName=$true,ValuefromPipeline=$True,ParameterSetName='Single')]
[string[]]$SqlServer,  
[parameter(ParameterSetName='Single')]
[parameter(ValueFromPipelineByPropertyName=$true,ValuefromPipeline=$True)]
[string[]]$Database
)
BEGIN {
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null
}
PROCESS {
    foreach($server in $SqlServer) {
    "Connecting to $server"
    $srv = New-Object Microsoft.SqlServer.Management.Smo.Server $Server
        if($Database) {
        "Working on database $Database"
        $srv.Databases[$Database] | ?{ $_.Shrink(2,[Microsoft.SqlServer.Management.Smo.ShrinkMethod]'TruncateOnly') }
        }
        else {
        "Working on all databases on server"
        $srv.Databases | ?{ $_.ID -gt "4" -And $_.IsAccessible -eq $True -And $_.ReadOnly -eq $False  } | ?{ $_.Shrink(2,[Microsoft.SqlServer.Management.Smo.ShrinkMethod]'TruncateOnly') }
        }
    }
}
END {
}

}

2 个答案:

答案 0 :(得分:0)

您的管道具有一组pscustomobjects数组,而不是pscustomobjects数组。

由于管道(数组)中的项目不具有sqlserver或数据库属性(尽管数组中的元素具有),所以不会发生按属性名称的绑定,而按对象的绑定则不会。

更改调用使其可以工作(因为您只是传递了pscustomobjects数组)

[pscustomobject]@{
SqlServer = "sqlserver1\instance"
} ,
[pscustomobject]@{
SqlServer = "sqlserver2\instance"
} | Recover-LogSpace

答案 1 :(得分:0)

问题已解决。 问题是我声明的参数创建了多余的参数集的方式。可以按预期工作:

Function Recover-LogSpace
{
[CmdletBinding()]
Param(
[parameter(ParameterSetName='Multiple')]
[parameter(ValueFromPipelineByPropertyName=$true,ParameterSetName='Single')]
[string[]]$SqlServer,  
[parameter(ValueFromPipelineByPropertyName=$true,ParameterSetName='Single')]
[string[]]$Database
)