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