PowerShellでファイルやディレクトリ情報を取得する:Get-Itemコマンドの5つの具体的な利用例

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の結果と候補数を混ぜずに記録してください。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次