PowerShellでファイルやディレクトリ情報を取得する:Get-Itemコマンドの5つの具体的な利用例は「Get-Itemは指定pathそのもののobjectを返し、directoryの中身は列挙しません。正確なpathには-LiteralPathを使い、fileのLength、hash、timestamps、attributesを読み、子項目にはGet-ChildItemを使います。」と理解すると迷いません。FileSystemだけでなくRegistry、Certificate等のprovider itemを扱うためproviderを意識する点が適用条件です。
特殊文字を含むpathはLiteralPathで読む
Get-Itemでは、ワイルドカード展開を避けたい実在パスにLiteralPathを使い、Test-Pathで存在を確認してから取得します。ファイル、レジストリ、証明書などProviderによって返る型とプロパティが異なるため、PSProvider、FullName、Length、Attributesを確認します。アクセス拒否は対象なしとして処理せず、例外を記録します。
- Get-PSProviderとGet-PSDriveで現在のproviderを確認する
- Test-Path -LiteralPathで存在とPathTypeを確認する
- Resolve-Pathで実pathを確認する
- symlinkやreparse point、access権をGet-Item propertyで確認する
itemそのものとchild itemを区別する
Get-Itemの戻りobject型はproviderにより異なります。FileInfoのLengthとDirectoryInfo、RegistryKeyのpropertyを同じ前提で扱いません。CreationTimeはcopyで変わることがあり、作成者や真正性の証明ではありません。wildcard複数結果と-LiteralPath一件を区別し、FullNameとPSPathを必要に応じて記録します。
FileSystem・Registry providerの型を確認する
- directory内容が返ると思う
- Pathのwildcardで複数itemを巻き込む
- CreationTimeをfile真正性とみなす
- provider違いを無視する
- remote接続を権限確認なしで追加する
wildcard展開後の候補数を数える
file metadataを取得
Get-Item -LiteralPath 'C:\Data\report[final].txt' |
Select-Object FullName,Length,CreationTimeUtc,LastWriteTimeUtc,Attributes
LiteralPathなら角括弧をwildcardとして扱いません。timestampはUTC列を記録すると端末timezone差を減らせます。
directory自体を確認
Get-Item -LiteralPath 'C:\Data' | Format-List FullName,Attributes,CreationTimeUtc,LastWriteTimeUtc,LinkType,Target
directory内容ではなくdirectory itemのpropertyです。中身はGet-ChildItemへ分けます。
wildcard候補を確認
Get-Item -Path 'C:\Data\*.txt' | Select-Object FullName,Length,LastWriteTimeUtc
Pathはwildcard展開します。0件や複数件が正常かを決め、変更commandへ直接pipeしません。
Registry itemを読む
Get-Item -LiteralPath 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' |
Select-Object Name,Property
provider itemのproperty名一覧であり、値の詳細はGet-ItemPropertyを使います。remote registryや書込は別権限です。
存在しない場合を明示
$item = Get-Item -LiteralPath '.\settings.json' -ErrorAction SilentlyContinue
if ($null -eq $item) { '対象なし' } else { $item.FullName }
例外を黙殺して成功扱いせず、nullを分岐します。自動化ではerror内容も安全なlogへ残します。
不存在とaccess拒否を別stateにする
Get-Itemは読み取りですが、取得objectにはDelete等のmethodが見えるため、methodを呼びません。remote Invoke-Commandは認証と接続先を限定し、credentialをcodeへ埋め込みません。属性やtimestampを変更する場合は元property、ACL、hashを保存し、test copyで確認してから実行します。不合格ならbackup copyとproperty記録から復元します。
linkのTargetと実体pathを記録する
Get-ItemのGetType、Get-Member、FullName、PSProviderを記録し、Explorerやreg.exe queryなど別の読み取り手段と主要値を照合します。fileはGet-FileHashも取得し、pathだけ同じ別fileでないことを確認します。操作前後でmetadataが変わっていないことを確認します。
object型・full path・候補数で検収する
Get-Itemはcontainerの中身ではなく指定item自体を返します。literalな[]や*を含むpathは-LiteralPath、展開が必要なときだけ-Pathを使い、file、directory、registryでpropertyの意味が違うことをProviderとPSPathから確認します。
角括弧を含むfileをexact取得する
try { $i=Get-Item -LiteralPath 'C:\Data\report[final].txt' -ErrorAction Stop; [pscustomobject]@{State='Found';Type=$i.GetType().FullName;Path=$i.FullName;Length=$i.Length} } catch { [pscustomobject]@{State='ReadError';Category=$_.CategoryInfo.Category} }
Found・NoMatch・ReadErrorを分類する
- itemを取得:exact pathから一つのitemを取得し、FullName/Length/Attributes等が期待するprovider型になる
- 候補なし:存在しないitemはTest-Pathだけで推測せずObjectNotFoundとして記録する
- provider・permission error:wildcard複数、access denied、broken link、provider不在は候補数とErrorRecordを分ける
Get-Item C:\Data\*.txtは複数を返し得るため一意処理へ直結しません。Format-List後の表示文字列をdataとして渡さず、Registryのdefault valueはGet-ItemProperty等と役割を分けます。
wildcard 0件・1件・複数件を試す
$items=@(Get-Item -Path 'C:\Data\*.txt' -ErrorAction SilentlyContinue)
[pscustomobject]@{CandidateCount=$items.Count;UniquePaths=@($items.FullName|Sort-Object -Unique).Count}
literal[]名、wildcard 0/1/複数、directory、symlink、registry、read不可をtestします。Provider、型、PSPath、候補数、UTC時刻、例外categoryを保存します。
Get-Itemはcontainerの中身ではなく対象そのものを返します。wildcardが必要な場面だけ-Pathを使い、LiteralPathの結果と候補数を混ぜずに記録してください。

コメント