在名为NewDB.ps1
的PowerShell脚本中考虑以下代码:
param ($i, $d)
Function New-Database
{
param ($instance, $name)
$db = New-Object Microsoft.SqlServer.Management.Smo.Database ($instance, $name)
try { $db.Create() }
catch [Exception] { $_.Exception | Format-list | Out-String ; exit }
$db.CreateDate.DateTime
$db.DatabaseOptions.RecoveryModel
return $db
}
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null
$sqlServer = new-Object Microsoft.SqlServer.Management.Smo.Server($i)
[Microsoft.SqlServer.Management.Smo.Database]$myDB = New-Database $sqlServer $d
我收到类型转换错误:
PS C:\Users\moomin\Documents> .\NewDB.ps1 "(local)" "testDB"
Cannot convert the "System.Object[]" value of type "System.Object[]" to type
"Microsoft.SqlServer.Management.Smo.Database".
At C:\Users\moomin\Documents\NewDB.ps1:21 char:1
+ [Microsoft.SqlServer.Management.Smo.Database]$myDB = New-Database $sqlServer $d
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : ConvertToFinalInvalidCastException
如何将对象作为Microsoft.SqlServer.Management.Smo.Database
对象从函数返回?我需要在函数之外用它做更多的事情。
更新
当然,感谢@mjolinor,这完全符合我的要求。顺便说一句,它也适用于New-Database
在一个单独的模块中(我实际上是如何实现它的。)
param ($i, $d)
Function New-Database
{
param ($instance, $name)
$db = New-Object Microsoft.SqlServer.Management.Smo.Database ($instance, $name)
try { $db.Create() }
catch [Exception] { $_.Exception | Format-list | Out-String ; exit }
$db
}
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null
$sqlServer = new-Object Microsoft.SqlServer.Management.Smo.Server($i)
$myDB = New-Database $sqlServer $d
$myDB.CreateDate.DateTime
$myDB.DatabaseOptions.RecoveryModel
答案 0 :(得分:3)
一个函数应该只返回一种类型的对象,它输出的任何东西都是返回的一部分,而不仅仅是返回的关键字,所以你的返回将是这3个对象的数组(这就是为什么它说的你的返回类型是Object [])
$db.CreateDate.DateTime
$db.DatabaseOptions.RecoveryModel
$db
如果你只想要$ db,只返回$ db。
答案 1 :(得分:2)
return关键字实际上仅供语法使用。如果在return关键字之前调用任何对象,它们也将返回。所以基本上你要返回一个对象列表,这正是错误告诉你的。
我们以此为例。此代码将返回$ y值的数组,但绝不会返回$ x。
function return-test {
$x = 1
$y = 2
write-host $x # Console output only
$x | out-null # Goes to null
$x > $null # Goes to null
[void] $x # Goes to null
$y # is returned
return $y # is returned, but now the return value is an array.
}
因此,您需要做的是决定使用$db.CreateDate.DateTime
和$db.DatabaseOptions.RecoveryModel
做什么。如果您只想在控制台上显示它们,请使用write-host
,如此...
function New-Database {
...
write-host $db.CreateDate.DateTime
write-host $db.DatabaseOptions.RecoveryModel
# You can use return if you prefer to see it.
# Either way, you want to return one value.
#return $db
$db
}