ValueFromPipelineByPropertyName не работает должным образом - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть функция, которая должна принимать либо набор имен серверов и баз данных, либо имен серверов, а также просматривать базы данных и сокращать их журналы транзакций.Когда я запускаю его, передавая набор имен серверов и баз данных, он работает нормально, когда я запускаю его, передавая только набор имен серверов, он не работает должным образом.

Я называю это так:

@([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 голосов
/ 21 ноября 2018

Проблема решена.Проблема заключалась в том, как я объявил параметры, которые создали посторонний набор параметров.Это работает как ожидалось:

Function Recover-LogSpace
{
[CmdletBinding()]
Param(
[parameter(ParameterSetName='Multiple')]
[parameter(ValueFromPipelineByPropertyName=$true,ParameterSetName='Single')]
[string[]]$SqlServer,  
[parameter(ValueFromPipelineByPropertyName=$true,ParameterSetName='Single')]
[string[]]$Database
)
0 голосов
/ 21 ноября 2018

В вашем конвейере есть массив массивов pscustomobjects, а не массив pscustomobjects.

Поскольку элементы в конвейерах (массивах) не имеют свойств sqlserver или database (элементы в массивах делаютхотя) привязка по имени свойства не происходит, а привязка по объекту происходит.

Изменение вызова на это заставляет его работать (потому что вы просто передаете массив pscustomobjects)

[pscustomobject]@{
SqlServer = "sqlserver1\instance"
} ,
[pscustomobject]@{
SqlServer = "sqlserver2\instance"
} | Recover-LogSpace
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...