1653 words
8 minutes
【PowerShell】Update-TypeDataコマンドで型データを更新する方法
最終更新:2025-03-30
概要
Update-TypeData
はPowerShellの拡張型システム(Extended Type System:ETS)を更新するためのコマンドレットである。このコマンドレットを使用することで、既存のオブジェクト型に新しいプロパティ、メソッド、エイリアスなどを動的に追加したり、既存の動作を変更したりすることができる。PowerShellの拡張型システムはオブジェクト指向の機能を強化するもので、標準的な.NETクラスやオブジェクトの表示方法や操作方法をカスタマイズすることが可能となる。開発者やスクリプト作成者にとって、既存のオブジェクトを拡張して機能性を高めるための強力なツールである。
基本的な使い方
型データファイルの読み込み
XML形式の型データファイルを読み込んで、型データを更新する最も基本的な使い方である。
Update-TypeData -AppendPath "C:\TypeData\MyTypes.ps1xml"
既存の型データの再読み込み
PowerShellセッション中に変更された型データファイルを再読み込みする場合に使用する。
Update-TypeData
メンバーの追加(スクリプトブロックによるプロパティの定義)
特定の型に新しいスクリプトプロパティを追加する。
Update-TypeData -TypeName System.String -MemberType ScriptProperty -MemberName IsLong -Value { $this.Length -gt 10 }
メソッドの追加
特定の型に新しいスクリプトメソッドを追加する。
Update-TypeData -TypeName System.String -MemberType ScriptMethod -MemberName Reverse -Value {
$reversed = $this[$this.Length..0] -join ''
return $reversed
}
応用的な使い方
表示プロパティのカスタマイズ
特定のオブジェクト型の表示方法をカスタマイズする。
Update-TypeData -TypeName System.Diagnostics.Process -MemberType ScriptProperty -MemberName ProcessInfo -Value {
return "$($this.Name) (ID: $($this.Id), CPU: $($this.CPU.ToString('N2'))%)"
}
複数のメンバー定義(スクリプトブロックの活用)
複数のスクリプトプロパティを一度に定義する方法。
$members = @{
IsCritical = { $this.WorkingSet -gt 100MB }
IsSystem = { $this.Company -eq "Microsoft Corporation" }
FormattedSize = { "{0:N2} MB" -f ($this.WorkingSet / 1MB) }
}
foreach ($key in $members.Keys) {
Update-TypeData -TypeName System.Diagnostics.Process -MemberType ScriptProperty -MemberName $key -Value $members[$key]
}
型エイリアスの定義
型の別名を作成する例。
Update-TypeData -TypeName System.IO.FileInfo -MemberType AliasProperty -MemberName Size -Value Length
インポートした型データの削除と更新
すでに読み込まれている型データを一度削除してから更新する。
Remove-TypeData -TypeName System.String
Update-TypeData -TypeName System.String -MemberType ScriptProperty -MemberName WordCount -Value {
($this -split '\s+').Count
}
ハンズオン:Update-TypeDataの実践
以下はUpdate-TypeDataコマンドの実践例とその出力である。
- 基本的な型拡張:文字列にカスタムプロパティを追加
# 文字列型に単語数を返すプロパティを追加
Update-TypeData -TypeName System.String -MemberType ScriptProperty -MemberName WordCount -Value {
if ([string]::IsNullOrEmpty($this)) { 0 } else { ($this -split '\s+').Count }
}
# 新しいプロパティをテスト
$string1 = "Hello world from PowerShell"
$string2 = ""
Write-Host "文字列1: '$string1'"
Write-Host "単語数: " $string1.WordCount
Write-Host "文字列2: '$string2'"
Write-Host "単語数: " $string2.WordCount
出力例:
文字列1: 'Hello world from PowerShell'
単語数: 4
文字列2: ''
単語数: 0
- スクリプトメソッドの追加:文字列の反転メソッド
# 文字列を反転するメソッドを追加
Update-TypeData -TypeName System.String -MemberType ScriptMethod -MemberName Reverse -Value {
$charArray = $this.ToCharArray()
[array]::Reverse($charArray)
return [string]::new($charArray)
}
# 新しいメソッドをテスト
$text = "PowerShell"
Write-Host "元の文字列: $text"
Write-Host "反転した文字列: " $text.Reverse()
出力例:
元の文字列: PowerShell
反転した文字列: llehSrewoP
- DateTimeオブジェクトの拡張:分かりやすい日付表現
# DateTime型に日本語の曜日と読みやすい形式を追加
Update-TypeData -TypeName System.DateTime -MemberType ScriptProperty -MemberName JapaneseDayOfWeek -Value {
$dayNames = @("日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日")
return $dayNames[$this.DayOfWeek.value__]
}
Update-TypeData -TypeName System.DateTime -MemberType ScriptProperty -MemberName FriendlyDate -Value {
return "$($this.Year)年$($this.Month)月$($this.Day)日 ($($this.JapaneseDayOfWeek))"
}
# 新しいプロパティをテスト
$date = Get-Date
Write-Host "現在の日時: $date"
Write-Host "曜日(日本語): " $date.JapaneseDayOfWeek
Write-Host "日付(フレンドリー形式): " $date.FriendlyDate
出力例:
現在の日時: 2025年3月30日 3:15:42
曜日(日本語): 日曜日
日付(フレンドリー形式): 2025年3月30日 (日曜日)
- ファイル情報の拡張:サイズ表示のカスタマイズ
# FileInfoオブジェクトにサイズの読みやすい表示を追加
Update-TypeData -TypeName System.IO.FileInfo -MemberType ScriptProperty -MemberName SizeInKB -Value {
"{0:N2} KB" -f ($this.Length / 1KB)
}
Update-TypeData -TypeName System.IO.FileInfo -MemberType ScriptProperty -MemberName SizeInMB -Value {
"{0:N2} MB" -f ($this.Length / 1MB)
}
# テストファイルを作成
$testFile = New-Item -Path "$env:TEMP\test_file.dat" -ItemType File -Force
$randomData = New-Object byte[] 2MB
(New-Object Random).NextBytes($randomData)
[IO.File]::WriteAllBytes($testFile.FullName, $randomData)
# 新しいプロパティをテスト
$file = Get-Item $testFile.FullName
Write-Host "ファイル名: $($file.Name)"
Write-Host "サイズ(バイト): $($file.Length) bytes"
Write-Host "サイズ(KB): $($file.SizeInKB)"
Write-Host "サイズ(MB): $($file.SizeInMB)"
# テストファイルを削除
Remove-Item $testFile.FullName -Force
出力例:
ファイル名: test_file.dat
サイズ(バイト): 2097152 bytes
サイズ(KB): 2,048.00 KB
サイズ(MB): 2.00 MB
- プロセス情報の拡張:カスタム表示と分析プロパティ
# プロセスオブジェクトにカスタムプロパティを追加
Update-TypeData -TypeName System.Diagnostics.Process -MemberType ScriptProperty -MemberName MemoryMB -Value {
"{0:N2} MB" -f ($this.WorkingSet / 1MB)
}
Update-TypeData -TypeName System.Diagnostics.Process -MemberType ScriptProperty -MemberName IsHighMemory -Value {
$this.WorkingSet -gt 100MB
}
Update-TypeData -TypeName System.Diagnostics.Process -MemberType ScriptProperty -MemberName Summary -Value {
"$($this.ProcessName) (PID: $($this.Id)) - Memory: $($this.MemoryMB)"
}
# 新しいプロパティをテスト
$processes = Get-Process | Where-Object { $_.WorkingSet -gt 50MB } | Sort-Object -Property WorkingSet -Descending | Select-Object -First 3
$processes | Format-Table -Property ProcessName, Id, MemoryMB, IsHighMemory, Summary -AutoSize
出力例:
ProcessName Id MemoryMB IsHighMemory Summary
----------- -- -------- ------------ -------
chrome 1234 356.25 MB True chrome (PID: 1234) - Memory: 356.25 MB
explorer 2345 124.58 MB True explorer (PID: 2345) - Memory: 124.58 MB
powershell 3456 85.32 MB False powershell (PID: 3456) - Memory: 85.32 MB
- 型データの削除と再定義
# 既存の型拡張を確認
$testString = "テスト文字列"
Write-Host "WordCountプロパティの値(変更前): $($testString.WordCount)"
# 型拡張を削除
Remove-TypeData -TypeName System.String
# 型拡張を再定義(異なる動作に)
Update-TypeData -TypeName System.String -MemberType ScriptProperty -MemberName WordCount -Value {
# 日本語の文字数をカウント(簡易版)
$this.Length
}
# 新しい動作を確認
Write-Host "WordCountプロパティの値(変更後): $($testString.WordCount)"
出力例:
WordCountプロパティの値(変更前): 1
WordCountプロパティの値(変更後): 6
- XML型定義ファイルを使用した複雑な型拡張
# XML型定義ファイルの作成
$xmlContent = @'
<Types>
<Type>
<Name>System.IO.DirectoryInfo</Name>
<Members>
<ScriptProperty>
<Name>FileCount</Name>
<GetScriptBlock>
(Get-ChildItem -Path $this.FullName -File | Measure-Object).Count
</GetScriptBlock>
</ScriptProperty>
<ScriptProperty>
<Name>DirectoryCount</Name>
<GetScriptBlock>
(Get-ChildItem -Path $this.FullName -Directory | Measure-Object).Count
</GetScriptBlock>
</ScriptProperty>
<ScriptProperty>
<Name>TotalSize</Name>
<GetScriptBlock>
$size = Get-ChildItem -Path $this.FullName -File -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum
if($size.Sum -ge 1GB) {
return "{0:N2} GB" -f ($size.Sum / 1GB)
} elseif($size.Sum -ge 1MB) {
return "{0:N2} MB" -f ($size.Sum / 1MB)
} else {
return "{0:N2} KB" -f ($size.Sum / 1KB)
}
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
</Types>
'@
# 一時ファイルに保存
$xmlFilePath = Join-Path -Path $env:TEMP -ChildPath "DirectoryExtensions.ps1xml"
$xmlContent | Out-File -FilePath $xmlFilePath -Encoding utf8
# XML型定義ファイルを読み込み
Update-TypeData -AppendPath $xmlFilePath
# 新しいプロパティをテスト
$testDir = Get-Item $env:WINDIR
Write-Host "ディレクトリ: $($testDir.FullName)"
Write-Host "ファイル数: $($testDir.FileCount)"
Write-Host "サブディレクトリ数: $($testDir.DirectoryCount)"
Write-Host "合計サイズ: $($testDir.TotalSize)"
# 一時ファイルを削除
Remove-Item $xmlFilePath -Force
出力例:
ディレクトリ: C:\Windows
ファイル数: 295
サブディレクトリ数: 48
合計サイズ: 3.25 GB
対応PowerShellバージョン
Update-TypeDataコマンドレットは以下のPowerShellバージョンで利用可能である:
- Windows PowerShell 2.0以降
- PowerShell Core 6.0以降
- PowerShell 7.0以降
PowerShellの全バージョンでサポートされているが、バージョンによって一部の機能に違いがある:
- PowerShell 3.0以降では、型拡張のインラインによる定義がサポート(パラメータを直接指定して型を拡張する機能)
- PowerShell 5.0以降ではクラス定義と連携した拡張機能が強化されている
- PowerShell 7.0以降では型拡張の管理が改善され、パフォーマンスが向上している
参考サイト
【PowerShell】Update-TypeDataコマンドで型データを更新する方法
https://ss0832.github.io/posts/20250330_update-typedata-powershell/