【发布时间】:2017-12-15 15:50:09
【问题描述】:
在 Powershell 中,Shell-Application 命名空间的 CopyHere 方法是异步的。我的主要目标是将 KML 文件转换为 KMZ 文件。这样做的过程是创建一个同名的 ZIP 文件,将 KML 复制到 KMZ(压缩文件),然后将 ZIP 重命名为 KMZ。不幸的是,异步意味着重命名函数在 CopyHere 方法完成之前被调用。我找到了很多解决这个问题的例子。我找到的最干净的一个如下:
$kmlPath = $global:directoryPath + "Test.kml"
$zip = $global:directoryPath + "Test.zip"
New-Item $zip -ItemType file
$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zip)
$zipPackage.CopyHere($kmlPath, 16)
while($zipPackage.Items().Item($zip.Name) -Eq $null)
{
start-sleep -seconds 1
write-host "." -nonewline
}
write-host "."
Rename-Item -Path $zip -NewName $([System.IO.Path]::ChangeExtension($zip, ".kmz"))
这会响应以下错误:
使用“1”个参数调用“项目”的异常:“未实现 (来自 HRESULT 的异常:0x80004001 (E_NOTIMPL))” + while($zipPackage.Items().Item($zip.Name) -Eq $null) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ComMethodTargetInvocation
我是否误用了这个特定包的 Item 方法?我很困惑为什么“看起来”整齐地完成的事情不起作用。我还尝试了Here 提供的代码的 sn-p。它还抱怨在这种特殊情况下的 .Item 方法。
【问题讨论】:
标签: powershell namespaces zip kmz