无法在空值表达式上调用方法 - 如何解决

cannot call a method on a null-valued expression - how to solve it

我已经编写了一个脚本,可以从特定文件夹获取 zip 文件并将文件解压缩到特定文件夹。

请检查以下代码

$shell_app=new-object -com shell.application
$zip_file = $shell_app.namespace("C:\Users\jhnayak\Views_Seagate\jhnayak_DDTools_Phase14_Dev\apps\ddcli\build\win\..\..\..\..\sas2_rel\mptlib2_rel\mptlib2_rel.zip")
$destination = $shell_app.namespace("C:\Users\jhnayak\Views_Seagate\jhnayak_DDTools_Phase14_Dev\apps\ddcli\build\win\..\..\..\..\sas2_rel\mptlib2_rel")
$destination.Copyhere($zip_file.items())

$shell_app=new-object -com shell.application
$zip_file = $shell_app.namespace((Get-Location).Path + "\..\..\..\..\sas2_rel\mptlib2_rel" + "$filename")
$destination = $shell_app.namespace((Get-Location).Path + "\..\..\..\..\sas2_rel\mptlib2_rel")
$destination.Copyhere($zip_file.items())

对于这两个代码我都得到了同样的错误,请检查下面

You cannot call a method on a null-valued expression.
At line:1 char:38
+ $destination.Copyhere($zip_file.items <<<< ())
    + CategoryInfo          : InvalidOperation: (items:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

当我在不使用 \..\ 的情况下对路径进行硬编码时,它工作得很好。

请检查以下代码

$shell_app=new-object -com shell.application
$zip_file = $shell_app.namespace("C:\Users\jhnayak\Views_Seagate\jhnayak_DDTools_Phase14_Dev\sas2_rel\mptlib2_rel\mptlib2_rel.zip")
$destination = $shell_app.namespace("C:\Users\jhnayak\Views_Seagate\jhnayak_DDTools_Phase14_Dev\sas2_rel\mptlib2_rel")
$destination.Copyhere($zip_file.items())

但我想使用较早的那个,这样路径就不会被硬编码,它应该适用于所有路径。

导致此错误的原因是什么? 我的空值表达式到底是什么?

在将路径传递给 $shell_app.namespace() 之前尝试解析路径。 .Net 中有一个方便的方法可以做到这一点:System.IO.Path.GetFullPath()。像这样,

$relativeLoc = "...build\win\..\..\..\..\sas2..." # Complex dynamic path
$parsedLoc = [IO.Path]::GetFullPath($relativeLoc) # Get absolute path
$zip_file = $shell_app.namespace($parsedLoc)

作为奖励,您可以使用 Test-Path 检查目标 $parsedLoc 是否存在。