Powershell函数限制数据类型

Powershell函数限制数据类型,powershell,smo,Powershell,Smo,尝试创建如下所示的函数: Function Get-SqlErrorLogPrevious24 { [CmdletBinding()] Param ( [Parameter(Mandatory=$True,Position=1)] [Microsoft.SqlServer.Management.Smo.Server]$Server ) ($Server.ReadErrorLog()).where{$_.logdate -ge ((

尝试创建如下所示的函数:

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))}
}
不过我注意到,我可以只传入一个字符串,而不是一个服务器对象


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

否。PowerShell有几种“策略”,用于确保您在函数中收到的是正确的类型。如果它可以使用其中一个来将传递的值(在本例中为字符串)转换为所需的类型(SMO对象),那么它就会这样做

这是一个

  • 直接赋值。如果您的输入是可直接赋值的,只需将您的输入转换为该类型即可
  • 基于语言的转换。这些基于语言的转换在目标类型为void、Boolean、String、Array、Hashtable、PSReference(即:[ref])、XmlDocument(即:[xml])时完成。委托(以支持ScriptBlock到委托的转换)和枚举
  • 解析转换。如果目标类型定义了接受该输入的Parse()方法,请使用该方法
  • 静态创建转换。如果目标类型定义了接受该输入的Static::Create()方法,请使用该方法
  • 构造函数转换。如果目标类型定义了接受您输入的构造函数,请使用该构造函数
  • 转换转换。如果目标类型从源类型定义了隐式或显式转换运算符,请使用该运算符。如果源类型为目标类型定义了隐式或显式强制转换运算符,请使用该运算符
  • IConvertible转换。如果源类型定义了知道如何转换为目标类型的IConvertible实现,请使用该实现
  • IDictionary转换。如果源类型是IDictionary(即:哈希表),请尝试使用其默认构造函数创建目标类型的实例,然后使用IDictionary中的名称和值设置源对象的属性
  • PSObject属性转换。如果源类型是PSObject,请尝试使用其默认构造函数创建目标类型的实例,然后使用PSObject中的属性名称和值设置源对象的属性。如果一个名称映射到一个方法而不是属性,则使用该值作为其参数调用该方法
  • 类型转换器转换。如果有注册的TypeConverter或PSTypeConverter可以处理转换,请执行该操作。您可以通过types.ps1xml文件(请参阅:$pshome\types.ps1xml)或更新TypeData来注册类型转换器

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

    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