Powershell函数限制数据类型

时间:2016-10-27 14:57:19

标签: powershell smo

尝试创建如下函数:

Function Get-SqlErrorLogPrevious24 {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory=$True,Position=1)]
        [Microsoft.SqlServer.Management.Smo.Server]$Server
    )

    ($Server.ReadErrorLog()).where{$_.logdate -ge ((Get-Date).AddHours(-24))}
}

我注意到的是,我只能传入一个字符串而不是Server对象。

Powershell中是否有一种方法可以强制执行传入的数据类型,或者它是否总是隐式地将字符串转换为SMO对象?

2 个答案:

答案 0 :(得分:4)

您可以实现自定义转换属性,如果类型不同,则会引发异常:

Add-Type @'
    using System;
    using System.Management.Automation;
    public class EnforceTypeAttribute : ArgumentTransformationAttribute {
        private Type type;
        public EnforceTypeAttribute(Type type) {
            this.type=type;
        }
        public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) {
            if(type.IsInstanceOfType(inputData)) {
                return inputData;
            } else {
                throw new Exception("Incorrect type.");
            }
        }
    }
'@

function f {param([int]$i) $i}
function g {param([EnforceType([int])][int]$i) $i}

f  1  #OK
f '1' #OK
g  1  #OK
g '1' #Error

答案 1 :(得分:3)

没有。 PowerShell有几个“策略”,用于确保您在函数中收到的内容是正确的类型。如果它可以使用其中一个将传递的值(在本例中为字符串)转换为所需类型(SMO对象),它将执行此操作。

这是great post which lists 10 different strategies.

  
      
  1. 直接分配。如果您的输入可以直接分配,只需将输入转换为该类型。
  2.   
  3. 基于语言的转换。这些基于语言的转换是在目标类型为void,Boolean,String,Array,Hashtable,PSReference(即:[ref]),XmlDocument(即: [XML])。委托(支持ScriptBlock委派转换)和Enum。
  4.   
  5. 解析转换。如果目标类型定义了接受该输入的Parse()方法,请使用该方法。
  6.   
  7. 静态创建转换。如果目标类型定义了接受该输入的static :: Create()方法,请使用该方法。
  8.   
  9. 构造函数转换。如果目标类型定义了一个接受输入的构造函数,请使用它。
  10.   
  11. 转换转换。如果目标类型从源类型定义隐式或显式转换运算符,请使用它。如果源类型为目标类型定义隐式或显式强制转换运算符,请使用它。
  12.   
  13. IConvertible conversion。如果源类型定义了一个知道如何转换为目标类型的IConvertible实现,请使用它。
  14.   
  15. IDictionary转换。如果源类型是IDictionary(即:Hashtable),请尝试使用其默认构造函数创建目标类型的实例,然后使用IDictionary中的名称和值设置源对象的属性。
  16.   
  17. PSObject属性转换。如果源类型是PSObject,请尝试使用其默认构造函数创建目标类型的实例,然后使用PSObject中的属性名称和值来设置属性在源对象上。 。如果名称映射到方法而不是属性,则以值作为参数调用该方法。
  18.   
  19. TypeConverter转换。如果有可以处理转换的已注册TypeConverter或PSTypeConverter,请执行此操作。您可以通过types.ps1xml文件注册TypeConverter(请参阅:$ pshome \ Types.ps1xml),或通过Update-TypeData注册。
  20.