使用Powershell解压缩不适用于XP

时间:2012-10-01 07:50:39

标签: powershell zip unzip

我收到了使用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上直接在控制台上运行时的整个转储。 PowershellError

我希望你们能帮助我,或者至少告诉我在哪里可以找到答案。

我已经尝试手动解压缩zip文件并且它有效,我可以访问文件和文件路径(我创建了两者)。

3 个答案:

答案 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问题的其他人有用......