我想知道是否对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
的简化