2016-11-29 48 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

相关问题