如何使用特定文件名(get-childitem)提取元数据,而不是循环访问ComObject命名空间项

时间:2015-11-12 18:39:01

标签: powershell powershell-v3.0 comobject

我找到了多个代码段来滚动浏览文件夹并显示文件夹中每个项目的元数据,如下所示:

function funLine($strIN) 
{
    $strLine = "=" * $strIn.length
    Write-Host -ForegroundColor Yellow "`n$strIN"
    Write-Host -ForegroundColor Cyan $strLine
}

$sfolder = "S:\Temp"
$objShell = New-Object -ComObject Shell.Application
$objFolder = $objShell.namespace($sFolder)
foreach ($strFileName in $objFolder.items())
    {funline "$($strFileName.name)"
    for ($a ; $a  -le 266; $a++)
    { 
        $a
        if($objFolder.getDetailsOf($strFileName, $a))
        {
            $hash += @{ $($objFolder.getDetailsOf($objFolder.items, $a)) = $a.tostring() + $($objFolder.getDetailsOf($strFileName, $a)) }
            $hash | out-file c:\temp\output.txt -Append
            $hash.clear()
        }
    }
    $a=0
}

但是在我的脚本中,我想使用Get-ChildItem遍历文件夹,对于选定的文件,我想使用getDetailsOf()来提取MS Office文档的作者。

因此,知道文件名(例如:$ strFileName,我可以跳过$ objFolder.items()中每个$ strFileName的循环,只访问$ sFileName的作者的元数据详细信息(其中$ a = 20)?

我已经看到它使用“New-Object -ComObject word.application”完成,但我相信会打开文档,所以在一个大文件系统上,用户锁定了许多文件,这可能会很慢而且很痛苦。

我可以跳转到$ objFolder.items()的索引以获取我选择的文件名吗?

2 个答案:

答案 0 :(得分:3)

在这里,我很好奇它是如何完成的,所以我查了一下并创建了一个函数,将该属性添加到[FileInfo]对象中(通常通过了什么)对于Get-ChildItem cmdlet的文件。

Function Get-CreatedBy{
[cmdletbinding()]
Param(
    [Parameter(ValueFromPipelineByPropertyName=$true)]
    [Alias("Path")]
    [string[]]$FullName
)
Begin{
    $Shell = New-Object -ComObject Shell.Application
}
Process{
    ForEach($FilePath in $FullName){
        $NameSpace = $Shell.NameSpace((Split-Path $FilePath))
        $File = $NameSpace.ParseName((Split-Path $FilePath -Leaf))
        $CreatedBy = $NameSpace.GetDetailsOf($File,20)
        [System.IO.FileInfo]$FilePath|Add-Member 'CreatedBy' $CreatedBy -PassThru
    }
}
}

然后你可以直接管道,或直接指定路径:

Get-ChildItem *.docx | Get-CreatedBy | FT Name,CreatedBy

Get-CreatedBy 'C:\Temp\File.docx' | Select -Expand CreatedBy

修改:修复了文件数组!对于上一个错误感到抱歉。

答案 1 :(得分:1)

谢谢马特!虽然这个问题不同,但它有一个我想要的 - 如何引用$objFolder.items().item($_.Name)

因此,这会显示一个快速的小片段来显示作者(或任何其他元数据字段):

$FullName = "S:\Temp\filename.xlsx"

$Folder = Split-Path $FullName
$File = Split-Path $FullName -Leaf

$objShell = New-Object -ComObject Shell.Application
$objFolder = $objShell.namespace($Folder)

$Item = $objFolder.items().item($File)
$Author = $objFolder.getDetailsOf($Item, 20)

Write-Host "$FullName is owned by $Author"

作者是第20个元数据项。