powershell - 为什么 powershell 不保留 native 类型?

标签 powershell powershell-3.0 smo

考虑名为 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

最佳答案

一个函数应该只返回一种类型的对象,它输出的任何东西都是返回的一部分,而不仅仅是 Return 关键字后面的内容,所以你的返回将是这 3 个对象的数组(这就是为什么它说你的返回类型是对象[])

 $db.CreateDate.DateTime
 $db.DatabaseOptions.RecoveryModel
 $db

如果你只想要$db,只返回$db。

关于powershell - 为什么 powershell 不保留 native 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21713411/

相关文章:

c# - 使用 ObjectList 时通过 SMO 传输数据失败

arrays - 将 JSON 数组索引列值转置为行并导出为 CSV

powershell - 调用Invoke-WebRequest时报错 'The operation has timed out'

html - DotAll 和多行正则表达式

powershell - 使用 ref 关键字按引用传递变量

c# - 如何获取Sql Server系统消息的返回值?

powershell - 使用PowerShell和SMO库从.BAK文件创建新数据库

powershell - New-Object 上的 Windows RT Powershell(权限被拒绝)

powershell - 如何处理比较对象结果?

powershell - 如何仅使用CIM cmdlet(不使用WMI cmdlet)在Powershell中创建VSS卷影副本?