我有一个函数,该函数应该采用服务器和数据库名称或服务器名称的集合,并遍历数据库并缩小其事务日志。当我运行它传递服务器和数据库名称的集合时,它运行良好,当我运行它传递服务器名称和数据库名称的集合时,它不能按预期运行。
我这样称呼它:
@([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 {
}
}
答案 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
)