PowerShellのGet-Commandでは、画面に値が出たことと目的を満たしたことを分けて考えます。結論は「Get-Commandはcommandを実行せず、現在のsessionで解決できるcmdlet、function、alias、applicationを調べる入口です。名前、module、CommandTypeで絞り、Source、Version、Definitionを確認してからGet-Helpへ進みます。」。Windows PowerShell 5.1とPowerShell 7.xで利用可能なmoduleやcommandが異なる条件のもと、出力の意味、境界値、影響のある操作を順に確認します。
command解決scopeを最初に固定する
Get-Commandを使うときは、同名のエイリアス、関数、コマンドレット、実行ファイルが現在のセッションでどの順に解決されるかを確認します。Nameだけで判断せず、CommandType、Source、ModuleName、Version、Pathを表示し、実行予定の実体と構文が一意に定まってから後続処理へ渡します。
- $PSVersionTableでeditionとversionを確認する
- Get-Module -ListAvailableでmoduleのversionとpathを確認する
- Get-Command name -Allで同名commandの優先順位を確認する
- Get-ExecutionPolicy -Listは読み取りだけに留め、見つからない理由をpolicy無効化で解決しない
Name・CommandType・Source・Versionを読む
verbやnounから候補を探す
Get-Command -Verb Get -Noun *Service* |
Select-Object Name, CommandType, Source, Version
PowerShellのVerb-Noun命名を利用し、一覧全体を出すより検索意図を絞ります。結果が0件ならmodule未導入、import未完了、edition差を順に確認します。
特定moduleのcommandを調べる
Get-Command -Module Microsoft.PowerShell.Management |
Sort-Object Noun, Verb |
Select-Object Name, Version
-Moduleは指定module由来のcommandを絞ります。ActiveDirectoryのような任意moduleを例に決め打ちせず、Get-Module -ListAvailableの結果にあるmoduleを使います。
同名commandをすべて表示
Get-Command Get-Date -All |
Format-List Name,CommandType,Source,Version,Definition
alias、function、cmdlet、applicationが同名の場合、先に解決されるcommandだけを見ると誤解します。-Allで候補を並べ、SourceとDefinitionを確認します。
applicationの実体pathを確認
Get-Command git -CommandType Application -ErrorAction SilentlyContinue |
Select-Object Name,Source,Path,Version
PATH上の実行fileを調べる読み取り操作です。複数版が疑われる場合は-Allを加え、信頼できないdirectoryが先に来ていないか管理者へ確認します。
parameter情報へ進む
Get-Command Get-Process -Syntax
Get-Help Get-Process -Parameter Name
-Syntaxでparameter setの概形を確認し、詳細はGet-Helpで読みます。見つけたcommandを管理者権限で即実行せず、SupportsShouldProcessや影響範囲をhelpで確認します。
alias・function・applicationのshadowingを見抜く
Get-Commandは現在のsession stateとPSModulePath、PATHの影響を受けます。別端末で結果が違う場合はversion、edition、module path、import状態を比較します。Nameにwildcardを使う検索と、完全な名前解決ではimport挙動が異なることがあります。CommandTypeがAliasならResolvedCommand、FunctionならDefinitionを確認し、見た目が同じ名前でも実装を識別します。
module絞り込みで候補を減らす
Get-Command対象 -Allの結果、Source、Version、Pathを作業記録へ保存し、Get-Help -Fullでparameterとexampleを確認します。変更commandを採用する場合はtest対象を限定し、WhatIf対応をGet-CommandのParametersまたはhelpで調べます。sessionを開き直しても同じcommandへ解決することを確認します。
外部programはPathまで一意にする
- タイトルから欠落したGet-Command名を別cmdletと誤認する
- -Moduleへ未導入moduleを指定して0件をcommand不存在と判断する
- aliasをcmdlet本体と混同する
- PowerShell 7の結果をWindows PowerShell 5.1へそのまま当てる
- application pathの優先順位を見ない
Get-HelpとSyntaxでparameterを照合する
Get-Command自体は読み取りです。commandが見つからないからといってexecution policyをBypassへ変更したり、出所不明moduleをinstallしたりしません。必要moduleはpublisher、repository、version、署名、組織承認を確認し、isolatedなtest環境へ導入します。profileで定義したfunctionが標準cmdletを隠している場合はprofileを退避してno-profile sessionで比較し、変更したprofileはbackupから戻せるようにします。
候補数と優先順位から実行実体を確定する
Get-Commandはalias、function、cmdlet、applicationを同じ名前空間から探します。-Allでshadowingを確認し、-CommandTypeと-Moduleで候補を限定します。見つかればobjectを返し、-ErrorAction Stopで未検出をcatchすれば、曖昧な空出力と例外を分離できます。
-Allで同名commandの全候補を表示する
$rows=Get-Command Get-Date -All -ErrorAction Stop
$rows | Select-Object Name,CommandType,Source,Version,Path
if($rows.Count -ne 1){ Write-Warning "候補数=$($rows.Count)" }
一意・複数・見つからないを分類する
- 実体を一意化:Name、CommandType、Source/ModuleName、VersionまたはPathが一意に得られる
- 複数候補あり:SilentlyContinueで0件なら未導入かPATH外として扱い、同名の別commandへ自動fallbackしない
- command未検出:module import失敗、provider error、invalid wildcardはErrorRecordを保存して探索条件を見直す
Get-Command nameだけではaliasが先に解決される場合があります。-Allの順序とPathを確認し、Get-Helpは選んだCommandInfoに対応するmodule/versionで参照します。applicationは拡張子とPATHEXTの影響も受けます。
存在しない名前とalias競合を試す
try { Get-Command 'ittrip-command-that-does-not-exist' -ErrorAction Stop | Out-Null; 'Unexpected' } catch { [pscustomobject]@{State='NotFound';Category=$_.CategoryInfo.Category} }
aliasとcmdlet同名、複数PATH、未導入、module明示、wildcardをtestします。候補数、実体Path、module version、parameter setを保存し、次の実行は選択した実体へ限定します。
自動化では表示名だけを信頼せず、CommandType、Source、Version、Pathを保存します。同名候補が複数ある環境では、module修飾名または絶対pathへ固定してから実行してください。

コメント