Ves*_*per 3 powershell null nullpointerexception
您创建了一个脚本,它工作了一段时间,然后突然开始崩溃,并显示“您无法在空值表达式上调用方法”或“在此对象上找不到属性‘属性名称’。验证该属性存在并且可以设置。”。这是什么意思?
这是“空指针异常”的 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
Run Code Online (Sandbox Code Playgroud)
让我们解析错误消息。首先,这个问题的标题中有一个措辞。如果你准备用这种措辞提问,你会得到一组 StackOverflow 提出的类似问题。但是错误描述中还有更多内容。第二行显示生成此异常的表达式的第一个字符的脚本、行和字符编号。在这里,请求$Search.value()查询是否为-contains $SearchString。波浪形下划线将表达式完全分开,尽管正确的方法是只加下划线$Search.value()。接下来,有一个CategoryInfoand 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)
Run Code Online (Sandbox Code Playgroud)
所以,我们已经找到了我们在哪里收到空值。
补救措施各不相同,但都包括针对$null. 在这种情况下,检查$Searchnull就足够了,如果确实为 null,则返回“Nothing found”。可能没有那么简单,可能还有更多的结构可以为空,比如 in $a.b.c.someMethod()-here or $a,$a.b或者$a.b.c为空,所以你需要检查所有的结果。也有返回复杂结构的情况,并且期望在某个字段中具有值,但该字段未填充,因此尝试使用该字段的值将产生异常。
寓意是:如果您收到一个关于“空值”的异常,您没有期望返回空值,并且您必须在尝试使用结果之前添加对空值(或实际上任何意外)值的检查.