我编写了一个脚本,可以从特定文件夹获取 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
是否存在。
这篇文章很古老,但对于其他遇到类似问题并绝对疯狂的人来说:
向
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())