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

问题描述 投票:0回答:2

我编写了一个脚本,可以从特定文件夹获取 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())

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

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

windows powershell unzip
2个回答
2
投票

在将路径传递给

$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
是否存在。


0
投票

这篇文章很古老,但对于其他遇到类似问题并绝对疯狂的人来说:

Shell.Application.Namespace
传递变量时,变量需要用引号括起来才能正常工作。

示例:

$zipPath = <some_filepath_here>
$destinationPath = <some_directorypath_here>

$shellApp=New-Object -Com Shell.Application
$zipFile = $shellApp.Namespace("$zipPath") # PUT THE QUOTES HERE
$destination = $shellApp.Namespace("$destinationPath") # ALSO PUT THE QUOTES HERE

$destination.CopyHere($zipFile.Items())
© www.soinside.com 2019 - 2024. All rights reserved.