我與下面的類型在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
}
以上顯然會產生語法錯誤,但我無法想出或找到一種方法來做到這一點。
我的上帝,那工作!可以發誓我試過了,儘管我也可以將它作爲變量包裝(DRY'n)。謝謝! – Spikeh
你也可以做Add-Type?有很好的閱讀http://www.madwithpowershell.com/2013/10/add-type-vs-reflectionassembly-in.html – demokritos
我一直在玩Add-Type,但還沒有任何成功。我會閱讀那篇文章,看看我能不能找到任何地方。如果可能,仍然希望刪除所有重複類型聲明。 – Spikeh