メモ
画像ファイルにおける ビットの深さ などを取得する。
参考資料リンク
使い捨てスクリプト
- エラー処理や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