您创建了一个脚本,它运行了一段时间,然后突然开始崩溃,并显示“您无法在空值表达式上调用方法”或“在此对象上找不到属性“属性名称”。验证该属性存在并且可以设置。”。这是什么意思?
这是“空指针异常”的 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”,省略“指针”或“变量”。
现在,让我们调试该消息。这里,唯一要调用的方法是
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 就足够了,如果确实为 null,则返回“Nothing found”。它可能没那么简单,可能有更多的结构可以为空,就像在 $a.b.c.someMethod()
中一样 - 这里 $a
、$a.b
或 $a.b.c
为空,所以你需要检查所有结果。还有一些情况,返回一个复杂的结构,并且预计在某个字段中有一个值,但该字段未填充,因此尝试使用该字段的值将产生异常。
其寓意是:如果您收到有关“空值”的异常,那么您并没有期望某些内容返回 null,并且您必须在尝试使用 null(或者实际上是任何意外)值之前添加对 null 值的检查结果。
进入“程序和功能”,选择Excel-应用程序,右键“更改”,“快速修复”解决了我的问题。
仅使用“$excel.visible = $true”我得到了更好的错误消息(无法转换类型为“microsoft.office.interop.excel.applicationclass”的com对象,这帮助我在microsoft上找到了解决方案-页面https://learn.microsoft.com/en-us/answers/questions/258475/unable-to-cast-com-object-of-type-microsoft-office)