我收到了使用Powershell解压缩.zip文件的请求。在互联网上,我多次发现以下代码:
param( [String]$newlocation, [String]$filepath)
if(($newlocation -and $filepath) -and ((test-path $newlocation) -and (test-path $filepath)))
{
Copy-Item $filepath $newlocation
$shell_app=new-object -com shell.application
$filename = $filepath.split("\")[-1]
if(Test-Path "$newlocation\$filename")
{
$zip_file = $shell_app.namespace("$newlocation\$filename")
$destination = $shell_app.namespace($newlocation)
$destination.Copyhere($zip_file.items())
}
}
当我在我的脚本中实现它时,它改变了一点。以上是更改后的版本。现在我有一个错误:
Exception calling "NameSpace" with "1" argument(s): "The system cannot find the file specified. (Exception from HRESULT
: 0x80070002)"
At Z:\MyScripts\deploy.ps1:34 char:34
+ $zip_file = $shell_app.namespace <<<< ("$newlocation\$filename")
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
然后另一个,这很清楚(由第一个错误导致
You cannot call a method on a null-valued expression.
At Z:\MyScripts\deploy.ps1:36 char:39
+ $destination.Copyhere($zip_file.items <<<< ())
+ CategoryInfo : InvalidOperation: (items:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
文件和目标路径都存在,我有权访问它们(我创建了它们)。我在使用PowerShell 2.0的Windows XP上运行
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1
这是我在Powershell上直接在控制台上运行时的整个转储。
我希望你们能帮助我,或者至少告诉我在哪里可以找到答案。
我已经尝试手动解压缩zip文件并且它有效,我可以访问文件和文件路径(我创建了两者)。
答案 0 :(得分:3)
我在网上找到了这个:
此外,代码看起来像是依赖于Windows资源管理器对zipFolders的支持,你可能已经关闭了
Unregister (disable) XP Zip folders
REGSVR32 /u C:\Windows\System32\zipfldr.dll
Register (enable) XP Zip folders
REGSVR32 zipfldr.dll
来自here。
我在几台机器上测试我的脚本时遇到了它,例如在Windows Server 2008和Windows 7客户端上。两者都有效,所以我得出的结论是,这不是我的剧本,而是我的电脑。注册XP Zip文件夹后,它就可以了。
非常感谢写这篇文章的人,我把太多时间浪费在这个问题上。
答案 1 :(得分:0)
您可能遇到访问COM对象的问题。如果您使用的是64位Windows,请确保从64位的powershell.exe执行脚本。这意味着c:\ windows \ system32 ... \ v1.0中的powershell.exe ....这对我来说是违反直觉的,在system32中有'32'。我从Console2执行powershell,这是一个32位进程,因此启动了32位PowerShell(来自c:\ windows \ syswow64 ...)。还要确保使用管理员权限运行powershell.exe。
答案 2 :(得分:0)
现在在.NET Framework 4.5中,有一个 ZipFile 类可以像这样使用,而不是尝试自动化Windows Shell:
[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)
编辑:糟糕,Windows XP 不支持.NET Framework 4.5 。
无论如何,这个答案可能仍然对Powershell中有ZIP问题的其他人有用......