最近开始发生'method Invocation failed'处理系统对象



我想知道是否对PowerShell进行了某种更新,这会导致下面开始抛出调用失败,因为它不再隐式地将对象识别为字符串。IndexOf方法用于从数据集动态构建查询字符串。

在过去的几年里,下面的语句每天都没有问题地执行:

$phishEvents | %{
....
Foreach($name in $names.name) {
if ($_.$($name).IndexOf("'") -gt 0) { $_.$($name) = $_.$($name).Replace("'","''")}
}
...
}

今天它开始抛出一个异常,声明它不再识别那些非字符串字段的IndexOf

我结束了对语句的包装,以便在语句之前检查类型——如下所示:

if (($_.$($name).GetType().FullName) -eq "System.String") {
if ($_.$($name).IndexOf("'") -gt 0) { $_.$($name) = $_.$($name).Replace("'","''")}
}

我的问题是,是否有某种变化,现在阻止PowerShell从这种类型的隐式转换?然而,我知道依赖于逻辑的隐式转换是一种糟糕的做法;我很想知道其他人是否也注意到了同样的问题。

使用PSVersion 5.1.19041.1682

谢谢!

在这方面没有任何改变:

  • 在变量值/表达式上调用方法只有当该值/结果是一个实际具有这种方法的。net类型时才会成功。

测试给定值是否为给定.NET类型的实例的一种更简单、更有效的方法是使用-is操作符:

if ($_.$name -is [string] -and $_.$name.IndexOf("'") -gt 0) { 
$_.$name = $_.$name.Replace("'","''")}
}

注意精简的逻辑和$_.$($name)$_.$name的简化

最新更新