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

Posted

技术标签:

【中文标题】Powershell解压缩功能 - 奇怪的行为【英文标题】:Powershell unzipping feature - strange behaviour 【发布时间】:2014-11-05 08:13:22 【问题描述】:

我尝试设置一个安装脚本,用于在新设置的 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】:

不完全确定失败的原因,但如果您使用的计算机可靠地具有 .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"

【讨论】:

感谢您的回答。但它也没有奏效。目前我正在使用自解压存档文件... 有趣。您在 .Net 方法中看到什么样的错误?和其他错误类似吗? 对不起,没有注意到评论。这几乎是相同的错误......我想这是一个有点错误的 Windows 安装/配置。

以上是关于Powershell解压缩功能 - 奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的 PowerShell 递归行为

PowerShell Add-Member ...奇怪的行为?

将 Excel 工作表导出到 PDF 文件时出现奇怪的 Powershell 行为

powershell使用动态foldercontent发送电子邮件

Powershell - 展开存档并重命名文件,因为它包含无效字符

不同控制台中的不同 PowerShell 脚本行为