はい、承知いたしました。PowerShell 2.0の詳細な説明を含む、入門・基本に焦点を当てた約5000語の記事を作成します。
PowerShell 2.0 とは?入門・基本を紹介
はじめに:PowerShell 2.0の世界へようこそ(ただし重要な注意点があります)
かつて、Windowsのシステム管理は、コマンドプロンプト(cmd.exe)やVBScript、バッチファイルなどが主流でした。しかし、これらのツールでは、複雑なタスクの自動化や、システムの状態を統一的に管理することに限界がありました。そこでMicrosoftは、新しいコマンドラインシェルとスクリプト環境として「PowerShell」を開発しました。
PowerShellは、その強力な機能と柔軟性から、Windows環境におけるシステム管理のデファクトスタンダードへと成長しました。そして、PowerShellの歴史において、特に重要な位置を占めるバージョンの一つが PowerShell 2.0 です。
PowerShell 2.0は、Windows 7およびWindows Server 2008 R2で標準機能として搭載され、それ以前のOS(Windows XP SP3, Windows Server 2003 SP2, Windows Vista SP1, Windows Server 2008)にも.NET Framework 2.0 SP2および3.5 SP1と共にオプションでインストール可能でした。これにより、多くの企業環境でPowerShellが利用されるきっかけとなり、その普及に大きく貢献しました。
本記事では、この歴史的なバージョンであるPowerShell 2.0に焦点を当て、その基本的な概念、使い方、主要な機能を詳細に解説します。「なぜ今PowerShell 2.0なのか?」と思われるかもしれません。現代の主流はPowerShellの新しいバージョン(Windows PowerShell 5.1やPowerShell Core/7+)ですが、古いシステム環境や特定のレガシーアプリケーションとの互換性のために、PowerShell 2.0が稼働している環境に遭遇する可能性はゼロではありません。また、PowerShellの基本的な考え方や構造はバージョン2.0で既に確立されており、その理解は最新バージョンを学ぶ上でも役立ちます。
しかし、本記事を読むにあたり、非常に重要な注意点 があります。
【!!!重要な警告!!!】
PowerShell 2.0は、Microsoftによるサポートが既に終了しています。 サポートが終了したソフトウェアは、セキュリティ上の脆弱性が発見されても修正プログラムが提供されません。PowerShell 2.0には、特にリモート通信機能(WinRM)に関連するセキュリティ上のリスクが指摘されており、既知の脆弱性が悪用される可能性があります。
現代のシステムにおいて、PowerShell 2.0を有効化したり、積極的に利用したりすることは、セキュリティ上の観点から強く非推奨です。 可能な限り速やかに、Windows PowerShell 5.1(Windows 10/Server 2016以降に標準搭載)またはクロスプラットフォームなPowerShell 7+への移行を強く推奨します。
本記事は、あくまでPowerShell 2.0の仕組みや当時の使い方を理解するための学習資料としてご利用ください。実際の運用環境でPowerShell 2.0を使い続けることは避けてください。
上記の警告を踏まえ、PowerShell 2.0の基本を学んでいきましょう。
1. PowerShellの基本概念
まず、PowerShellとは何か、その基本的な考え方を理解しましょう。
1.1 シェルとは?
シェル(Shell)とは、コンピュータのオペレーティングシステム(OS)の機能を利用するためのインターフェースのことです。ユーザーからの命令を受け付け、OSに伝えて実行させ、その結果をユーザーに返します。
Windowsにおける従来のシェルは、GUI(Graphical User Interface)であるエクスプローラーが一般的でした。しかし、PowerShellはCUI(Character User Interface)またはCLI(Command Line Interface)と呼ばれる、テキストベースのコマンドを入力して操作する形式のシェルです。バッチ処理や自動化には、CLIシェルのほうが適しています。
WindowsにはPowerShellが登場する以前からcmd.exeというCLIシェルがありましたが、機能が限定的で、スクリプト言語としても使いにくいという難点がありました。
1.2 PowerShellの特徴
PowerShellは、従来のシェルやスクリプト言語と比べて、いくつかの画期的な特徴を持っています。
- オブジェクト指向: これがPowerShellの最も革新的な特徴です。従来のシェルは、コマンド間で「テキスト」を受け渡ししていました。例えば、
cmd.exeでファイル一覧を表示して、それをフィルターにかける場合、ファイル名という「テキスト」の羅列を処理することになります。一方PowerShellは、コマンド間で「オブジェクト」を受け渡します。オブジェクトとは、データ(プロパティ)とそのデータを操作する機能(メソッド)をまとめたものです。ファイルであれば、「名前」「サイズ」「更新日時」といったプロパティや、「コピー」「削除」といったメソッドを持ったオブジェクトとして扱われます。これにより、より構造化されたデータを扱いやすくなり、複雑な処理も効率的に行えます。 - コマンドレット (Cmdlet): PowerShellで実行する基本的なコマンドは、「コマンドレット」と呼ばれます。コマンドレットは
.NET Framework上で動作し、PowerShellのオブジェクト指向の恩恵を最大限に活用できます。コマンドレットは、その名前が「動詞-名詞」の形式になっているという特徴があります(例:Get-Process,Set-Location,Restart-Computer)。これにより、コマンドの機能が分かりやすく、また体系的に学ぶことができます。 - パイプライン (
|): Unix/Linuxのシェルと同様に、PowerShellもパイプライン機能を持っています。これは、あるコマンドレットのオブジェクト出力を、別のコマンドレットのオブジェクト入力として渡す仕組みです。これにより、小さな機能を持つコマンドレットを複数組み合わせて、複雑な処理を簡単に実現できます。PowerShellのパイプラインはテキストではなくオブジェクトを渡すため、より強力で柔軟なデータ処理が可能です。 - スクリプト: 一連のコマンドレットをファイルに記述することで、PowerShellスクリプトを作成し、繰り返し実行することができます。これにより、定型業務の自動化を強力に推進できます。PowerShellスクリプトファイルは通常
.ps1という拡張子を持ちます。 - 統合された管理インターフェース: ファイルシステム、レジストリ、証明書ストアなど、Windowsの様々な管理対象が「PowerShellドライブ」として統一的に扱われます。これにより、異なるシステム要素に対しても同じようなコマンドレットを使って操作できます。
1.3 PowerShell 2.0の実行環境
PowerShell 2.0は、以下のOSで標準搭載またはオプション機能として利用可能でした。
- Windows 7 (標準搭載)
- Windows Server 2008 R2 (標準搭載)
- Windows XP Service Pack 3 (オプションインストール、.NET Framework 2.0 SP2 および 3.5 SP1 が必要)
- Windows Server 2003 Service Pack 2 (オプションインストール、.NET Framework 2.0 SP2 および 3.5 SP1 が必要)
- Windows Vista Service Pack 1 以降 (オプションインストール、.NET Framework 3.5 SP1 が必要)
- Windows Server 2008 Service Pack 2 以降 (オプションインストール、.NET Framework 3.5 SP1 が必要)
繰り返しになりますが、これらのOSの多くも既にサポートが終了しています。
2. PowerShell 2.0の起動と終了
PowerShell 2.0を使い始めるには、いくつかの方法があります。
2.1 PowerShellコンソールの起動
最も基本的な方法は、PowerShellコンソールを起動することです。
- Windows 7 / Server 2008 R2:
- スタートメニューを開き、「プログラム」→「アクセサリ」→「Windows PowerShell」から「Windows PowerShell」を選択します。
- ファイル名を指定して実行 (
Win + Rキー) またはスタートメニューの検索バーにpowershellと入力してEnterキーを押します。
- XP/2003/Vista/2008(インストール済みの場合):
- インストール方法によりますが、通常はスタートメニューの「プログラム」に「Windows PowerShell」というフォルダが作成されます。その中の「Windows PowerShell」を選択します。
- ファイル名を指定して実行 (
Win + Rキー) でpowershellと入力してEnterキーを押します。
PowerShellコンソールが起動すると、通常は以下のようなプロンプトが表示されます。
powershell
PS C:\Users\YourName>
PS はPowerShellであることを示し、その後ろに現在の作業ディレクトリが表示されます。
2.2 PowerShell ISE (Integrated Scripting Environment) の起動
PowerShell 2.0では、スクリプトの作成や編集、デバッグをGUIで行えるISE(Integrated Scripting Environment)が導入されました。これは、特に長いスクリプトを書く際に非常に便利です。
- Windows 7 / Server 2008 R2:
- スタートメニューを開き、「プログラム」→「アクセサリ」→「Windows PowerShell」から「Windows PowerShell ISE」を選択します。
- ファイル名を指定して実行 (
Win + Rキー) またはスタートメニューの検索バーにpowershell_iseと入力してEnterキーを押します。
- XP/2003/Vista/2008(インストール済みの場合):
- 通常はスタートメニューの「プログラム」の「Windows PowerShell」フォルダの中に「Windows PowerShell ISE」があります。
ISEが起動すると、通常はスクリプトペイン(上部)、コンソールペイン(下部)、コマンドアドオン(右側)の3つの領域が表示されます。
2.3 PowerShellの終了
PowerShellセッションを終了するには、以下のコマンドを使用します。
powershell
exit
または、コンソールウィンドウの右上にある閉じるボタンをクリックします。ISEの場合は、ウィンドウを閉じることで終了します。
3. コマンドレット (Cmdlet)
PowerShellの中心となるのがコマンドレットです。コマンドレットは、PowerShellのランタイムによって解釈・実行される小さなコマンドです。
3.1 コマンドレットの命名規則
コマンドレットは、常に「動詞-名詞」の形式で命名されます。
- 動詞: 実行したい操作を表します(例: Get, Set, New, Remove, Start, Stop, Restart, Write, Read, Out, Add, Clear, Move, Copy, Rename, Test, Invoke, etc.)。PowerShellには標準で承認された動詞のリストがあり、コマンドレット開発者はこれに従うことが推奨されています。
- 名詞: 操作の対象となるものを表します(例: Process, Service, Item, Content, Location, Command, Help, EventLog, Computer, etc.)。名詞は単数形が使われます。
この命名規則のおかげで、コマンドレット名を見ただけで、その機能が大まかに想像できます。例えば、Get-Processは「プロセスを取得する」、Stop-Serviceは「サービスを停止する」といった具合です。
3.2 コマンドレットの検索
PowerShellで利用できるコマンドレットを知りたい場合は、Get-Commandコマンドレットを使用します。
“`powershell
システム上の全てのコマンドレット、関数、エイリアスなどを表示
Get-Command
特定の動詞を持つコマンドレットを検索
Get-Command -Verb Get
特定の名詞を持つコマンドレットを検索
Get-Command -Noun Service
名前に特定の文字列を含むコマンドレットを検索
Get-Command -Name Item
“`
* はワイルドカードとして使用でき、任意の文字列を表します。
3.3 コマンドレットのヘルプ表示
コマンドレットの使い方が分からない場合は、Get-Helpコマンドレットを使用します。PowerShell 2.0のヘルプはオンラインで更新されない静的なものでしたが、詳細な情報を参照できました。
“`powershell
Get-Process コマンドレットの基本的なヘルプを表示
Get-Help Get-Process
Get-Process コマンドレットの詳細なヘルプを表示
Get-Help Get-Process -Detailed
Get-Process コマンドレットの全てのヘルプ情報を表示
Get-Help Get-Process -Full
Get-Process コマンドレットの使用例を表示
Get-Help Get-Process -Examples
Get-Process コマンドレットのパラメータ情報のみを表示
Get-Help Get-Process -Parameter *
“`
Get-HelpはPowerShellを学ぶ上で最も重要なコマンドレットの一つです。積極的に利用しましょう。
3.4 主要な基本コマンドレットと使用例
PowerShell 2.0で利用できる基本的なコマンドレットをいくつか紹介します。
-
ファイル/ディレクトリ操作
Get-Location/Set-Location/Push-Location/Pop-Location: 現在のディレクトリの表示、移動、スタックへのプッシュ/ポップ。
powershell
Get-Location
Set-Location C:\Windows
Get-Location
Push-Location D:\Temp
Get-Location
Pop-Location
Get-Location-
Get-ChildItem: ファイルやディレクトリの一覧を表示。(lsやdirというエイリアスも利用可能)
“`powershell
# 現在のディレクトリのファイル/ディレクトリ一覧
Get-ChildItem特定のディレクトリのファイル/ディレクトリ一覧
Get-ChildItem C:\Users
隠しファイルも含めて表示
Get-ChildItem -Force
特定の拡張子のファイルのみ表示
Get-ChildItem *.log
サブディレクトリも含めて再帰的に表示
Get-ChildItem -Recurse
* `New-Item`: ファイルやディレクトリを作成。powershellディレクトリを作成
New-Item -Path C:\Temp\MyNewFolder -ItemType Directory
ファイルを作成 (空ファイル)
New-Item -Path C:\Temp\MyNewFile.txt -ItemType File
* `Copy-Item` / `Move-Item` / `Remove-Item` / `Rename-Item`: ファイルやディレクトリのコピー、移動、削除、名前変更。powershellファイルをコピー
Copy-Item C:\Temp\MyNewFile.txt C:\Backup\MyNewFile.bak
ディレクトリをコピー (サブディレクトリ含む)
Copy-Item C:\Temp\MyNewFolder C:\Backup\MyFolderBackup -Recurse
ファイルを移動
Move-Item C:\Temp\MyNewFile.txt C:\Logs\MyNewFile.log
ファイルを削除 (確認なしで強制削除する場合は -Force)
Remove-Item C:\Temp\OldFile.txt
ディレクトリを削除 (空でない場合は -Recurse)
Remove-Item C:\Temp\OldFolder -Recurse
ファイルの名前を変更
Rename-Item C:\Temp\MyFile.txt NewFile.txt
* `Get-Content` / `Set-Content` / `Add-Content`: ファイルの内容の取得、設定(上書き)、追加。powershellファイルの内容を表示
Get-Content C:\Logs\MyNewFile.log
ファイルの内容を上書き
Set-Content C:\Temp\Test.txt “これは新しい内容です。”
ファイルに内容を追加
Add-Content C:\Temp\Test.txt “
nこれは追加された行です。" #nは改行
“`
-
プロセス管理
-
Get-Process: 実行中のプロセス情報を取得。
“`powershell
# 全てのプロセスを表示
Get-Process特定のプロセス名でフィルター
Get-Process notepad
Get-Process chrome # 名前にchromeを含むプロセス
* `Stop-Process` / `Start-Process`: プロセスの停止、開始。powershellプロセスIDを指定して停止
Stop-Process -Id 1234
プロセス名を指定して停止 (同じ名前のプロセスが複数ある場合は確認を求められる)
Stop-Process -Name notepad
新しいプロセスを開始
Start-Process notepad
Start-Process iexplore “http://www.bing.com” # 引数を渡す
“`
-
-
サービス管理
-
Get-Service: インストールされているサービス情報を取得。
“`powershell
# 全てのサービスを表示
Get-Service実行中のサービスのみ表示
Get-Service | Where-Object {$_.Status -eq ‘Running’}
特定のサービス名でフィルター
Get-Service BITS
Get-Service update
* `Stop-Service` / `Start-Service` / `Restart-Service`: サービスの停止、開始、再起動。powershellサービスを停止 (停止可能なサービスに限る)
Stop-Service -Name BITS
サービスを開始
Start-Service -Name BITS
サービスを再起動
Restart-Service -Name spooler
“`
-
-
その他の便利なコマンドレット
-
Get-EventLog: イベントログを取得。
“`powershell
# Applicationログの最新10件を取得
Get-EventLog -LogName Application -Newest 10Systemログからエラーイベントを取得
Get-EventLog -LogName System -EntryType Error
* `Get-History`: 実行したコマンドの履歴を表示。powershell
Get-History
* `Clear-Host`: コンソール画面をクリア。(`cls` というエイリアスも利用可能)powershell
Clear-Host
* `Write-Host`: 文字列をコンソールに表示。(デバッグやユーザーへのメッセージ表示に利用)powershell
Write-Host “Hello, PowerShell 2.0!”
Write-Host “現在のディレクトリは $(Get-Location) です。” # 変数やコマンドレットの実行結果を埋め込み
“`
-
3.5 コマンドレットのパラメータ
ほとんどのコマンドレットは、その動作を細かく制御するための「パラメータ」を持っています。パラメータは、コマンドレット名の後にハイフン (-) で始まり、パラメータ名とそれに続く引数(値)で指定します。
“`powershell
Get-ChildItem コマンドレットに Path パラメータと Filter パラメータを指定
Get-ChildItem -Path C:\Windows\System32 -Filter *.dll
“`
パラメータにはいくつかの種類があります。
- 必須パラメータ: コマンドレットを実行するために必ず指定する必要があるパラメータです。必須パラメータを指定し忘れると、PowerShellがエラーを表示したり、値を入力するように促したりします。
- オプションパラメータ: 指定しなくてもコマンドレットは実行できますが、指定することで特定の動作を有効にしたり、結果を絞り込んだりできます。
- 位置指定パラメータ: パラメータ名を省略して、引数の位置だけでパラメータを指定できるものです。例えば、
Set-Location C:\WindowsはSet-Location -Path C:\Windowsと同じ意味になります。位置指定できるかどうかは、コマンドレットの設計やGet-Helpのシンタックス情報で確認できます。 - 名前付きパラメータ: パラメータ名を明示的に指定する形式です。通常はこちらの形式を使う方が、スクリプトの可読性が高まります。
- スイッチパラメータ: 値を持たず、パラメータ名を指定するだけで機能のオン/オフを切り替えるものです。例えば、
Get-ChildItem -Recurseの-Recurseはスイッチパラメータで、これを指定すると再帰的な検索が有効になります。指定しない場合は無効です。
パラメータの使い方は、Get-Help コマンドレット名 -Full や -Parameter * で詳しく確認できます。
4. オブジェクト指向
PowerShellが従来のシェルと大きく異なる点の一つは、コマンドレットがテキストではなくオブジェクトを扱うことです。このオブジェクト指向のアプローチが、PowerShellの強力な機能を実現しています。
4.1 オブジェクトとは?
PowerShellにおけるオブジェクトは、現実世界の「物」や「概念」を抽象化したようなものです。例えば、プロセスは「Process」オブジェクト、ファイルは「FileInfo」オブジェクト、サービスは「ServiceController」オブジェクトとして扱われます。
それぞれのオブジェクトは、「プロパティ」と「メソッド」を持っています。
- プロパティ: オブジェクトの状態を表すデータです。例えば、Processオブジェクトは
Id(プロセスID)、Name(プロセス名)、CPU(CPU使用率)、Memory(メモリ使用量)といったプロパティを持っています。FileInfoオブジェクトはName、Length(ファイルサイズ)、LastWriteTime(最終更新日時)といったプロパティを持ちます。 - メソッド: オブジェクトに対して実行できる操作です。例えば、Processオブジェクトは
Kill()(プロセスを終了させる)、ServiceControllerオブジェクトはStart()、Stop()といったメソッドを持つことがあります。
4.2 オブジェクト構造の確認 (Get-Member)
特定のコマンドレットの出力がどのようなオブジェクトで、どのようなプロパティやメソッドを持っているかを知りたい場合は、Get-Memberコマンドレットを使用します。
Get-Memberは、パイプラインで渡されたオブジェクトの型情報とそのメンバー(プロパティ、メソッド、イベントなど)を表示します。
“`powershell
Get-Process コマンドレットが出力するオブジェクトの型とメンバーを表示
Get-Process | Get-Member
Get-ChildItem コマンドレットがファイルに対して出力するオブジェクトの型とメンバーを表示
Get-ChildItem C:\Windows\explorer.exe | Get-Member
Get-ChildItem コマンドレットがディレクトリに対して出力するオブジェクトの型とメンバーを表示
Get-ChildItem C:\Windows | Get-Member
“`
Get-Memberの出力を見ると、オブジェクトの種類(TypeName)や、利用可能なName(メンバー名)、MemberType(プロパティ、メソッドなど)が確認できます。この情報を見ながら、後述するWhere-ObjectやSelect-Objectを使ってオブジェクトを操作します。
4.3 オブジェクトのプロパティへのアクセス
オブジェクトのプロパティにアクセスするには、ドット (.) 演算子を使用します。
“`powershell
explorer.exe プロセスを取得し、そのオブジェクトを変数に格納
$explorer = Get-Process explorer
変数に格納されたオブジェクトのIdプロパティにアクセスして表示
$explorer.Id
Nameプロパティにアクセスして表示
$explorer.Name
Memoryプロパティにアクセスして表示
$explorer.Memory
“`
コマンドレットが複数のオブジェクトを出力する場合でも、パイプラインやForEachループを使うことで、それぞれのオブジェクトのプロパティにアクセスできます。
5. パイプライン (|)
PowerShellの真価を発揮するのがパイプラインです。パイプラインを使うことで、複数のコマンドレットを連結し、複雑な処理を簡単かつ効率的に記述できます。
5.1 パイプラインの仕組み
パイプライン演算子 (|) は、左側のコマンドレットの標準出力(通常はオブジェクト)を、右側のコマンドレットの標準入力として渡します。従来のシェルがテキストを行ごとに処理していたのに対し、PowerShellはオブジェクトごとに処理を渡します。
例えば、Get-Process | Stop-Process というコマンドを実行すると、Get-Process が出力した各プロセスオブジェクトが、パイプラインを通じて Stop-Process に渡され、Stop-Process は受け取ったオブジェクトに対応するプロセスを停止しようとします。
5.2 パイプラインを使ったデータ処理
パイプラインは、以下のようによく使われるコマンドレットと組み合わせて、データの絞り込み、整形、ソートなどを行います。
-
Where-Object: パイプラインから渡されたオブジェクトを指定した条件でフィルターします。PowerShell 2.0では、条件を指定するためにスクリプトブロック{ ... }を使用し、現在のオブジェクトは$_という特別な自動変数で参照します。
“`powershell
# 実行中のサービスの中から、Nameが “BITS” のサービスのみを取得
Get-Service | Where-Object {$_.Name -eq “BITS”}プロセスの中から、メモリ使用量が100MBより大きいものを取得 (Memory プロパティはバイト単位)
Get-Process | Where-Object {$_.Memory -gt 100 * 1024 * 1024} # 100MB = 100 * 1024 * 1024 Bytes
Get-ChildItemで取得したファイルの中から、サイズが1MBより大きいファイルのみ表示
Get-ChildItem C:\Temp | Where-Object {$.Length -gt 1MB} # PowerShell 2.0はMB, KBなどの単位をサポート
``Where-Objectで使える主な比較演算子($の後に使用):-eq
*: 等しい (Equals)-ne
*: 等しくない (Not Equals)-gt
*: より大きい (Greater Than)-lt
*: より小さい (Less Than)-ge
*: 以上 (Greater than or Equal to)-le
*: 以下 (Less than or Equal to)-like
*: ワイルドカード (*,?) を使ったパターンマッチング-match
*: 正規表現を使ったパターンマッチング-contains
*: 配列が特定の要素を含むか-notcontains
*: 配列が特定の要素を含まないか-in
*: 要素が配列に含まれるか-notin
*: 要素が配列に含まれないか-replace`: 正規表現でマッチした部分を置換
* -
Select-Object: パイプラインから渡されたオブジェクトから、特定のプロパティを選択したり、新しいプロパティを計算して追加したりします。
“`powershell
# Get-Process の結果から、NameとIdプロパティのみを選択して表示
Get-Process | Select-Object Name, IdGet-Process の結果から、最初の10件のみを選択
Get-Process | Select-Object -First 10
Get-Process の結果に、メモリ使用量をMB単位で表示する新しいプロパティを追加
Get-Process | Select-Object Name, Id, @{Name=’Memory(MB)’; Expression={$_.Memory / 1MB}} # Expressionにはスクリプトブロックを使用
“` -
Sort-Object: パイプラインから渡されたオブジェクトを指定したプロパティでソートします。
“`powershell
# Get-Process の結果を Name プロパティで昇順ソート
Get-Process | Sort-Object NameGet-Process の結果を Memory プロパティで降順ソート
Get-Process | Sort-Object Memory -Descending
“` -
Format-*コマンドレット: パイプラインから渡されたオブジェクトの表示形式を整形します。これらは表示のためだけであり、後続のコマンドレットにオブジェクトを渡すことはできません。通常、パイプラインの最後に置かれます。Format-Table: テーブル形式で表示。
powershell
Get-Process | Select-Object Name, Id, Memory | Format-Table
Get-Process | Select-Object Name, Id, Memory | Format-Table -AutoSize # 自動的にカラム幅を調整Format-List: リスト形式(プロパティ名と値が縦に並ぶ形式)で表示。
powershell
Get-Process | Select-Object Name, Id, Memory | Format-ListFormat-Wide: 1つのプロパティだけを複数列で表示。
powershell
Get-Process | Format-Wide Name
5.3 パイプラインの例
パイプラインを組み合わせることで、複雑な情報を簡単に取得できます。
“`powershell
例1: 実行中のサービスのうち、自動開始設定になっているものを取得し、名前と状態を一覧表示
Get-Service | Where-Object {$.Status -eq ‘Running’} | Where-Object {$.StartType -eq ‘Automatic’} | Format-Table Name, Status, StartType -AutoSize
例2: CPU使用率が高い順にプロセスの名前とCPU使用率をトップ10表示
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Name, CPU
例3: 特定のディレクトリ以下の全ての.logファイルを見つけ、サイズが大きい順に名前とサイズをリスト表示
Get-ChildItem C:\Logs -Recurse *.log | Sort-Object Length -Descending | Format-List Name, Length
“`
6. 変数とデータ型
PowerShellでは、スクリプト内でデータやオブジェクトを一時的に保存するために変数を使用します。
6.1 変数の宣言と代入
変数は、先頭にドル記号 ($) を付けて定義します。値を代入するには、イコール (=) 演算子を使用します。変数の型は、代入される値によって自動的に判断されます(動的型付け)。
“`powershell
文字列を変数に代入
$myName = “Alice”
数値を変数に代入
$myAge = 30
真偽値を変数に代入
$isTrue = $true # PowerShellでは $true または $false を使用
コマンドレットの実行結果を変数に代入 (オブジェクトが格納される)
$processes = Get-Process
変数の値を表示
Write-Host $myName
Write-Host $myAge
Write-Host $isTrue
$processes # オブジェクトの中身が表示される
“`
変数名はアルファベット、数字、アンダースコアなどが使えますが、先頭に数字は使えません。また、大文字・小文字は区別されません(ただし、変数名を一貫させるのが良い習慣です)。
6.2 データ型
PowerShellは様々なデータ型を扱えます。主なデータ型には以下のようなものがあります。
- System.String: 文字列 (
"..."または'...'で囲む) - System.Int32 / System.Int64: 整数
- System.Double: 浮動小数点数
- System.Boolean: 真偽値 (
$trueまたは$false) - System.DateTime: 日付と時刻
- System.Array: 複数の値を格納する配列 (
@(...)で作成) - System.Collections.Hashtable: キーと値のペアを格納するハッシュテーブル (
@{...}で作成) - カスタムオブジェクト: コマンドレットの出力などは特定のカスタムオブジェクト型になります(例: System.Diagnostics.Process, System.IO.FileInfo)
変数のデータ型を確認するには、.GetType() メソッドを使用します。
powershell
$myName.GetType()
$myAge.GetType()
$processes.GetType() # オブジェクトの配列型になることが多い
6.3 配列
複数の要素をまとめて扱うには配列が便利です。配列は @() で作成したり、複数の値をカンマ区切りで変数に代入したりすることで作成できます。
“`powershell
配列を作成
$fruits = @(“Apple”, “Banana”, “Cherry”)
配列の要素を表示
$fruits
配列の特定の要素にアクセス (インデックスは0から始まる)
$fruits[0] # “Apple”
$fruits[1] # “Banana”
配列の要素数を取得
$fruits.Count
“`
6.4 ハッシュテーブル
キーと値のペアを関連付けてデータを格納するにはハッシュテーブル(またはディクショナリ)を使用します。ハッシュテーブルは @{}で作成します。
“`powershell
ハッシュテーブルを作成
$person = @{
Name = “Alice”
Age = 30
City = “Tokyo”
}
ハッシュテーブルの値をキーを指定して取得
$person[“Name”] # “Alice”
$person.Age # ドット記法でもアクセス可能
新しいキーと値を追加
$person[“Job”] = “Engineer”
全てのキーを表示
$person.Keys
全ての値を表示
$person.Values
“`
7. 制御構造
PowerShellスクリプトでは、プログラムの実行フローを制御するために、条件分岐やループ構造を使用します。
7.1 条件分岐 (If, Else, ElseIf)
特定の条件が満たされた場合に、指定した処理を実行します。
“`powershell
$number = 15
if ($number -gt 10) {
Write-Host “Number is greater than 10.”
} elseif ($number -eq 10) {
Write-Host “Number is exactly 10.”
} else {
Write-Host “Number is less than 10.”
}
“`
条件式には、前述のWhere-Objectで使われる比較演算子(-eq, -ne, -gt, -lt など)を使用します。複数の条件を組み合わせるには、論理演算子である -and (かつ) や -or (または) を使用します。
“`powershell
$age = 25
$city = “Osaka”
if (($age -gt 20 -and $age -lt 30) -or ($city -eq “Tokyo”)) {
Write-Host “Condition met.”
}
“`
7.2 ループ (For, ForEach, While, Do/While)
同じ処理を繰り返して実行します。
-
Forループ: カウンターを使った繰り返し。
powershell
# 0から4まで繰り返す
for ($i = 0; $i -lt 5; $i++) {
Write-Host "Loop iteration: $i"
} -
ForEachループ: コレクション(配列やコマンドレットの出力など)の各要素に対して処理を実行。
“`powershell
$fruits = @(“Apple”, “Banana”, “Cherry”)配列の各要素を順番に処理
foreach ($fruit in $fruits) {
Write-Host “I like $fruit.”
}Get-Serviceの出力オブジェクトを順番に処理
foreach ($service in (Get-Service)) {
Write-Host “Service $($service.Name) Status: $($service.Status)”
}
``ForEach-Object
**注:** パイプラインのコマンドレット(エイリアスはforeachや%)も似たような機能ですが、パイプラインでオブジェクトを受け取るという点で異なります。PowerShell 2.0では、このForEach文とForEach-Object`コマンドレットの使い分けが重要です。 -
Whileループ: 指定した条件が真である間、処理を繰り返す。ループに入る前に条件を評価します。
powershell
$count = 0
while ($count -lt 3) {
Write-Host "Count: $count"
$count++
} -
Do/Whileループ: 少なくとも1回は処理を実行し、その後で条件を評価して繰り返すかを決定します。
powershell
$i = 0
do {
Write-Host "Value of i: $i"
$i++
} while ($i -lt 3)
8. スクリプト
一連のPowerShellコマンドレットをファイルに記述することで、PowerShellスクリプトを作成し、自動化や繰り返し可能なタスクとして実行できます。
8.1 スクリプトファイルの作成
PowerShellスクリプトファイルは、通常 .ps1 という拡張子を持ちます。テキストエディタ(メモ帳など)や、PowerShell ISEを使って作成できます。
例えば、以下のような内容を記述して GetSystemInfo.ps1 という名前で保存します。
“`powershell
スクリプトの例:基本的なシステム情報を取得して表示
Write-Host “— システム情報 —“
コンピュータ名を取得して表示
$computerName = Get-ComputerInfo | Select-Object -ExpandProperty CsName # Get-ComputerInfo は新しいバージョンだが、例として使用。v2にはGet-ComputerInfoは無いので、他の方法(例: $env:COMPUTERNAME)を使用する
v2互換の例:
$computerName = $env:COMPUTERNAME
Write-Host “コンピュータ名: $computerName”
現在の日時を表示
$currentDate = Get-Date
Write-Host “現在の日時: $currentDate”
実行中のプロセス数を表示
$processCount = (Get-Process).Count
Write-Host “実行中のプロセス数: $processCount”
空きメモリ容量を表示
$freeMemory = (Get-CimInstance -ClassName Win32_OperatingSystem).FreePhysicalMemory # WMI/CIMオブジェクトはv2でもアクセス可能
v2互換のWMIアクセス例 (Get-WmiObjectを使用):
$os = Get-WmiObject Win32_OperatingSystem
$freeMemory = $os.FreePhysicalMemory / 1MB # KB -> MBに変換
Write-Host “空き物理メモリ: $($freeMemory) MB”
Write-Host “——————”
``Get-ComputerInfo
*(注: 上記の例ではPowerShell 5.1以降のコマンドレットです。PowerShell 2.0で同等の情報を得るには、環境変数やWMI(Get-WmiObject`)など、別の方法を使う必要があります。記事執筆にあたり、PowerShell 2.0互換のWMIアクセス例を追加しました。)*
8.2 スクリプトの実行
PowerShellコンソールからスクリプトを実行するには、スクリプトファイルへのパスを指定します。現在のディレクトリにあるスクリプトを実行する場合は、パスの先頭に .\ を付けます。
“`powershell
現在のディレクトリにあるスクリプトを実行
.\GetSystemInfo.ps1
フルパスを指定してスクリプトを実行
C:\Scripts\GetSystemInfo.ps1
“`
8.3 実行ポリシー (Execution Policy)
PowerShellには、悪意のあるスクリプトの実行を防ぐための「実行ポリシー」というセキュリティ機能があります。PowerShell 2.0のデフォルトの実行ポリシーは、通常 Restricted であり、この状態ではスクリプトを実行できません。スクリプトを実行するには、実行ポリシーを変更する必要があります。
-
実行ポリシーの確認:
Get-ExecutionPolicy
powershell
Get-ExecutionPolicy
主なポリシー:Restricted: スクリプトの実行を許可しない。(デフォルト)AllSigned: 信頼された発行元によって署名されたスクリプトのみ実行を許可。RemoteSigned: ローカルで作成されたスクリプトは署名なしで実行可能。インターネットからダウンロードしたスクリプトは信頼された発行元による署名が必要。Unrestricted: 全てのスクリプト実行を許可。(最も危険)Bypass: ポリシーを完全に無視する。(さらに危険、特定の状況でのみ使用)
-
実行ポリシーの変更:
Set-ExecutionPolicy
“`powershell
# リモートから取得したスクリプトに署名が必要だが、ローカルのスクリプトは実行可能にする (最も一般的に使われるポリシー)
Set-ExecutionPolicy RemoteSigned全てのスクリプト実行を許可 (非推奨)
Set-ExecutionPolicy Unrestricted
``Unrestricted
実行ポリシーの変更は、管理者権限が必要な場合があります。また、セキュリティに関わる設定ですので、理解した上で慎重に行ってください。**特に、はセキュリティリスクが非常に高いため避けるべきです。** スクリプト開発やテストのために一時的にポリシーを変更した場合でも、完了後は元のポリシーに戻すことを推奨します。多くの場合はRemoteSigned`で十分です。
8.4 コメント
スクリプトの中にコメントを記述すると、コードの説明や一時的な無効化に役立ち、スクリプトの可読性が向上します。
-
1行コメント: 行の先頭または途中に
#を置くと、そこから行末までがコメントになります。
powershell
# これはコメントです
Get-Process # プロセスを取得 -
複数行コメント:
<#と#>で囲まれた範囲がコメントになります。
powershell
<#
これは複数行のコメントです。
スクリプトの目的や使い方などを記述するのに便利です。
#>
Write-Host "スクリプト実行中"
9. PowerShell ISE (Integrated Scripting Environment)
PowerShell 2.0で導入されたISEは、スクリプト開発を効率化するためのGUI環境です。
9.1 ISEの機能
- スクリプトペイン: スクリプトを作成、編集する領域です。シンタックスハイライトやコード補完機能があります。
- コンソールペイン: 作成したスクリプトや入力したコマンドレットの実行結果が表示される領域です。通常のPowerShellコンソールと同様にコマンドを直接入力して実行することもできます。
- コマンドアドオン: 利用可能なコマンドレットを検索し、そのパラメータをGUIで入力してコマンドレットを生成できます。初心者には特に役立ちます。
- デバッグ機能: スクリプトの途中にブレークポイントを設定し、ステップ実行したり、変数の値を確認したりすることができます。
9.2 ISEの使い方
- スクリプトペインにコードを記述します。
- スクリプトを実行するには、ツールバーの「実行」ボタン(緑色の三角形)をクリックするか、F5キーを押します。
- 選択した行だけを実行するには、行を選択してF8キーを押します。
- デバッグを開始するには、スクリプトペインの左端をクリックしてブレークポイント(赤い丸)を設定し、F5キーで実行します。ブレークポイントで実行が一時停止し、F10(ステップオーバー)、F11(ステップイン)、Shift+F11(ステップアウト)などのキーでデバッグを実行できます。
ISEは、複雑なスクリプトを書く際に非常に便利なツールです。PowerShell 2.0を使う場合は、コンソールだけでなくISEも積極的に活用することをお勧めします。
10. PowerShell 2.0の注意点と制限
前述の通り、PowerShell 2.0は古いバージョンであり、現代のPowerShell(Windows PowerShell 5.1やPowerShell 7+)と比較すると、多くの点で制限があります。
- 機能の制限: PowerShell 2.0以降で導入された多くの便利なコマンドレットや機能が利用できません。例えば、JSONの解析(
ConvertFrom-Json)、REST APIの呼び出し(Invoke-RestMethod,Invoke-WebRequest)、Desired State Configuration (DSC)、PowerShell Classes、PowerShellGet(モジュール管理)などはPowerShell 3.0以降の機能です。PowerShell 2.0環境では、これらの機能を使う代替手段(例: .NET Frameworkのクラスを直接呼び出す、外部ツールを使うなど)を探す必要があります。 - パフォーマンス: 一般的に、新しいバージョンほどパフォーマンスが改善されています。
- セキュリティリスク: これが最も重要な点です。PowerShell 2.0には既知のセキュリティ脆弱性が存在し、サポートも終了しています。特にリモート機能を利用する場合、攻撃のリスクが高まります。
- 互換性の問題: 新しいバージョンのPowerShell向けに書かれたスクリプトは、PowerShell 2.0では動作しない可能性が高いです。
- ヘルプシステムの陳腐化: PowerShell 3.0以降では、
Update-Helpコマンドレットでヘルプファイルをオンラインから最新の状態に更新できますが、PowerShell 2.0ではこの機能がありません。ヘルプはインストール時の静的なものです。
これらの制限から、特別な理由がない限り、PowerShell 2.0を新規に学ぶことや、現行システムで利用し続けることは推奨されません。
11. PowerShell 2.0から新しいバージョンへの移行
もし現在PowerShell 2.0が稼働している環境があり、PowerShellを活用していきたいと考えているのであれば、新しいバージョンへの移行を強く検討すべきです。
11.1 なぜ移行すべきか
- セキュリティ: 最新のバージョンはセキュリティ上の脆弱性が修正されており、安全性が高いです。
- 新機能: 前述の通り、新しいバージョンには管理作業を効率化するための多くの強力な機能が追加されています。
- パフォーマンス: より高速に動作することが期待できます。
- サポート: Microsoftのサポートが継続されており、問題が発生した場合の解決策が見つかりやすいです。
- コミュニティ: 最新バージョンの情報やコミュニティによるサポートが活発です。
11.2 移行のメリット
- クラウドサービスの管理(Azure/AWSなど)のためのコマンドレット(モジュール)は、基本的に最新バージョンのPowerShellで提供されます。
- よりモダンで効率的なスクリプトを書くことができます。
- クロスプラットフォームなPowerShell (PowerShell 7+) に移行すれば、WindowsだけでなくLinuxやmacOS上でもPowerShellスクリプトを実行できます。
11.3 移行の手順
PowerShellの新しいバージョンは、Windows OSの新しいバージョンに標準搭載されています。
- Windows PowerShell 5.1への移行:
- Windows 10、Windows Server 2016、Windows Server 2019、Windows Server 2022には、PowerShell 5.1が標準搭載されています。OS自体をこれらのバージョンにアップグレードすることで、PowerShell 5.1が利用可能になります。
- Windows 7/8/8.1やWindows Server 2008 R2/2012/2012 R2には、Windows Management Framework (WMF) 5.1をインストールすることでPowerShell 5.1にアップグレードできます。ただし、WMF 5.1のサポートも終了しています。
- PowerShell 7+ への移行:
- PowerShell 7+ は、Windows PowerShellとは別にインストールされるクロスプラットフォームなPowerShellです。Windows 7 SP1以降、Windows Server 2008 R2 SP1以降など、比較的古いOSにもインストール可能ですが、そのOS自体がサポートされているか確認が必要です。PowerShell 7+は公式Webサイトからダウンロードしてインストールします。
移行の際は、既存のPowerShell 2.0スクリプトが新しいバージョンで問題なく動作するか互換性のテストを行うことが重要です。基本的には上位互換性が保たれていますが、まれにコマンドレットのパラメータや動作が変わっている場合があります。
まとめ:PowerShellの礎を築いた2.0、そして未来へ
本記事では、PowerShellの歴史において重要な役割を果たしたバージョンであるPowerShell 2.0について、その基本的な概念からコマンドレット、パイプライン、スクリプトといった入門レベルの内容を詳しく解説しました。
PowerShell 2.0は、Windows管理におけるオブジェクト指向やパイプラインの強力さを多くのシステム管理者に示し、その後のPowerShellの発展の基礎を築きました。特にISEの導入は、スクリプト開発の敷居を下げる上で大きな貢献がありました。
しかし、繰り返しの警告となりますが、PowerShell 2.0はサポートが終了しており、セキュリティ上のリスクを抱えています。 現代のシステムで積極的に利用することは推奨されません。本記事で解説した内容は、あくまでPowerShellの基本的な考え方や、古い環境を理解するための学習リソースとして捉えてください。
もしPowerShellをこれから学ぶ、あるいはさらに深く活用したいと考えているのであれば、迷わずWindows PowerShell 5.1またはPowerShell 7+といった最新のバージョンを学ぶことを強くお勧めします。最新バージョンは、より多くの機能、高いパフォーマンス、そして最も重要な「セキュリティ」を提供します。
PowerShellの基本的な概念(コマンドレット、パイプライン、オブジェクト)は、バージョンが変わっても共通しています。本記事で得たPowerShell 2.0の基礎知識は、最新バージョンを学ぶ上でも必ず役に立つはずです。
PowerShellは、Windowsシステムの管理・自動化において非常に強力なツールです。ぜひ最新バージョンで、その可能性を追求してみてください。