Powershell解压缩功能 - 奇怪的行为

时间:2014-11-05 08:13:22

标签: powershell unzip zipfile

我尝试设置一个安装脚本,在新设置的Windows 7 64位系统上设置开发环境。 到目前为止,我不能依赖第三方工具,如7zip,因为新用户可能无权在第一天安装软件。

通常这不是什么大问题,我有解压缩文件的脚本。但昨天我偶然发现了一台电脑,它不想要"解压缩我的文件。 这是一个简短的测试脚本,我写的是为了缩小问题范围:

$shell=new-object -com shell.application

$curLoc=get-location
write-host "Current Location is $($curLoc)"

$curPath=$curLoc.path
write-host "Current Path is $($curPath)"

$dest=$shell.namespace($curPath)
write-host "Destination-Object is $($dest)"

$zipFiles = get-childitem *.zip
write-host "zipfiles found:"
write-host $zipFiles

foreach ($singleZipFile in $zipFiles)
{
  write-host "Unzipping zipfile $($singleZipFile.fullname)"

  $zipFolder = $shell.namespace($singleZipFile.fullname)
  write-host "ZipFolder:"
  write-host $zipFolder  

  $dest.Copyhere($zipFolder.items())
  write-host "Unzipping zipfile $($singleZipFile.fullname) done"
}

在我的测试计算机上运行没有问题:

PS F:\testcenter> .\unzip4.ps1
Current Location is F:\testcenter
Current Path is F:\testcenter
Destination-Object is System.__ComObject
zipfiles found:
F:\testcenter\test.zip
Unzipping zipfile F:\testcenter\test.zip
ZipFolder:
System.__ComObject
Unzipping zipfile F:\testcenter\test.zip done
PS F:\testcenter>

但是在有问题的电脑上,如果按预期失败:

PS F:\testcenter> .\unzip4.ps1
Current Location is F:\testcenter
Current Path is F:\testcenter
Destination-Object is System.__ComObject
zipfiles found:
F:\testcenter\test.zip
Unzipping zipfile F:\testcenter\test.zip
Exception calling "NameSpace" with "1" argument(s): "Unknown Error (Except
ion from HRESULT: 0x80004005 (E_FAIL))"
At F:\testcenter\unzip4.ps1:20 char:32
+   $zipFolder = $shell.namespace <<<< ($singleZipFile.fullname)
  + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
  + FullyQualifiedErrorId : ComMethodTargetInvocation

ZipFolder:

You cannot call a method on a null-valued expression.
At F:\testcenter\unzip4.ps1:24 char:34
+   $dest.Copyhere($zipFolder.items <<<< ())
  + CategoryInfo          : InvalidOperation: (items:String) [], RuntimeExce
   ption
  + FullyQualifiedErrorId : InvokeMethodOnNull

Unzipping zipfile F:\testcenter\test.zip done
PS F:\testcenter>

即使我强行使用某些PS版本,问题也会保持不变......

显然问题是将zipfile路径和名称作为参数传递给.namespace。 但为什么?我能做些什么呢? 首先,我认为这是一个涉及权利的问题,并在我没有管理员权限的计算机上进行测试。但没有发生错误。

1 个答案:

答案 0 :(得分:0)

不完全确定失败的原因,但如果您使用的计算机可靠地使用.Net 4.5,则可以使用下面的脚本更改来代替COM对象。或者,在Powershell Script Repository.

中查看我在哪里找到.Net方法的来源

(由于不存在任何COM对象,因此某些变量现在可能是多余的。调整输出和变量以适应。)

# Load .Net 4.5 Compression File System, suppress output.
[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null 

$curLoc=get-location
write-host "Current Location is $($curLoc)"

$curPath=$curLoc.path
write-host "Current Path is $($curPath)"

$dest = $curPath
write-host "Destination-Object is $($dest)"

$zipFiles = get-childitem *.zip
write-host "Zipfiles found:"
write-host $zipFiles

foreach ($singleZipFile in $zipFiles)
{
  write-host "Unzipping zipfile $singleZipFile"

  $zipFolder = $singleZipFile
  write-host "ZipFolder:"
  write-host $zipFolder  
#Call .Net 4.5 Zip Extraction
  [System.IO.Compression.ZipFile]::ExtractToDirectory("$singleZipFile", "$Dest")
  write-host "Unzipping zipfile $singleZipFile done"
}
相关问题