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

x9ybnkn6  于 12个月前  发布在  Shell
关注(0)|答案(2)|浏览(127)

我已经写了一个脚本,从一个特定的文件夹中获取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())

但是我想使用前面的一个,这样路径就不应该被硬编码,它应该对所有路径都有效。
是什么导致了这个错误?我的空值表达式到底是什么?

x4shl7ld

x4shl7ld1#

在将路径传递给$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是否存在。

gudnpqoy

gudnpqoy2#

这篇文章很古老,但对于任何遇到类似问题并完全疯狂的人来说:
当将变量传递给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())

注意:你似乎也必须为这些变量使用绝对路径,抛出一个$zipPath = Resolve-Path $zipPath或者首先使用绝对路径。目的地也必须存在,如果不存在,请确保创建它。

相关问题