【问题标题】:PowerShell Invoke returns array instead of intPowerShell 调用返回数组而不是 int
【发布时间】:2021-10-20 10:05:01
【问题描述】:

我有以下 PowerShell 的 sn-p:

$property = @{
    Getter = { 80 };
}

$value = $property.Getter.Invoke() 
$value.GetType() # Shows Name = Collection'1 instead of int

我希望$value.GetType() 返回Int32,但它会返回一个集合。

我不能只取元素 [0],因为有时 Getter 函数会返回一个数组。

我该如何解决这个问题?

【问题讨论】:

  • 适用于防止展开的标准技巧:(,$value)[0] 将为您提供返回集合的第一个元素(并且它总是返回一个集合,因为这是 ScriptBlock.Invoke() 的签名),而无需急切地展开它,如果它是可枚举的。
  • 这能回答你的问题吗? Why does invoking a Powershell script block with .Invoke() return a collection?: $property.Getter.InvokeReturnAsIs().GetType()

标签: powershell


【解决方案1】:

您可以通过这种方式严格声明返回值的类型。例如,返回类型将是Double

cls
$property = @{
    Getter = [Func[Double]]{ 80 }
}

$value = $property.Getter.Invoke() 
$value.GetType().Name
# Double

【讨论】:

  • 准确地说,这并没有声明返回类型,而是将Getter 设为Func<double> 而不是ScriptBlock,因此使用了非常不同的Invoke 方法.如果您想用 Getter 做其他事情而不是调用它(例如检索 AST),这将变得相关。
  • 顺便说一句,您也可以简单地使用unary comma operator$property = @{ Getter = ,{ 80 } }
  • @JeroenMostert , @JeroenMostert , Func<TResult> TResult:返回值的类型。 docs.microsoft.com/en-us/dotnet/api/…
  • 是的,当然泛型参数是分配给GetterFunc的返回类型,但这与声明脚本块返回的值的类型不同(例如Getter = { [double] 80 },这当然不能解决问题,因为它仍然是 ScriptBlock))。重要的是要注意这些东西在语义上是非常不同的,它们只是碰巧都有Invoke 方法——$property.Getter.GetType() 在两种情况下都是不同的。请注意,您也可以将其声明为 Func[Object] 甚至 Func[bool] -- PowerShell 不反对强制转换。
猜你喜欢
  • 1970-01-01
  • 2015-03-03
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多