エクスプローラでファイルのプロパティの詳細に設定したタグやコメントをPowerShellから取得する。

PowerShell コンピュータ
PowerShell

エクスプローラーでファイルのプロパティの詳細のタブにタグやコメントなどを設定することが出来ることを以前から知ってはいました。

設定した値はエクスプローラーの表示設定を変更することで一覧表示することが出来ます。

こちらの情報をPowerShellなどのプログラムから扱うことが出来ないか調べてみました。

スクリプト:Get-Tags.ps1

<#
.SYNOPSIS
mp4ファイルのタグなどを取得

.DESCRIPTION
mp4ファイルのタグなどを取得

.EXAMPLE
Get-Tags.ps1 -Path ファイル名

.PARAMETER $Path
ファイルのパス

.EXAMPLE
Get-Tags.ps1 -Path "F:\Pictures\00000-2181776672.png"

.EXAMPLE
Get-ChildItem "F:\Pictures" | Get-Tags.ps1

#>
param(
    [string]
    $Path,
    [switch]
    $Help
)
if ($Help) {
    Get-Help $MyInvocation.MyCommand.Path
    Exit 1
}

$app = new-object -com Shell.Application

function Get-Tags
{
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
        [string[]]
        $path
    )
    begin {}
    process
    {
        foreach ($p in $path)
        {
            $folderStr = Split-Path $path
            $fileStr = Split-Path $path -Leaf
            
            $folderObj = $app.Namespace($folderStr)
            $fileObj = $folderObj.ParseName($fileStr)


            [PSCustomObject]@{
                $folderObj.GetDetailsOf($null, 0) = $folderObj.GetDetailsOf($fileObj, 0);   # 名前
                $folderObj.GetDetailsOf($null, 21) = $folderObj.GetDetailsOf($fileObj, 21); # タイトル
                $folderObj.GetDetailsOf($null, 19) = $folderObj.GetDetailsOf($fileObj, 19); # 評価
                $folderObj.GetDetailsOf($null, 18) = $folderObj.GetDetailsOf($fileObj, 18); # タグ
                $folderObj.GetDetailsOf($null, 20) = $folderObj.GetDetailsOf($fileObj, 20); # 作成者
                $folderObj.GetDetailsOf($null, 25) = $folderObj.GetDetailsOf($fileObj, 25); # 著作権
                $folderObj.GetDetailsOf($null, 12) = $folderObj.GetDetailsOf($fileObj, 12); # 撮影日時
                $folderObj.GetDetailsOf($null, 136) = $folderObj.GetDetailsOf($fileObj, 136); # 取得日時
            }
        }
    }
    end {}

        
}


$args = @($input)

if ($Help -Or ( -Not $Path -And $args.Count -eq 0))
{
    Get-Help $PSCommandPath
    Exit 1
}

if ($args.Count -gt 0)
{
    if ($args[0] -is [System.IO.FileSystemInfo])
    {
        $args | ForEach-Object { $_.FullName } | Get-Tags
    }
    else
    {
        $args | Get-Tags
    }
}
else
{
    Get-Tags -path $Path
}

実行例1
ファイルのパスを引数に実行

PS > Get-Tags.ps1 "F:\Pictures\00000-2181776672.png"

名前     : 00000-2181776672.png
タイトル : タイトル
評価     : 2 つ星
タグ     : タグ
作成者   : 作成者
著作権   : 著作権
撮影日時 : ‎2025/‎02/‎02 ‏‎17:48
取得日時 : ‎2025/‎02/‎03 ‏‎17:48

実行例2
ファイルの一覧をパイプラインでつなげて実行

PS > Get-ChildItem F:\Pictures | Get-Tags.ps1

名前     : 00000-2181776672.png
タイトル : タイトル
評価     : 2 つ星
タグ     : タグ
作成者   : 作成者
著作権   : 著作権
撮影日時 : ‎2025/‎02/‎02 ‏‎17:48
取得日時 : ‎2025/‎02/‎03 ‏‎17:48

名前     : 00001-1383024680.png
タイトル : 
評価     : 評価なし
タグ     : 
作成者   : 
著作権   : 
撮影日時 : 
取得日時 : 

名前     : 00003-768882431.png
タイトル : 
評価     : 評価なし
タグ     : 
作成者   : 
著作権   : 
撮影日時 : 
取得日時 : 

名前     : 00011-2317283159.png
タイトル : 
評価     : 評価なし
タグ     : 
作成者   : 
著作権   : 
撮影日時 : 
取得日時 : 

・・・以下略・・・

実行例3
ファイルの一覧をパイプラインでつなげて実行しプロパティで絞り込み

PS > Get-ChildItem F:\Pictures | Get-Tags.ps1 | Where-Object { $_.作成者 -eq "作成者" }

名前     : 00000-2181776672.png
タイトル : タイトル
評価     : 2 つ星
タグ     : タグ
作成者   : 作成者
著作権   : 著作権
撮影日時 : ‎2025/‎02/‎02 ‏‎17:48
取得日時 : ‎2025/‎02/‎03 ‏‎17:48

コメント