我已经写了一个脚本,从一个特定的文件夹中获取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())
但是我想使用前面的一个,这样路径就不应该被硬编码,它应该对所有路径都有效。
是什么导致了这个错误?我的空值表达式到底是什么?
2条答案
按热度按时间x4shl7ld1#
在将路径传递给
$shell_app.namespace()
之前,请尝试解析路径。在.Net中有一个方便的方法可以做到这一点:System.IO.Path.GetFullPath()
像这样作为奖励,您可以使用
Test-Path
来检查目标$parsedLoc
是否存在。gudnpqoy2#
这篇文章很古老,但对于任何遇到类似问题并完全疯狂的人来说:
当将变量传递给
Shell.Application.Namespace
时,变量需要用引号括起来才能正常工作。范例:
注意:你似乎也必须为这些变量使用绝对路径,抛出一个
$zipPath = Resolve-Path $zipPath
或者首先使用绝对路径。目的地也必须存在,如果不存在,请确保创建它。