Tartori
Tartori

Reputation: 287

Unzip with Powershell doesn't work on XP

I got the Request to unzip a .zip file with Powershell. On the Internet i found the following code multiple times:

    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())
       }
    }

As I implemented it into my script it changed a little bit. This above is the changed version. Now I've got an error:

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

And then another one, that is quite clear (caused by the first error

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

The File and the destination Path both exist and I've got rights to acces them (I created both). I'm running on Windows XP with PowerShell 2.0

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1

Here is my entire dump from Powershell when I run it directly on the console. PowershellError

I hope you guys can help me or at least tell me where I can go to find an answer.

I tried already to unzip the zip file manually and it worked, I have got access to both, the file and the file path (as I created both).

Upvotes: 1

Views: 2148

Answers (3)

mousio
mousio

Reputation: 10337

Instead of trying to automate the Windows Shell, now in .NET Framework 4.5 there is a ZipFile class that you can use like this:

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

Edit: Oops, .NET Framework 4.5 is not supported on Windows XP.
Anyhow, this answer might still prove useful for anyone else with ZIP problems in Powershell…

Upvotes: 0

Tartori
Tartori

Reputation: 287

I've found this one on the web:

Also the code looks to me like it's dependent on the Windows Explorer support for zipFolders, which you may have turned off

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

Register (enable) XP Zip folders
REGSVR32 zipfldr.dll

It's from here.

I came to it during testing my script on several machines, e.g. on a Windows Server 2008 and on a Windows 7 client. Both worked, so I came to the conclusion that it's not my script,but it's my PC. After the registration of XP Zip folders, it worked.

Many thanks to the guy who wrote this one, I dumped too much time into this problem.

Upvotes: 3

Giscard Biamby
Giscard Biamby

Reputation: 4609

You might be running into a problem with accessing the COM objects. If you are using 64-bit windows, make sure you execute your script from a 64-bit powershell.exe. This means the powershell.exe in c:\windows\system32...\v1.0.... This was counter-intuitive for me, having the '32' in system32. I was executing powershell from Console2, which was a 32bit process, and was therefore launching 32-bit powershell (from c:\windows\syswow64...). Also make sure your powershell.exe is being run with administrator privileges.

Upvotes: 0

Related Questions