xlogI125’s blog

パソコン作業を効率化したい

GetDetailsOfメソッドでファイルの詳細を取得

メモ

画像ファイルにおける ビットの深さ などを取得する。

使い捨てスクリプト

  • エラー処理やCOMオブジェクトの解放を気にしてないので練習以外では実行しない

Folder.ParseName メソッド

フォルダ内のファイル名を指定してファイルの詳細を表示する。

# [テスト環境]
#  PowerShell 5.1, Windows 11 (2023年3月頃)

Set-StrictMode -Version Latest

$shApp = New-Object -ComObject "Shell.Application"
$folder = $shApp.NameSpace("$($env:USERPROFILE)\Desktop")
$folderItem = $folder.ParseName("test.jpg")
$hash = [ordered]@{}

for ( $column = 0; $column -lt 512; $column++ ) {
  $name = $folder.GetDetailsOf($null, $column)
  $value = $folder.GetDetailsOf($folderItem, $column)

  if ($value -ne "") {
    $hash.Add("$column $name", $value)
  }
}

Get-Member -InputObject $shApp -Name @(
  "BrowseForFolder", "NameSpace"
) | Out-String -Width 80 | Write-Verbose -Verbose

Get-Member -InputObject $folder -Name @(
  "GetDetailsOf", "Items", "ParseName"
) | Out-String -Width 80 | Write-Verbose -Verbose

Get-Member -InputObject $folderItem -Name @(
  "ExtendedProperty", "Name", "Path", "Size", "Type"
) | Out-String -Width 80 | Write-Verbose -Verbose

[PSCustomObject]$hash | Out-GridView

Remove-Variable hash
Remove-Variable folderItem
Remove-Variable folder
Remove-Variable shApp

Shell.BrowseForFolder メソッド

ダイアログボックスからフォルダを選択して、フォルダ内のファイルの詳細を表示する。

# [テスト環境]
#  PowerShell 5.1, Windows 11 (2023年3月頃)
# [スクリプトファイル(.ps1)]
#  <ファイル名>
#   "%USERPROFILE%\Desktop\TestGetDetailsOf.ps1"
#  <エンコード>
#   UTF-8 (BOM付き)
# [ショートカット(.lnk)]
#  <リンク先(T)>
#   PowerShell.exe -NoLogo -NoExit -NoProfile -ExecutionPolicy RemoteSigned -File "%USERPROFILE%\Desktop\TestGetDetailsOf.ps1"
#  <作業フォルダー(S)>
#   ""

using namespace System.Collections.Generic

Set-StrictMode -Version Latest

$BIF_EDITBOX = 0x10
$BIF_NONEWFOLDERBUTTON = 0x200
$options = $BIF_EDITBOX -bor $BIF_NONEWFOLDERBUTTON

$rootFolder = "${env:USERPROFILE}\Desktop"

$shApp = New-Object -ComObject Shell.Application
$folder = $shApp.BrowseForFolder(0, "タイトル", $options, $rootFolder)

if ( $null -eq $folder ) {
  $shApp = $null
  throw '$null -eq $folder'
}

$folderItems = $folder.Items()
$columns = [List[int]]::new()
$psObjs = [Object[]]::new($folderItems.Count)

for ( $i = 0; $i -lt $psObjs.Length; $i++ ) {
  $psObj = [PSCustomObject]@{}
  Write-Host "$($i + 1) / $($psObjs.Length)"
  $folderItem = $folderItems.Item($i)

  for ( $column = 0; $column -lt 384; $column++ ) {
    $str = $folder.GetDetailsOf($folderItem, $column)

    if ( $str -eq "" ) {
      continue
    }

    Add-Member -InputObject $psObj -NotePropertyMembers @{$column = $str}

    if ( -not $columns.Contains($column) ) {
      $columns.Add($column)
    }
  }

  $folderItem = $null
  $psObjs[$i] = $psObj
}

$columns.Sort()
$psObjs = @($psObjs | Sort-Object -Property @("2", "0"))
$details = [Object[]]::new($psObjs.Length)

for ( $i = 0; $i -lt $details.Length; $i++ ) {
  $detail = [PSCustomObject]@{}
  $psObj = $psObjs[$i]

  for ( $k = 0; $k -lt $columns.Count; $k++ ) {
    $column = $columns[$k]
    $columnName = $folder.GetDetailsOf($null, $column)
    $name = "$($column.ToString("000")) $columnName"

    if ( $psObj.PSObject.Properties.Match($column).Count -ne 0 ) {
      Add-Member -InputObject $detail -NotePropertyMembers @{
        $name = $psObj.$column
      }
    }
    else {
      Add-Member -InputObject $detail -NotePropertyMembers @{
        $name = $null
      }
    }
  }

  $details[$i] = $detail
}

$details | ConvertTo-Csv -NoTypeInformation | Set-Clipboard
$details | Out-GridView

$folderItems = $null
$folder = $null
$shApp = $null