2014-02-11 48 views
1

考慮PowerShell腳本下面的代碼名爲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對象?我需要在功能之外做更多的事情。

UPDATE 當然,感謝@ 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 

回答

3

一個函數應該只返回一個類型的對象,以及任何它輸出的是回報,而不僅僅是接下來Return關鍵字的一部分,所以你的回報將是這3個對象的數組(這這就是爲什麼它說你的返回類型是Object [])

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

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

+0

如果我有對象的數組返回,我可以檢查對象的數組,並與Smo.Database對象工作?在問題的更新中添加了我的完整解決方案。 –

2

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 
} 
相關問題