我尝试设置一个安装脚本,在新设置的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。 但为什么?我能做些什么呢? 首先,我认为这是一个涉及权利的问题,并在我没有管理员权限的计算机上进行测试。但没有发生错误。
答案 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"
}