【发布时间】:2015-07-10 07:43:30
【问题描述】:
您创建了一个脚本,它工作了一段时间,然后突然开始崩溃,并显示“您无法在空值表达式上调用方法”或“在此对象上找不到属性‘属性名称’ . 验证该属性是否存在并且可以设置。”。这是什么意思?
【问题讨论】:
标签: powershell nullpointerexception null
您创建了一个脚本,它工作了一段时间,然后突然开始崩溃,并显示“您无法在空值表达式上调用方法”或“在此对象上找不到属性‘属性名称’ . 验证该属性是否存在并且可以设置。”。这是什么意思?
【问题讨论】:
标签: powershell nullpointerexception null
这是“空指针异常”的 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() 下划线。接下来是CategoryInfo 和FullyQualifiedErrorId,后者表示“Invoke method on null”,省略“pointer”或“variable”。
现在,让我们调试消息。在这里,即将调用的唯一方法是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 的检查。在这种情况下,检查$Search 是否为空就足够了,如果它确实为空,则返回“Nothing found”。它可能没有那么简单,可能还有更多可以为空的结构,例如$a.b.c.someMethod() - 这里$a、$a.b 或$a.b.c 为空,因此您需要检查所有结果。还有一些情况是返回一个复杂的结构,并且期望在某个字段中有一个值,但是该字段没有被填充,因此尝试使用该字段的值会产生异常。
寓意是:如果您收到有关“null-valued”的异常,您并没有期望返回 null,您必须在尝试之前添加对 null(或者,实际上是任何意外)值的检查使用结果。
【讨论】: