2015-07-10 102 views
2

您可以创建一段脚本,它可以工作一段时间,然后突然变为“您无法在空值表达式上调用方法”或“在该对象上找不到属性的属性名称”,验证属性是否存在并可以设置。“这是什么意思?您无法调用空值表达式的方法 - 一般

回答

2

这是“空指针异常”的Powershell版本。每次尝试查询显示为空的变量时都会出现此异常。要确定哪个变量是空的,哪里,你需要读取堆栈轨迹和该行中的行/符号号。举例:

You cannot call a method on a null-valued expression. 
At E:\temp\testsest.ps1:35 char:12 
+   If($Search.value() -contains $SearchString) 
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
+ FullyQualifiedErrorId : InvokeMethodOnNull 

让我们来解析错误信息。首先,在这个问题的标题中有一个措词。如果您要用这个措辞提出问题,您将得到一组由StackOverflow提出的类似问题。但是错误描述中有更多。第二行显示生成此异常的表达式的第一个字符的脚本,行和字符编号。在这里,请求$Search.value()查询它是否为-contains $SearchString。波浪下划线将表达全部分开,但正确的方式仅强调$Search.value()。接下来,有一个CategoryInfoFullyQualifiedErrorId,后者说“空值调用方法”,省略“指针”或“变量”。

现在,我们来调试消息。在这里,即将被调用的唯一方法是value(),这意味着$Search等于null。因此,我们需要从脚本的第35行开始向上寻找一个值,该值最后被分配给所讨论的变量。如果与搜索的字符串不匹配,此特定脚本对Range.Find()的查询返回null。摘录如下:

$Excel = New-Object -ComObject Excel.Application 
$Excel.Visible = $true 
$ExcelWorkBook = $Excel.Workbooks.Open($ExcelPath) 
$ExcelWorkSheet = $Excel.WorkSheets.item("$location") 


$Range = $ExcelWorkSheet.Range("A1").EntireColumn 
$Search = $Range.find($user) # <<< here we get null 

If($Search.value() -contains $user) 

因此,我们发现我们在哪里收到null。

补救办法各不相同,但都包括对照$null的支票。在这种情况下,检查$Search为空就足够了,如果它确实为null,则返回“Nothing found”。这可能不是那么简单,可能有更多的结构可能为空,如在$a.b.c.someMethod()中 - 此处为$a,$a.b$a.b.c为空,因此您需要检查所有结果。还有一种情况是,返回一个复杂的结构,并且预期在某个字段中具有值,但该字段未填充,因此尝试使用该字段的值会产生异常。

道德是:如果您收到一个关于“无效值”的例外说法,您并没有预料到返回null的情况,并且您必须在尝试之前添加对空值(或实际上任何意外)值的检查使用结果。