首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么powershell不保留本机类型?

为什么powershell不保留本机类型?
EN

Stack Overflow用户
提问于 2014-02-11 21:29:06
回答 2查看 651关注 0票数 1

考虑一下名为NewDB.ps1的powershell脚本中的以下代码

代码语言:javascript
复制
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

我得到一个类型转换错误:

代码语言:javascript
复制
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一起工作也很好(我是如何实际实现它的)。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-11 21:37:43

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

代码语言:javascript
复制
 $db.CreateDate.DateTime
 $db.DatabaseOptions.RecoveryModel
 $db

如果您只想要$db,则只返回$db。

票数 3
EN

Stack Overflow用户

发布于 2014-02-12 01:13:32

返回关键字实际上只是用于语法使用。如果在return关键字之前调用任何对象,它们也将返回。从本质上说,您是在返回一个对象列表,这正是错误告诉您的。

让我们以这个为例。这段代码将返回一个$y值数组,但绝不返回$x。

代码语言:javascript
复制
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 .

代码语言:javascript
复制
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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21713411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档