你创建一个脚本,它工作了一段时间,然后突然开始崩溃“你不能在空值表达式上调用一个方法”或者在这个对象上找不到“属性'属性名'确认该属性存在且可以设置。“这是什么意思?
答案 0 :(得分:2)
这是"空指针异常"的Powershell版本。每次尝试查询看似为null的变量时都会出现此异常。要确定哪个变量为null以及在哪里,您需要读取堆栈跟踪以及相关行的行/符号编号。一个例子:
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()
。接下来,有一个CategoryInfo
和FullyQualifiedErrorId
,后者说"在null"上调用方法,省略"指针"或"变量"。
现在,让我们调试一下这条消息。这里,唯一要调用的方法是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,并返回&#34;没有找到&#34;如果确实是空的。它可能不是那么简单,可能有更多结构可以为空,如$a.b.c.someMethod()
- 这里$a
,$a.b
或$a.b.c
为空,所以你需要检查所有结果。还有一些情况会返回复杂的结构,并且预期在某个字段中有一个值,但该字段未填充,因此尝试使用该字段的值将产生异常。
道德是:如果你收到一个关于&#34; null-valued&#34;的异常,你没有想到某些东西会返回null,你必须添加对null的检查(或者,事实上,任何意外的)在尝试使用结果之前的值。