2016-11-29 50 views
0

我與下面的類型在PowerShell中的工作:你可以使用強類型/版本化的powershell cmdlet參數,或類似C#的使用指令嗎?

Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 

我創建對象,通過他們周圍,從cmdlet的等等。這裏返回他們是一個例子:

Import-Module SQLPS 

function New-SQLSMORelocateFile { 
    [CmdletBinding()] 
    param (
     [Parameter(Mandatory=$true, Position=0)] 
     [ValidateNotNullOrEmpty()] 
     [string] $logicalName, 

     [Parameter(Mandatory=$true, Position=1)] 
     [ValidateNotNullOrEmpty()] 
     [string] $physicalName 
    ) 

    New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ` 
    -ArgumentList $logicalName, $physicalName 
} 

我想通過這種值插入到另一PowerShell命令,如下所示:

function Restore-SQLDatabaseFromDisk { 
    [CmdletBinding()] 
    Param (
     [Parameter(Mandatory=$false)] 
     [Microsoft.SqlServer.Management.Smo.RelocateFile] $overrideDataFile 
    ) 

    # Do stuff 
} 

但是,當我這樣做,我得到以下有用的錯誤:

PSInvalidCastException: Cannot convert the "Microsoft.SqlServer.Management.Smo.RelocateFile" value of type "Microsoft.SqlServer.Management.Smo.Re locateFile" to type "Microsoft.SqlServer.Management.Smo.RelocateFile". ArgumentTransformationMetadataException: Cannot convert the "Microsoft.SqlServer.Management.Smo.RelocateFile" value of type "Microsoft.SqlServer. Management.Smo.RelocateFile" to type "Microsoft.SqlServer.Management.Smo.RelocateFile". ParameterBindingArgumentTransformationException: Cannot process argument transformation on parameter 'overrideDataFile'. Cannot convert the "Micr osoft.SqlServer.Management.Smo.RelocateFile" value of type "Microsoft.SqlServer.Management.Smo.RelocateFile" to type "Microsoft.SqlServer.Management.Smo.RelocateFile".

我以前見過這個;這是因爲加載的「RelocateFile」版本與從我的New-SQLSMORelocateFile()返回的版本不匹配(這是SQLPS Restore-SqlDatabase cmdlet所必需的)。

每當我在我的模塊中使用「RelocateFile」類型,它總是需要是「Microsoft.SqlServer.Management.Smo.RelocateFile,Microsoft.SqlServer.SmoExtended,版本= 12.0.0.0,文化=中性,PublicKeyToken = 89845dcd8080cc91「類型,而不是由SQLPS加載的默認值。

有Powershell的相當於C#的‘使用’指令來覆蓋模塊中的類型的行爲的,如下面所示?:

https://msdn.microsoft.com/en-us/library/sf0df423.aspx

如在第三示例:using Project = PC.MyCompany.Project;

另外,有沒有一種方法可以定義特定版本的參數類型,如下所示:

function Restore-SQLDatabaseFromDisk { 
    [CmdletBinding()] 
    Param (
     [Parameter(Mandatory=$false)] 
     ["Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"] $overrideDataFile 
    ) 

    # Do stuff 
} 

以上顯然會產生語法錯誤,但我無法想出或找到一種方法來做到這一點。

+0

我的上帝,那工作!可以發誓我試過了,儘管我也可以將它作爲變量包裝(DRY'n)。謝謝! – Spikeh

+0

你也可以做Add-Type?有很好的閱讀http://www.madwithpowershell.com/2013/10/add-type-vs-reflectionassembly-in.html – demokritos

+0

我一直在玩Add-Type,但還沒有任何成功。我會閱讀那篇文章,看看我能不能找到任何地方。如果可能,仍然希望刪除所有重複類型聲明。 – Spikeh

回答

1

類型的文字語法允許完全限定的類型名稱,只是做:

param(
    [Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91]$MyParameter 
) 
+0

謝謝,我的名義愚蠢的監督 - 雖然我仍然想知道是否有一個使用指令等價物,或別名類型(也許通過添加類型)的方式,因爲我有很多我的模塊中引用該類型的幾個cmdlet - 維護噩夢。 – Spikeh

+0

有一個'using namespace'指令用於PowerShell 5.0中的新類功能,但我不認爲它支持您感興趣的用例 –

+0

有任何鏈接或示例?我所需要做的事實質上就是一類。該程序集已經加載,所以我不認爲Add-Type會在這裏工作。 – Spikeh

相關問題