この記事で言いたいこと
PowerShell は「コマンドを打つツール」でもありますが、もう一つの顔は .NET(特に .NET Framework)の型・クラスをそのまま呼べる“プログラミング環境” ということです。
ここが腑に落ちると、PowerShell の理解が一気に進みます。
-
Get-ChildItemみたいなコマンドだけでなく -
[System.IO.File]::ReadAllText()みたいに .NET のメソッドを直で呼んで - 強力な文字列処理・ファイル処理・HTTP・暗号化・XML/JSON などが使える
この記事では、
- PowerShell と .NET Framework の関係
- 静的メソッド/インスタンスの使い分け
- どの .NET のドキュメントを見ればいいか
を、初心者目線で整理します。
PowerShellと.NET Frameworkの関係
PowerShellは「.NETの上に乗ってる」
PowerShell で扱っている値は、だいたいが .NET のオブジェクトです。
例:Get-Date の戻り値は文字列ではなく、.NET の DateTime 型です。
$d = Get-Date
$d.GetType().FullName
# System.DateTime
つまり PowerShell は、
- 「文字列をつなぐ世界」
ではなく、
- 型とメソッドを持ったオブジェクトの世界
だと捉えた方が理解しやすくなります。
.NET Frameworkとは何か
一言でいうと:
Windows 向けに長く使われてきた .NET の実行環境&巨大な標準ライブラリ
- 実行環境:C# などで書いたプログラムを動かす仕組み(CLR)
-
標準ライブラリ:
System.IO、System.Net、System.Xmlなど、便利機能の塊
PowerShell(特に Windows PowerShell 5.1)は、この .NET Framework を前提に作られています。
なんでPowerShellで.NET Frameworkを使うのか
結論はシンプルで、
車輪の再発明をしなくていいから
です。
PowerShell 単体のコマンドでは届かないところを、.NET のライブラリで一撃で埋められます。
便利ポイントの例
- ファイル操作:高速・細かい制御が可能
- 文字列/正規表現:.NET 由来で強力
- HTTP/暗号化:標準で揃っている
- XML/JSON:オブジェクトとして扱える
- OS API:必要なら Win32 まで届く
PowerShell からこれらを「そのまま呼べる」のが強みです。
「どんな言語で書かれてるの?」問題
- .NET Framework 自体:主に C# などで実装(内部には C++ なども混ざる)
- PowerShell の世界:あなたが書いているのは PowerShell スクリプト
でも実際には、
PowerShell スクリプトから .NET クラス(C# 由来など)を呼んでいる
という構図になっています。
重要なのは「中身の実装言語」よりも、
“型と API(クラス/メソッド)を呼んでいる”
という見方です。ここを押さえると、理解が一気に進みます。
まずここを押さえると理解が進む(最短ルート)
1) PowerShellは“オブジェクトのパイプ”だと知る
Get-Process | Get-Member
Get-Member で「プロパティ」「メソッド」が見えます。
NameId-
Kill()などのメソッド
→ ここが 「.NET オブジェクトの世界」に入る入口 です。
2) 型名(クラス名)を見に行く癖をつける
(Get-Process | Select-Object -First 1).GetType().FullName
ここで出てくる
System.Diagnostics.ProcessSystem.IO.FileInfo
のような クラス名を意識する癖をつけると、後からドキュメントを引きやすくなります。
3) .NETの静的メソッドを使ってみる(超重要)
PowerShell で 「.NET を使ってる感」 が一番出るのがここです。
静的メソッド・静的プロパティの使い方(PowerShellの“必修”)
書き方
-
静的メソッド:
[クラス名]::メソッド(引数) -
静的プロパティ:
[クラス名]::プロパティ
例1:ファイルを一発で読む(.NET)
$text = [System.IO.File]::ReadAllText("C:\temp\a.txt")
$text
例2:パス結合(地味に便利)
$path = [System.IO.Path]::Combine("C:\temp", "a.txt")
$path
例3:環境情報(静的プロパティ)
[Environment]::MachineName
[Environment]::OSVersion
インスタンス(newして使う)との違い
インスタンスが必要なケース
**「状態を持つもの」**は new して使うことが多いです。
例:文字列を効率よく連結する StringBuilder
$sb = [System.Text.StringBuilder]::new()
$null = $sb.AppendLine("Hello")
$null = $sb.AppendLine("World")
$sb.ToString()
ここでのポイントは:
-
::は 「クラスに直接アクセス」 -
.(ドット)は 「インスタンスのメンバーにアクセス」
という役割分担です。
この 2 つが分かると、PowerShell のコードが一気に読みやすくなります。
「.NETのドキュメント、どれを見ればいい?」問題
ここはかなりハマりポイントです。
まず結論
-
Windows PowerShell 5.1
→ .NET Framework の API を見ることが多い -
PowerShell 7+
→ .NET(いわゆる .NET / .NET Core 系)の API を見ることが多い
自分のPowerShellがどっちか確認
$PSVersionTable
# 目安:
# - Windows PowerShell は 5.1 系
# - PowerShell 7+ は 7.x 系
ドキュメント参照のコツ(迷子防止)
-
クラス名を特定する(
GetType()/Get-Member) - Microsoft Learn の該当クラスページを開く
-
バージョン/対象フレームワークの表示に注意
- 古い環境だとメソッドが無いことがある
あなたが感じた
「ドキュメントにあるのに自分の環境ではメソッドが無い」
は、だいたい ここ(対象 .NET の違い)が原因です。
PowerShellで.NETを使うときの頻出パターン集
型を明示したい
[int]$n = 10
[datetime]$dt = Get-Date
型変換(キャスト)
[int]"123"
[datetime]"2026-01-14"
例外(.NET例外)がそのまま飛んでくる
try {
[System.IO.File]::ReadAllText("C:\nope.txt")
} catch {
$_.Exception.GetType().FullName
$_.Exception.Message
}
ここで見えているのも、.NET の例外オブジェクトです。
まとめ:PowerShellの“入り口”は.NETだと割り切ると楽
- PowerShell の正体は 「.NET オブジェクトをパイプで流す言語」
-
Get-MemberとGetType()が オブジェクト世界の地図になる -
::(静的)と.(インスタンス)を分けて理解すると、成長が一気に加速する - ドキュメントは 「自分の PowerShell がどの .NET 前提か」 を先に確認する
「PowerShell が難しい」のではなく、
「.NET の世界を触っている」と自覚できていないだけ
というケースも多いです。