New-Itemの五provider例では、表示名ではなくprovider・ItemType・exact target pathを最初の対象キーにします。変更や集計へ進む前に既存有無とparent containerを保存し、別対象を同じ結果へ混ぜないことが出発点です。
この手順の合格条件は「sandbox内の五objectだけを作成・検証できた状態」です。Microsoft Learn:New-ItemのItemType/provider差とTest-Pathによる存在確認が定義するNew-ItemのItemType/provider差とTest-Pathによる存在確認を根拠にし、画面へ値が出たことだけを成功とは判定しません。
停止条件:target既存・link privilege不足・parent不在。該当するときは操作を進めず、demo objectを個別に確認し承認したものだけ片付けるを実行可能な形で確認してから再計画します。
New-Itemの五provider例|完了像を先に言語化する:sandbox内の五objectだけを作成・検証できた状態
New-Itemを実行できたこと自体は完了条件ではありません。New-Itemの5つの用途のLiteralPath、ファイル種別、長さ、更新時刻、SHA-256が維持され、Get-ChildItemで変更値と関連機能を確認できて初めて完了です。
1. テキストファイルを新規作成するの確認では、成功メッセージよりGet-ChildItemの実データを優先します。パスの誤記、アクセス拒否、ジャンクション、オンライン専用ファイルが残るときは、正常なゼロ件として扱いません(New-Itemの5つの用途の判断では「同名存在、プロバイダー、リンク権限、相対パスを確認する」を優先し、Get-ChildItemが空なら成功扱いしません)。
| 判断要素 | New-Itemの5つの用途で記録する内容 |
| 対象の識別 | LiteralPath、ファイル種別、長さ、更新時刻、SHA-256 |
| 最初の確認 | Join-Path |
| 変更または操作 | New-Item |
| 再確認 | Get-ChildItem |
| 中止条件 | 対象のフルパスを一意にできず、既存データを上書きする可能性がある |
New-Itemの五provider例|比較に使うbaselineを採る:既存有無とparent container
New-Itemの5つの用途の読み取り例を示します。最初は通常権限で試し、アクセス拒否が出た箇所だけ必要権限を確認します。
$root = Join-Path $env:TEMP ('ittrip-new-item-' + [guid]::NewGuid().ToString('N'))
$statePath = "$root.state.json"
if (Test-Path $root -or Test-Path $statePath) { throw 'Unique sandbox collision' }
$expectedNames = @('Folder','empty.txt','settings.json','empty.txt.link','Folder.link')
[ordered]@{ Schema=1; Root=$root; ExpectedNames=$expectedNames; CreatedUtc=[DateTime]::UtcNow.ToString('o') } | ConvertTo-Json | Set-Content -LiteralPath $statePath -Encoding utf8 -NoNewline -ErrorAction Stop
[pscustomobject]@{ Root=$root; State=$statePath; ExpectedObjects=5; RootExists=$false }
Join-Pathの結果は対象パスの存在、件数、ハッシュ、コピー先を実行前後で比較する順に読みます。件数、固有ID、状態、取得時刻を保存すると、後のGet-ChildItemと比較できます。
「基本的な使い方」はNew-Itemの5つの用途の対象範囲を決める論点です。Join-Pathの前に基本的な使い方の現在状態を確認し、LiteralPath、ファイル種別、長さ、更新時刻、SHA-256と対応付けます(New-Itemの5つの用途の判断では「同名存在、プロバイダー、リンク権限、相対パスを確認する」を優先し、Get-ChildItemが空なら成功扱いしません)。
「具体的な利用例」を検証する際は対象パスの存在、件数、ハッシュ、コピー先を実行前後で比較する順序を崩しません。New-Itemの5つの用途の別スコープや別ユーザーの値を混ぜないことが重要です。
「1. テキストファイルを新規作成する」の値が想定と違う場合、パスの誤記、アクセス拒否、ジャンクション、オンライン専用ファイルを切り分けます。同名存在、プロバイダー、リンク権限、相対パスを確認する。-Forceでも既存データの保護確認を省略しない。 ため、1. テキストファイルを新規作成するを強制的に書き換えて症状を隠しません。
New-Itemの5つの用途で「2. 新しいフォルダを作成する」を扱うときは、2. 新しいフォルダを作成するの表示名だけでなくLiteralPath、ファイル種別、長さ、更新時刻、SHA-256を記録します。Get-ChildItemでも同じ対象が返ることを確かめます。
New-Itemの5つの用途の「3. レジストリキーを新規作成する」では、Join-Pathの取得時刻と対象件数を残します。後からGet-ChildItemを実行したとき、3. レジストリキーを新規作成するの差分理由を説明できる形にします。
4. 環境変数を作成するの確認結果はNew-Itemの5つの用途の変更可否に直結します。対象のフルパスを一意にできず、既存データを上書きする可能性があるなら、4. 環境変数を作成するの調査記録を残して実行を見送ります。
Join-Pathの空結果は成功とは限りません。New-Itemの5つの用途ではパスの誤記、アクセス拒否、ジャンクション、オンライン専用ファイルを調べ、エラーを非表示にした場合も件数へ含めます。
New-Itemの5つの用途でTest-Pathが利用できない場合、Editionやモジュールを確認します。存在しない代替コマンドを作らず、公式の設定経路へ切り替えます。
New-Itemへ渡す対象はLiteralPath、ファイル種別、長さ、更新時刻、SHA-256で一意にします(New-Itemの5つの用途ではTEMP配下は通常ユーザーの範囲でJoin-Pathが返す固有値を基準にします)。New-Itemの5つの用途の表示名だけを部分一致させて複数件を処理しません。
New-Itemの5つの用途でGet-ChildItemを使う前に、Get-Command Get-ChildItemでSourceとVersionを確認します。別モジュールの同名コマンドを実行しないためです。
Select-ObjectはNew-Itemの5つの用途の5番目の確認手段です。Get-Help Select-Object -Fullで利用できるパラメーターを調べ、出力型と対象件数を記録します(New-Itemの5つの用途の判断では「同名存在、プロバイダー、リンク権限、相対パスを確認する」を優先し、Get-ChildItemが空なら成功扱いしません)。
New-Itemの五provider例|接続先とscopeを確定する:provider・ItemType・exact target path
New-Itemの5つの用途で使うPowerShellの版は $PSVersionTable で、コマンドの提供元は Get-Command Join-Path で確認します。TEMP配下は通常ユーザー。対象候補が複数ならLiteralPath、ファイル種別、長さ、更新時刻、SHA-256を使い、表示名の部分一致だけで選びません(New-Itemの5つの用途ではTEMP配下は通常ユーザーの範囲でJoin-Pathが返す固有値を基準にします)。
- New-Itemの5つの用途: 実行端末と現在ユーザーを記録する
- Join-Path: Source、Version、利用可能なパラメーターを確認する
- LiteralPath、ファイル種別、長さ、更新時刻、SHA-256: 変更前の値を日時付きで保存する
- 元ファイルの別名コピー、ハッシュ、ACL、宛先の既存有無: 復旧に使えることを読み取り確認する
- 対象のフルパスを一意にできず、既存データを上書きする可能性がある: 該当すれば本番実行を見送る
New-Itemの五provider例|承認済み対象だけを処理する:provider・ItemType・exact target path
New-Itemの5つの用途でNew-Itemを使う例は一対象に限定しています。WhatIfを利用できる場合は先に対象を表示し、外部コマンドでは読み取りオプションか検証端末を使います(New-Itemの5つの用途の判断では「同名存在、プロバイダー、リンク権限、相対パスを確認する」を優先し、Get-ChildItemが空なら成功扱いしません)。
$state = Get-Content -Raw -LiteralPath $statePath -ErrorAction Stop | ConvertFrom-Json
$root = [string]$state.Root; $created = [Collections.Generic.List[string]]::new()
function Remove-CreatedSandboxObjects { foreach ($item in @($created | Select-Object -Reverse)) { if (Test-Path -LiteralPath $item) { Remove-Item -LiteralPath $item -ErrorAction Stop } } }
if ((Read-Host "Type CREATE-SANDBOX for exact root $root") -cne 'CREATE-SANDBOX') { throw 'Cancelled' }
try {
New-Item -ItemType Directory -Path $root -ErrorAction Stop | Out-Null; $created.Add($root)
$folder = New-Item -ItemType Directory -Path (Join-Path $root 'Folder') -ErrorAction Stop; $created.Add($folder.FullName)
$file = New-Item -ItemType File -Path (Join-Path $root 'empty.txt') -ErrorAction Stop; $created.Add($file.FullName)
$json = New-Item -ItemType File -Path (Join-Path $root 'settings.json') -ErrorAction Stop; $created.Add($json.FullName)
$hard = New-Item -ItemType HardLink -Path (Join-Path $root 'empty.txt.link') -Target $file.FullName -ErrorAction Stop; $created.Add($hard.FullName)
$symbolic = New-Item -ItemType SymbolicLink -Path (Join-Path $root 'Folder.link') -Target $folder.FullName -ErrorAction Stop; $created.Add($symbolic.FullName)
} catch { $original = $_; Remove-CreatedSandboxObjects; if (Test-Path $root) { throw 'Partial cleanup failed' }; throw $original }
if (@(Get-ChildItem -LiteralPath $root -Force).Count -ne 5) { Remove-CreatedSandboxObjects; throw 'Expected five sandbox objects' }
同名存在、プロバイダー、リンク権限、相対パスを確認する。-Forceでも既存データの保護確認を省略しない。 そのため、New-Itemの結果が期待どおりでも環境固有の制約を再確認します。
New-Itemの五provider例|戻せる材料を先にそろえる:demo objectを個別に確認し承認したものだけ片付ける
New-Itemの5つの用途の変更前には元ファイルの別名コピー、ハッシュ、ACL、宛先の既存有無を保存します。保存したファイルや値が実際に読めることを確認し、同じ端末内の上書きだけをバックアップと呼びません(New-Itemの5つの用途ではTEMP配下は通常ユーザーの範囲でJoin-Pathが返す固有値を基準にします)。
New-Itemの五provider例|期待値と実測を突き合わせる:sandbox内の五objectだけを作成・検証できた状態
「PowerShellで新しいアイテムを作成する:New-Itemコマンドの5つの具体的な利用例」でNew-Itemの5つの用途を判断する場面では、Get-ChildItemでは、変更前に保存したLiteralPath、ファイル種別、長さ、更新時刻、SHA-256と同じ対象を選びます。対象パスの存在、件数、ハッシュ、コピー先を実行前後で比較することで、別スコープの値を成功結果として採用しません(New-Itemの5つの用途ではTEMP配下は通常ユーザーの範囲でJoin-Pathが返す固有値を基準にします)。
$statePath = Read-Host 'Paste the exact full statePath printed by block 1'
if (-not [IO.Path]::IsPathFullyQualified($statePath) -or -not (Test-Path -LiteralPath $statePath -PathType Leaf)) { throw 'Exact statePath is required' }
$state = Get-Content -Raw -LiteralPath $statePath -ErrorAction Stop | ConvertFrom-Json
$root = [string]$state.Root; $expected = @($state.ExpectedNames | Sort-Object)
if (-not $root.StartsWith(([IO.Path]::GetFullPath($env:TEMP).TrimEnd('\') + '\ittrip-new-item-'), [StringComparison]::OrdinalIgnoreCase)) { throw 'Sandbox root identity failed' }
$actual = @(Get-ChildItem -LiteralPath $root -Force -ErrorAction Stop | Select-Object -ExpandProperty Name | Sort-Object)
if (($actual -join '|') -ne ($expected -join '|')) { throw 'Exact sandbox child set mismatch; refusing cleanup' }
Get-ChildItem -LiteralPath $root -Force | Select-Object Name, LinkType, Target, Length
if ((Read-Host "Type CLEANUP to remove only $root") -cne 'CLEANUP') { throw 'Cleanup not approved' }
foreach ($name in @('Folder.link','empty.txt.link','settings.json','empty.txt','Folder')) {
$exactChild = Join-Path $root $name
if (-not (Test-Path -LiteralPath $exactChild)) { throw "Expected sandbox child disappeared: $name" }
Remove-Item -LiteralPath $exactChild -ErrorAction Stop
}
if ([System.IO.Directory]::EnumerateFileSystemEntries($root).GetEnumerator().MoveNext()) { throw 'Sandbox root is not empty after exact child cleanup' }
Remove-Item -LiteralPath $root -ErrorAction Stop
if (Test-Path -LiteralPath $root) { throw 'Sandbox cleanup verification failed' }
Remove-Item -LiteralPath $statePath -ErrorAction Stop
[pscustomobject]@{ Root=$root; CleanupVerified=$true }
- Get-ChildItem: 同じ対象IDを再取得できた
- New-Itemの5つの用途: 意図した値または件数だけが変化した
- 対象パスの存在、件数、ハッシュ、コピー先を実行前後で比較する: 関連機能も異常がない
- パスの誤記、アクセス拒否、ジャンクション、オンライン専用ファイル: 取得失敗をゼロ件として扱っていない(New-Itemの5つの用途の判断では「同名存在、プロバイダー、リンク権限、相対パスを確認する」を優先し、Get-ChildItemが空なら成功扱いしません)。
- 同名存在、プロバイダー、リンク権限、相対パスを確認する。-Forceでも既存データの保護確認を省略しない。: 環境固有の制約に反していない
New-Itemの五provider例|権限や到達性の不足で中断する:target既存・link privilege不足・parent不在
New-Itemの5つの用途でアクセス拒否が出た場合は、すぐ管理者として再実行せずTEMP配下は通常ユーザーという必要範囲を確認します。対象側のACLや管理ロールも分けて調べます。
New-Itemの5つの用途が時間経過後に元へ戻る場合は、GPO/MDM、同期、サービス再起動、別スコープを調べます。繰り返し上書きして管理設定と競合させません。
対象のフルパスを一意にできず、既存データを上書きする可能性がある状態はNew-Itemの5つの用途の中止条件です。復旧に必要な人・経路・データが揃うまで、本番端末ではNew-Itemを実行しません。
断定できません。New-Itemの5つの用途ではパスの誤記、アクセス拒否、ジャンクション、オンライン専用ファイルでも空になります。エラーを表示し、権限とスコープを確認してからGet-ChildItemまたは別の公式な取得方法で照合します(New-Itemの5つの用途ではJoin-Pathの対象件数とGet-ChildItemの再取得値を一致させます)。
New-Itemの五provider例|保存値から原状を再構成する:demo objectを個別に確認し承認したものだけ片付ける
専用フォルダーの外を対象にしない。作成前のTest-Path結果を保存し、既存項目を上書きしない。
New-Itemの5つの用途を戻した後はJoin-PathとGet-ChildItemを再実行し、LiteralPath、ファイル種別、長さ、更新時刻、SHA-256が変更前記録と一致することを確認します。復旧処理にも失敗したら連続操作を止め、保存した元ファイルの別名コピー、ハッシュ、ACL、宛先の既存有無とログを担当者へ渡します(New-Itemの5つの用途ではTEMP配下は通常ユーザーの範囲でJoin-Pathが返す固有値を基準にします)。
- Join-Pathの実行時刻、対象件数、エラー件数を残した
- LiteralPath、ファイル種別、長さ、更新時刻、SHA-256で対象を一意に特定した
- 元ファイルの別名コピー、ハッシュ、ACL、宛先の既存有無を変更前に保存して読めることを確認した
- New-Itemの対象を一端末・一ユーザー・一設定に限定した
- Get-ChildItemと実利用テストの両方を確認した
- 対象のフルパスを一意にできず、既存データを上書きする可能性がある場合は実行を中止した
New-Itemの五provider例|適用scopeの疑問へ答える:FileとDirectory以外のprovider例
権限だけが原因とは限りません。同名存在、プロバイダー、リンク権限、相対パスを確認する。-Forceでも既存データの保護確認を省略しない。 対象のフルパスを一意にできず、既存データを上書きする可能性があるなら昇格して続行せず、対応Edition、対象ID、ポリシー、復旧経路を確認します(New-Itemの5つの用途ではGet-ChildItemが同じ対象を返さない場合、専用フォルダーの外を対象にしない)。
New-Itemの五provider例|五つの例を目的別に比べる:provider・ItemType・exact target path
例1:New-Itemで検証ディレクトリを作成
New-Item -ItemType Directory -Path (Join-Path $env:TEMP 'ittrip-new-item-demo') -WhatIf
親pathと既存有無を確認し、検証ディレクトリ一つに限定します。
例2:New-Itemで空ファイルを作成
New-Item -ItemType File -Path (Join-Path $env:TEMP 'ittrip-new-item-demo\report.txt') -WhatIf
既存ファイルを上書きしないようTest-Pathを先に実行します。
例3:New-ItemでHKCUの検証keyを作成
New-Item -Path 'HKCU:\Software\ITtripDemo' -WhatIf
machine hiveではなくcurrent userの検証keyに限定します。
例4:New-Itemでsymbolic linkをpreview
New-Item -ItemType SymbolicLink -Path (Join-Path $env:TEMP 'ittrip-link') -Target (Join-Path $env:TEMP 'ittrip-new-item-demo') -WhatIf
link作成権限とTargetの存在を確認してから実行します。
例5:New-ItemでVariable providerへ値を作成
New-Item -Path Variable:ITtripNewItemDemo -Value 'sample' -WhatIf
process内の検証variableに限定し、永続設定を変えません。

コメント