1

我收到了使用 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 时的整个转储。 Powershell错误

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

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

4

3 回答 3

3

我在网上找到了这个:

此外,在我看来,该代码依赖于 Windows Explorer 对 zipFolders 的支持,您可能已将其关闭

Unregister (disable) XP Zip folders
REGSVR32 /u C:\Windows\System32\zipfldr.dll

Register (enable) XP Zip folders
REGSVR32 zipfldr.dll

它来自这里

我是在几台机器上测试我的脚本时遇到的,例如在 Windows Server 2008 和 Windows 7 客户端上。两者都有效,所以我得出结论,这不是我的脚本,而是我的电脑。XP Zip文件夹注册后,它工作。

非常感谢写这篇文章的人,我在这个问题上投入了太多时间。

于 2012-10-02T08:18:51.903 回答
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 正在以管理员权限运行。

于 2012-10-01T22:06:49.920 回答
0

现在在 .NET Framework 4.5 中没有尝试自动化 Windows Shell,而是有一个ZipFile类,您可以像这样使用它:

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)

编辑:糟糕,.NET Framework 4.5在 Windows XP 上不受支持
无论如何,这个答案可能对其他在 Powershell 中遇到 ZIP 问题的人仍然有用……</p>

于 2012-12-30T17:48:18.203 回答