0

次のように、フォルダーをスクロールしてフォルダー内の各アイテムのメタデータを表示するための複数のコード スニペットを見つけました。

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() のインデックスにジャンプできますか?

4

2 に答える 2

4

ここでも、それがどのように行われるのか興味があったので、それを調べて、そのプロパティを[FileInfo]オブジェクトに追加する関数を作成しました (通常、Get-ChildItemコマンドレットによってファイルに渡されるもの)。

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

編集:ファイルの配列を修正しました!以前のエラーについて申し訳ありません。

于 2015-11-12T19:30:39.137 に答える
2

ありがとうマット!その質問は別でしたが、私が探していた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"

Author は 20 番目のメタデータ項目です。

于 2015-11-12T19:29:23.237 に答える