powershell - 您不能在空值表达式上调用方法 - 一般

标签 powershell nullpointerexception null

您创建了一个脚本,它运行了一段时间,然后突然开始崩溃,显示“您不能在空值表达式上调用方法”或“无法在此对象上找到属性‘property name’ .验证该属性是否存在并且可以设置。”。这是什么意思?

最佳答案

这是“空指针异常”的 Powershell 版本。每次您尝试查询看似为空的变量时都会出现此异常。要确定哪个变量为 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() 下划线。接下来是 CategoryInfoFullyQualifiedErrorId,后者表示“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 是否为 null 就足够了,如果确实为 null,则返回“Nothing found”。它可能不那么简单,可能有更多结构可以为空,例如 $a.b.c.someMethod() - 这里要么是 $a,要么是 $a.b$a.b.c 为空,因此您需要检查所有结果。还有一些情况会返回一个复杂的结构,并期望在某个字段中有一个值,但该字段没有填充,因此尝试使用该字段的值将产生异常。

道德是:如果你收到一个关于“空值”的异常,你没有期望返回空值,你必须在尝试之前添加对空值(或者,事实上,任何意外的)值的检查使用结果。

关于powershell - 您不能在空值表达式上调用方法 - 一般,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31335195/

相关文章:

powershell - #requires ParentContainsErrorRecordException

git - 在 Gitlab CI Auto-Tag commit on build

java - 什么是NullPointerException,我该如何解决?

java - 为什么在二维数组中使用 NPE?

java - 空指针异常(Java)

PowerShell - 双循环可能吗?

powershell - 通过 PowerShell 添加共同管理员

java - 解决 Java 中的 NullPointerException 问题 - 认为这是一个初始化问题,但找不到它

jquery - IE8 和 jQuery 空指针

Angular 6 getRawValue() 将不会返回禁用值