你能使用强类型/版本化的powershell cmdlet参数,还是使用类似C#的using指令?

时间:2016-11-29 11:09:15

标签: sql-server powershell smo

我在powershell中使用以下类型:

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 cmdlet,如下所示:

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

    # Do stuff
}

但是当我这样做时,我得到以下有用的错误:

  

PSInvalidCastException:无法转换   " Microsoft.SqlServer.Management.Smo.RelocateFile"类型的价值   " Microsoft.SqlServer.Management.Smo.Re locateFile"输入   " Microsoft.SqlServer.Management.Smo.RelocateFile&#34 ;.         ArgumentTransformationMetadataException:无法转换" Microsoft.SqlServer.Management.Smo.RelocateFile"类型的价值   " Microsoft.SqlServer。 Management.Smo.RelocateFile"输入   " Microsoft.SqlServer.Management.Smo.RelocateFile&#34 ;.         ParameterBindingArgumentTransformationException:无法处理参数' overrideDataFile'的参数转换。不能   转换" Micr osoft.SqlServer.Management.Smo.RelocateFile"值   类型" Microsoft.SqlServer.Management.Smo.RelocateFile"输入   " Microsoft.SqlServer.Management.Smo.RelocateFile"

我之前见过这个;它是因为加载了#34; RelocateFile"版本与我的New-SQLSMORelocateFile()返回的版本不匹配(这是SQLPS Restore-SqlDatabase cmdlet所必需的。)

每当我使用" RelocateFile"键入我的模块,总是需要是" Microsoft.SqlServer.Management.Smo.RelocateFile,Microsoft.SqlServer.SmoExtended,Version = 12.0.0.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91"输入,而不是SQLPS加载的默认值。

是否有一个Powershell等同于C#"使用"指令来覆盖模块中类型的行为,如下所示:?

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

与第3个例子中一样: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
}

上述情况显然会产生语法错误,但我无法想出办法或找到方法。

1 个答案:

答案 0 :(得分:1)

类型文字语法允许完全限定的类型名称,只需执行:

while (reader.Read())