如何从文件扩展名为 doc、docx、pptx、xlsx 的 Microsoft Office 文件中获取公司财产?

How to get the company property from Microsoft Office files with file extension doc, docx, pptx, xlsx?

提问人:Rasec Malkic 提问时间:10/28/2023 最后编辑:MofiRasec Malkic 更新时间:10/29/2023 访问量:72

问:

我正在尝试使用 PowerShell 从 Microsoft Office 文件(Excel、PowerPoint、Word)中获取属性。
现在我可以使用以下代码从以下位置获取: 获取文件所有者/作者
OwnerCompanyOwner

  Get-ChildItem | Select-Object -Property  Fullname, @{Name = 'Owner';Expression = {$PSItem.GetAccessControl().Owner}}

但是我还没有找到一种方法来显示当我们右键单击 --> 属性 --> Windows 文件资源管理器的详细信息时出现在文件部分中的属性。CompanyDetails

有没有办法通过命令行获取属性?Company

PowerShell 属性

评论


答:

3赞 kconsiglio 10/28/2023 #1

使用 shell com 对象,可以通过将要访问的属性的字符串传递给 items ExtendedProperty 方法来执行此操作。例如,您可以使用如下所示的单个文件来执行此操作:

$sourceFolder = "C:\Users\path"
$fileName = "test.docx"
$items = (New-Object -com shell.application).NameSpace($sourceFolder).items()
Write-Output $items.item($fileName).ExtendedProperty("Company")

首先获取所有文件夹项,然后选择所需的文件和属性,在本例中为“公司”。结合你所拥有的,我们可以做这样的事情:

$sourceFolder = "C:\Users\mypath\folder"
$items = (New-Object -com shell.application).NameSpace($sourceFolder).items()


Get-ChildItem -Path $sourceFolder | Select-Object -Property  Fullname, @{Name = 'Owner';Expression = {$PSItem.GetAccessControl().Owner}}, 
 @{Name = 'Company';Expression = {$items.Item($_.Name).ExtendedProperty("Company")}}
输出
FullName                              Owner Company     
--------                              ----- -------     
C:\Users\mypath\folder\test - Copy.docx       zzz  COMPANY
C:\Users\mypath\folder\test.docx              ABC COMPANY 

更新

根据要求,如果使用,我已经进行了更新以工作。问题是我们必须通过运行-recurse

$items = (New-Object -com shell.application).NameSpace($sourceFolder).items() 

对于每个子文件夹。 因此,与其像上面那样将它们全部组合在一起,不如将其分开。我们首先获取所有项目,并将其保存到变量中。然后我们遍历这些项目。我们像以前一样查询公司信息,但前提是它是文件(而不是目录)。我们还检查列表中的当前文件是否与我们拥有的目录不同。如果它不同,那么我们查询新文件夹。我们将所有内容保存到 .Get-ChildItem -RecurseFolderItemsPSCustomObject

$sourceFolder = "C:\Users\path\folder"
# Get FolderItems
$items = (New-Object -com shell.application).NameSpace($sourceFolder).items()
$currentFolder = $sourceFolder

$list = Get-ChildItem -Path $sourceFolder -Recurse

$fileInfo = foreach ($item in $list){
   # get current item's folder
   $itemParentFolder = ($item.PsParentPath -Split "::")[1]
   # only check if item is not a directory 
   if ($item.GetType().Name -ne 'DirectoryInfo'){
        # if the current items parent folder is different from current folder get the new folder items 
        if ($itemParentFolder -ne $currentFolder){
                $currentFolder = $itemParentFolder
                $items = (New-Object -com shell.application).NameSpace($currentFolder).items()
        }
            # get company
            $company = $items.Item($item.Name).ExtendedProperty("Company")
    }
    # directory so there is no company info
    else{
        $company = ""
    }
    # get owner
    $owner = (Get-Acl $item.FullName).Owner

    # set custom object values
    [PSCustomObject]@{
        FullName = $item.FullName
        Owner = $owner
        Company = $company
    }
   
}

Write-Output $fileInfo

评论

0赞 Rasec Malkic 10/28/2023
非常感谢您的帮助。它似乎有效。我只是试图列出文件夹和子文件夹中的所有文件递归,我添加了这样的Get-ChildItem -recurse -Path $sourceFolder...',但在这种情况下,输出仅显示所有者。您知道如何为文件夹和子文件夹中的所有文件打印递归所有者和公司吗?-recurse
1赞 kconsiglio 10/29/2023
@RasecMalkic我认为我们必须创建一个 for 循环并更改每个文件夹。由于使用此方法获取文件夹中的项目时,据我所知,无法指定递归执行。 .我会尝试想出一个解决方法。NameSpace$items = (New-Object -com shell.application).NameSpace($sourceFolder).items()
1赞 kconsiglio 10/29/2023
@RasecMalkic我已经更新了它以用于-recurse
0赞 Rasec Malkic 10/29/2023
非常好!!!不知道这个魔法是如何运作的,但它有效。非常感谢您的帮助