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 Add-Member ...奇怪的行为?
将 Excel 工作表导出到 PDF 文件时出现奇怪的 Powershell 行为
powershell使用动态foldercontent发送电子邮件