你可以使用强类型/版本化的powershell cmdlet参数,或类似C#的使用指令吗?
我与下面的类型在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
}
以上显然会产生语法错误,但我无法想出或找到一种方法来做到这一点。
类型的文字语法允许完全限定的类型名称,只是做:
param(
[Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91]$MyParameter
)
我的上帝,那工作!可以发誓我试过了,尽管我也可以将它作为变量包装(DRY'n)。谢谢! – Spikeh
你也可以做Add-Type?有很好的阅读http://www.madwithpowershell.com/2013/10/add-type-vs-reflectionassembly-in.html – demokritos
我一直在玩Add-Type,但还没有任何成功。我会阅读那篇文章,看看我能不能找到任何地方。如果可能,仍然希望删除所有重复类型声明。 – Spikeh