我正在尝试在64位系统上使用DSOFile从Office文件中获取Office元数据属性,而无需在系统上安装Office。 我注册了我在线获得的 64 位版本,它在我第一次运行它时就可以工作。 它第二次使PS控制台崩溃。 考虑到我关闭了它,我不知道它为什么这样做。
(链接: http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-79KRU6(
法典:
[System.Reflection.Assembly]::LoadFrom('C:TEMPInterop.DSOFile.dll')
function Get-Summary([string]$file) {
$oled = New-Object -COM DSOFile.OleDocumentProperties
$oled.Open($file, $true, [DSOFile.dsoFileOpenOptions]::dsoOptionDefault)
$spd = $oled.SummaryProperties
return $spd
$oled.close()
}
Get-Summary ('Z:SCRIPTSTestFilescolor-difference.xls')
错误:
A share violation has occurred. (Exception from HRESULT: 0x80030020
(STG_E_SHAREVIOLATION))
At Z:SCRIPTStest03.ps1:7 char:5
+ $oled.Open($file, $true, [DSOFile.dsoFileOpenOptions]::dsoOptionD ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
编辑:
我通过在函数中创建一个对象来绕过它,如下所示:
[System.Reflection.Assembly]::LoadFrom('C:TEMPInterop.DSOFile.dll')
function Get-Summary([string]$item) {
$oled = New-Object -TypeName DSOFile.OleDocumentPropertiesClass
$oled.Open($item)
$spd = [PSCustomObject]@{
Title = $oled.SummaryProperties.Title
Subject = $oled.SummaryProperties.Subject
Author = $oled.SummaryProperties.Author
DateCreated = $oled.SummaryProperties.DateCreated
LastSavedBy = $oled.SummaryProperties.LastSavedBy
DateLastSaved = $oled.SummaryProperties.DateLastSaved
Keywords = $oled.SummaryProperties.Keywords
}
$spd
$oled.close($item)
}
$officeInfo = Get-Summary('Z:SCRIPTSTestFilescolor-difference.xls')
$officeInfo
在代码中,在调用 .Close()
方法之前返回函数。
[System.Reflection.Assembly]::LoadFrom('C:TEMPInterop.DSOFile.dll')
function Get-Summary([string]$file) {
$oled = New-Object -COM DSOFile.OleDocumentProperties
$oled.Open($file, $true, [DSOFile.dsoFileOpenOptions]::dsoOptionDefault)
$spd = $oled.SummaryProperties
#return $spd
$oled.close()
return $spd # return here instead
}
而且,本着PowerShell的精神,您真的不需要调用return
。只需单独添加 $spd
变量,它就会返回它。