はい、承知いたしました。PowerShellコマンド入門について、基本から初心者向けまで詳細に解説した約5000語の記事を作成します。
PowerShellコマンド入門:基本から初心者向けまで
はじめに:PowerShellの世界へようこそ
現代のIT環境において、システム管理や定型作業の自動化は避けて通れない課題です。Windows環境では、長らくコマンドプロンプト(cmd.exe)が利用されてきましたが、より強力で柔軟なツールとしてPowerShellが登場しました。PowerShellは、単なるコマンドラインインターフェース(CLI)ではなく、高度なスクリプト言語と自動化プラットフォームとしての側面も持っています。
この記事では、「PowerShellをこれから始めたい」「コマンド操作に苦手意識があるけど克服したい」「Windowsの管理作業を効率化したい」と考えている初心者の方々を対象に、PowerShellの基本的な概念から、日常的なタスクに役立つコマンドレットの使い方、そして簡単なスクリプト作成の入り口までを、体系的かつ詳細に解説します。約5000語をかけて、PowerShellの魅力を余すところなくお伝えしますので、ぜひ最後までお付き合いください。
PowerShellとは何か?
PowerShellは、Microsoftが開発したタスク自動化および構成管理フレームワークです。コマンドラインシェル、スクリプト言語、そして構造化されたAPI呼び出しを組み合わせたもので、特にWindows環境でのシステム管理に威力を発揮します。
従来のコマンドプロンプトやUNIX/Linuxシェルとの最大の違いは、PowerShellが「オブジェクト指向」であるという点です。多くのシェルはテキストを処理しますが、PowerShellはコマンドの出力や入力に「オブジェクト」を使用します。このオブジェクト指向が、PowerShellの強力なパイプライン機能や、複雑なデータを扱いやすい大きな理由となっています。
なぜPowerShellを学ぶのか?
- Windows管理の標準: Windows Server、Azure、Microsoft 365などのMicrosoft製品は、PowerShellによる管理を強く推奨または必須としています。これらの環境を扱うにはPowerShellの知識が不可欠です。
- 作業の効率化・自動化: 手作業で時間がかかる定型作業(ユーザーアカウントの一括作成、ログの分析、設定変更など)をスクリプト化して自動化できます。
- 強力な機能: オブジェクト指向のパイプライン、豊富なシステム情報へのアクセス(レジストリ、WMI、COMなど)、リモート管理機能など、従来のシェルにはない高度な機能を備えています。
- クロスプラットフォーム対応: PowerShell Core(PowerShell 6以降)は、WindowsだけでなくLinuxやmacOSでも動作します。
- 学習リソースの豊富さ: Microsoft公式ドキュメントやコミュニティによる情報が豊富に存在します。
これらの理由から、PowerShellは現代のITプロフェッショナルや、より効率的にPCを操作したい一般ユーザーにとっても、習得する価値の高いスキルと言えます。
この記事の対象者と目的
この記事は、以下のような方を対象としています。
- PowerShellを使ったことがない、あるいはほとんど経験がない
- コマンドライン操作に慣れていない
- Windowsでの作業を効率化したいと考えている
- PowerShellの基本概念と基本的なコマンドの使い方を知りたい
この記事の目的は、PowerShellの基本的な概念、基本的なコマンドレットの使い方、そして簡単なスクリプトの作成方法を理解し、自分で調べながらより高度なタスクに挑戦できるようになるための土台を築くことです。
さあ、PowerShellの学習を始めましょう!
PowerShellのインストールと起動
Windows 10以降の多くのバージョンには、PowerShellが標準で搭載されています。まずは、自分のPCにどのバージョンのPowerShellがインストールされているか確認し、必要に応じて新しいバージョンや開発環境を準備しましょう。
Windows標準搭載のPowerShell
Windows 7以降、PowerShellは標準機能として提供されています。バージョンはWindowsのバージョンによって異なります。
- Windows 7/Server 2008 R2: PowerShell 2.0
- Windows 8/Server 2012: PowerShell 3.0
- Windows 8.1/Server 2012 R2: PowerShell 4.0
- Windows 10/Server 2016: PowerShell 5.0/5.1
- Windows 10/Server 2019以降: PowerShell 5.1が標準。PowerShell Core (PowerShell 6+) は別途インストールが必要。
現在、PowerShellの最新バージョンはPowerShell 7.x系列です(これは旧PowerShell Coreの後継です)。Windowsに標準搭載されているPowerShell 5.1 (Windows PowerShell) とは別に、より新しいPowerShell 7.x をインストールして共存させることができます。
PowerShell 5.1 (Windows PowerShell) の起動方法
最も簡単な方法は、Windowsの検索バーに「PowerShell」と入力することです。「Windows PowerShell」または「PowerShell」という名前のアプリが表示されるので、クリックして起動します。
- 通常の起動: 一般的なユーザー権限で起動します。
- 管理者として実行: システム全体の変更を行う場合など、管理者権限が必要なコマンドを実行する際に使用します。右クリックして「管理者として実行」を選択します。
コマンドプロンプトや「ファイル名を指定して実行」(Win + R
)から起動する場合は、powershell
と入力してEnterキーを押します。
PowerShell 7.x のインストールと起動
PowerShell 7.x は、GitHubのリリースページやMicrosoft Storeからダウンロードしてインストールできます。インストールすると、Windows PowerShellとは別のアプリケーションとして利用できます。
- ダウンロードページ: https://github.com/PowerShell/PowerShell/releases
- Microsoft Store: ストアで「PowerShell 7」などで検索
インストール後、Windowsの検索バーに「PowerShell 7」と入力して起動します。コマンドプロンプトや「ファイル名を指定して実行」からは、インストールパス(通常はC:\Program Files\PowerShell\7
配下)にあるpwsh.exe
を実行します。Windows Terminalなどを使用している場合は、プロファイルに追加すると便利です。
この記事では、Windows PowerShell (5.1) と PowerShell 7.x の両方で動作する基本的なコマンドを中心に解説しますが、特に断りがない限りPowerShell 7.xを前提とした画面や出力例を使用することがあります。基本的なコマンドの挙動は大きく変わりません。
バージョンの確認
起動したPowerShellのウィンドウで、以下のコマンドを入力してEnterキーを押すと、バージョン情報を含む自動変数 $PSVersionTable
の内容が表示されます。
powershell
$PSVersionTable
出力例(PowerShell 7.4.1の場合):
Name Value
---- -----
PSVersion 7.4.1
PSEdition Core
GitCommitId 7.4.1
OS Microsoft Windows 10.0.22631
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
PSVersion
の値でバージョンを確認できます。PSEdition
が Core
ならPowerShell 6以降、Desktop
ならWindows PowerShell (5.1以前) です。
他のOSでのインストール方法
PowerShell Core (PowerShell 6以降) は、LinuxやmacOSでも動作します。各OS向けのパッケージ管理システム(apt, yum, brewなど)を使用してインストールできます。
- Linux: Microsoftの公式ドキュメントにディストリビューションごとのインストール方法が記載されています。
- macOS: Homebrewを使用してインストールできます (
brew install powershell
)。
開発環境 (IDE)
PowerShellスクリプトを書く際には、専用の統合スクリプト環境(ISE)や多機能なエディタを利用すると便利です。
- PowerShell ISE (Integrated Scripting Environment): Windows PowerShellに標準搭載されているGUI環境です。コード補完、デバッグ、複数のコマンド実行、スクリプトペインとコンソールペインの分割表示などが可能です。簡単なスクリプト作成には十分な機能を持っています。検索バーに「PowerShell ISE」と入力して起動できます。PowerShell 7.x には標準搭載されていませんが、互換性モジュールをインストールすることで利用可能です。
- Visual Studio Code (VS Code): Microsoftが提供する無料の高機能コードエディタです。PowerShell拡張機能をインストールすることで、強力なコード補完(IntelliSense)、シンタックスハイライト、デバッグ機能、統合ターミナルなど、ISEを凌駕する開発体験が得られます。PowerShell 7.x を使用する場合は、VS Code + PowerShell拡張機能が最も推奨される環境です。
この記事では、コマンドの実行はPowerShellコンソールまたはVS Codeの統合ターミナルで行うことを想定しています。スクリプト作成の章では、VS Codeの利用も視野に入れます。
これで、PowerShellを実行する準備が整いました。次章から、PowerShellの基本概念と最初のコマンドレットについて学んでいきましょう。
PowerShellの基本概念
PowerShellのコマンドを効果的に使うためには、いくつかの重要な基本概念を理解しておく必要があります。
コマンドレット (Cmdlet) とは?
PowerShellの基本的なコマンド単位を「コマンドレット(Cmdlet)」と呼びます。コマンドレットは、PowerShellランタイム上で動作する軽量なコマンドです。
特徴として、以下の点が挙げられます。
- 「動詞-名詞」の命名規則: ほとんどのコマンドレットは、「動詞-名詞」(
Verb-Noun
)の形式で命名されています。例えば、ファイルを取得するコマンドはGet-Item
、サービスを開始するコマンドはStart-Service
のようになります。これにより、コマンドレットの機能が推測しやすくなっています。- よく使われる動詞の例:
Get
(取得),Set
(設定),New
(作成),Add
(追加),Remove
(削除),Move
(移動),Copy
(コピー),Start
(開始),Stop
(停止),Restart
(再起動),Write
(書き込み),Read
(読み込み),Invoke
(実行) など。
- よく使われる動詞の例:
- パラメータ: コマンドレットには、その挙動を細かく制御するための「パラメータ」を指定できます。パラメータはハイフン (
-
) で始まり、その後にパラメータ名、そして多くの場合パラメータの値を指定します(例:Get-ChildItem -Path C:\Windows
). - オブジェクトの入出力: コマンドレットは、多くの場合、テキストではなく「オブジェクト」を出力します。これはPowerShellの最も重要な特徴の一つです。
オブジェクト指向シェル
前述の通り、PowerShellはオブジェクト指向のシェルです。これは、従来のシェルがコマンド間でテキストをパイプで渡していたのに対し、PowerShellは構造化されたデータである「オブジェクト」を渡すということを意味します。
例: ファイル情報
- 従来のシェル (コマンドプロンプト):
dir
コマンドはファイル情報を整形されたテキストとして出力します。このテキストから特定の情報を抽出するには、文字列処理(例:findstr
)が必要になります。 - PowerShell:
Get-ChildItem
コマンドは、各ファイルやフォルダを表現する「FileSystemInfo」という種類のオブジェクトを出力します。このオブジェクトは、ファイル名、サイズ、更新日時、属性などのプロパティ(属性情報)や、操作を行うためのメソッド(関数)を持っています。
オブジェクトを扱うことの利点:
- データへの容易なアクセス: オブジェクトのプロパティに直接アクセスして、必要な情報を簡単に抽出したり、フィルタリングしたりできます。
- 強力なパイプライン: オブジェクトは構造化されているため、後続のコマンドレットがその構造を理解し、適切に処理できます。
- 一貫性: 異なるコマンドレットでも、同じ種類のオブジェクトを扱っていれば、同じ方法で操作できます。
このオブジェクト指向とパイプラインについては、後ほど詳しく解説します。
変数 ($記号)
PowerShellでは、情報を一時的に保存するために変数を使用します。変数は $
記号で始まります。
“`powershell
変数 $myVariable に文字列を代入
$myVariable = “Hello, PowerShell!”
変数の内容を表示
Write-Host $myVariable
数値を代入
$number = 123
コマンドの出力結果を変数に代入
$processList = Get-Process
変数の内容を表示
Write-Host $processList
“`
変数は特定のデータ型(文字列、整数、配列、ハッシュテーブルなど)を持ちますが、明示的に指定しなくてもPowerShellが自動的に推論してくれます。必要に応じて型を指定することも可能です。
エイリアス (Alias)
PowerShellには、よく使うコマンドレットに短い別名(エイリアス)が事前に定義されています。これにより、入力の手間を省くことができます。例えば:
ls
,dir
,gci
はすべてGet-ChildItem
のエイリアスです。(UNIX/Linuxのls
やコマンドプロンプトのdir
に慣れている人向け)cd
,chdir
はSet-Location
のエイリアスです。cat
,type
はGet-Content
のエイリアスです。man
はGet-Help
のエイリアスです。
エイリアスは便利ですが、スクリプトを書く場合は、エイリアスではなく正式なコマンドレット名を使うのが推奨されます。これにより、スクリプトの可読性が向上し、エイリアスを知らない人でも理解しやすくなります。
現在定義されているエイリアスの一覧を見るには、Get-Alias
コマンドレットを使用します。特定のコマンドレットのエイリアスを知りたい場合は、Get-Alias -Definition <コマンドレット名>
とします。
“`powershell
Get-ChildItem のエイリアスを表示
Get-Alias -Definition Get-ChildItem
エイリアス ls が何のコマンドレットに対応しているかを表示
Get-Alias ls
“`
プロバイダー (Provider)
PowerShellプロバイダーは、レジストリ、ファイルシステム、証明書ストアなどの様々なデータストアに、ファイルシステムのパスのような方法でアクセスできるようにするものです。これにより、異なる種類のデータソースを統一的なコマンドレット(Get-ChildItem
, Set-Location
, Get-Item
, Remove-Item
など)で操作できます。
例えば:
FileSystem
プロバイダー: 通常のファイルシステム (C:\
,D:\
など)Registry
プロバイダー: Windowsレジストリ (HKLM:\
,HKCU:\
など)Certificate
プロバイダー: 証明書ストア (Cert:\CurrentUser\My
など)Variable
プロバイダー: 現在のセッションで定義されている変数 (Variable:\
など)Alias
プロバイダー: 現在のセッションで定義されているエイリアス (Alias:\
など)Environment
プロバイダー: 環境変数 (Env:\
など)
利用可能なプロバイダーの一覧は、Get-PSProvider
コマンドレットで確認できます。
powershell
Get-PSProvider
これにより、例えばレジストリの値を確認するのに、ファイルシステムを扱うのと同じ Get-ChildItem
や Get-ItemProperty
といったコマンドレットを使用できるのです。
“`powershell
レジストリパスに移動
Set-Location HKCU:\Software\Microsoft\Windows\CurrentVersion\Run
そのパスにあるレジストリキーと値を確認
Get-ChildItem
特定の値を取得 (Get-ItemProperty を使うことが多い)
Get-ItemProperty . -Name OneDrive
“`
このプロバイダーの概念は、PowerShellが様々なシステムリソースを統一的に扱えるようにする上で非常に重要です。
最初のコマンドレット
PowerShellの基本概念を理解したところで、実際にコマンドレットを実行してみましょう。まずは、PowerShell自体を探索するためのコマンドレットから始めます。
Get-Command
:コマンドレットの検索
PowerShellには数千ものコマンドレットが存在します。特定の作業を行いたいときに、どのようなコマンドレットがあるかを知るには、Get-Command
コマンドレットが役立ちます。
“`powershell
利用可能なすべてのコマンドレット、関数などを表示 (非常に多いので注意)
Get-Command
“Service” という名詞を含むコマンドレットを検索
Get-Command -Noun Service
“Get” という動詞を含むコマンドレットを検索
Get-Command -Verb Get
“Get” という動詞で “Process” または “Service” という名詞を含むコマンドレットを検索
Get-Command -Verb Get -Noun Process, Service
名前に “Item” を含むすべての種類のコマンドを検索 (ワイルドカード *)
Get-Command Item
Get-Command の結果はオブジェクトなので、パイプラインで絞り込みも可能
Microsoft.PowerShell.Management モジュールに含まれるコマンドレットを検索
Get-Command | Where-Object { $_.ModuleName -eq “Microsoft.PowerShell.Management” }
“`
Get-Command
は、コマンドレットだけでなく、関数、エイリアス、スクリプト、実行可能ファイルなども検索できます。-CommandType
パラメータで検索対象を絞ることも可能です(例: -CommandType Cmdlet
, -CommandType Function
)。
Get-Help
:ヘルプの参照
コマンドレットの使い方を知る最も重要な方法は、公式のヘルプを参照することです。Get-Help
コマンドレットは、そのための入り口です。
“`powershell
Get-ChildItem コマンドレットの基本的なヘルプを表示
Get-Help Get-ChildItem
Get-ChildItem コマンドレットの全ての情報を表示
Get-Help Get-ChildItem -Full
Get-ChildItem コマンドレットの使用例を表示
Get-Help Get-ChildItem -Examples
Get-ChildItem コマンドレットのオンラインヘルプをブラウザで開く
Get-Help Get-ChildItem -Online
“`
-Full
オプションは、パラメータの詳細、入力と出力の型、関連コマンドレットなど、全ての情報を表示します。-Examples
オプションは、実際の使用例をいくつか示してくれるため、非常に参考になります。インターネットに接続されている場合は、-Online
オプションが最も最新の詳細情報を提供してくれます。
初めて使うコマンドレットに出会ったら、まずは Get-Help <コマンドレット名> -Examples
か -Online
を試すのが良いでしょう。
ヘルプシステムを初めて使う場合や古いバージョンのPowerShellでは、ヘルプデータがローカルにインストールされていない場合があります。その場合は、以下のコマンドでヘルプデータをダウンロード・更新できます(インターネット接続と管理者権限が必要な場合があります)。
powershell
Update-Help
Get-Location
/ Set-Location
:現在の場所の確認と移動
ファイルシステム上のディレクトリ移動のように、PowerShellセッションにおける現在の「場所」を確認したり移動したりできます。これは、ファイルシステムプロバイダーだけでなく、レジストリなどの他のプロバイダーでも有効です。
“`powershell
現在の場所(カレントディレクトリなど)を表示
Get-Location
C:\Windows ディレクトリに移動
Set-Location C:\Windows
再度現在の場所を確認
Get-Location
親ディレクトリに移動 (エイリアス: cd ..)
Set-Location ..
ホームディレクトリに移動 (エイリアス: cd ~)
Set-Location ~
移動前の場所に戻る (スタック機能)
Push-Location C:\Temp
ここで C:\Temp にいる
Set-Location C:\Users
ここで C:\Users にいる
Pop-Location
ここで C:\Temp に戻る
スタックされた場所を確認
Get-Location -Stack
“`
Set-Location
には cd
や chdir
というエイリアスがあります。通常、これらのエイリアスで十分ですが、PowerShellスクリプトでは Set-Location
を使うのが慣例です。
Get-ChildItem
:ファイルとフォルダの一覧表示
ファイルシステム上のディレクトリの内容(ファイルやサブディレクトリ)を表示するコマンドレットです。コマンドプロンプトの dir
や UNIX/Linux の ls
に相当します。
“`powershell
現在のディレクトリのファイルとフォルダを表示
Get-ChildItem
特定のディレクトリのファイルとフォルダを表示
Get-ChildItem C:\Users\YourUserName\Documents
隠しファイルやシステムファイルも含めて表示 (-Force パラメータ)
Get-ChildItem -Force
サブディレクトリの中身も再帰的に表示 (-Recurse パラメータ)
Get-ChildItem -Recurse
ファイルのみを表示 (-File パラメータ)
Get-ChildItem -File
ディレクトリのみを表示 (-Directory パラメータ)
Get-ChildItem -Directory
特定のパターンに一致するファイル/フォルダを表示 (ワイルドカード * ?)
Get-ChildItem .log # .log 拡張子のファイル
Get-ChildItem Data_ # Data_ で始まる名前のファイル/フォルダ
特定のパターンに一致するファイル/フォルダを表示 (-Filter パラメータ)
Filter パラメータはプロバイダーによって処理されるため、* や ? 以外のワイルドカードは使えないなど制限があるが、高速な場合がある
Get-ChildItem -Path C:\Windows\System32 -Filter *.dll
パイプラインと組み合わせて使用
現在のディレクトリにある *.txt ファイルのリストを取得
Get-ChildItem *.txt
現在のディレクトリにある *.log ファイルを再帰的に検索し、特定の条件を満たすものを表示 (後述)
Get-ChildItem *.log -Recurse | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) }
“`
Get-ChildItem
は非常に多機能で、ファイルシステムの操作の基本となります。出力されるオブジェクトは FileSystemInfo
型であり、ファイル名 (Name
), 最終書き込み日時 (LastWriteTime
), サイズ (Length
– ファイルの場合), 属性 (Attributes
) などのプロパティを持っています。これらのプロパティは、後述するパイプライン処理で活用されます。
Write-Host
:画面への出力
指定した文字列をコンソールに表示するコマンドレットです。デバッグ情報やユーザーへのメッセージを表示するのに使われます。
“`powershell
シンプルな文字列を出力
Write-Host “これはメッセージです。”
変数の内容を出力
$name = “山田”
Write-Host “こんにちは、” $name “さん!”
色付きで出力 (-ForegroundColor, -BackgroundColor パラメータ)
Write-Host “注意!” -ForegroundColor Yellow
Write-Host “エラーです!” -ForegroundColor Red -BackgroundColor White
文字列フォーマットを指定して出力 (-NoNewline パラメータで行末改行を抑制)
Write-Host “Downloading…” -NoNewline
… 何らかの処理 …
Write-Host “Done.”
“`
Write-Host
は主にユーザー向けの出力に使われます。コマンドレットのオブジェクト出力パイプラインとは独立しているため、Write-Host
の出力は通常、パイプラインの後続のコマンドレットに渡されません。スクリプトのデバッグなどで、変数の内容を一時的に確認したい場合にも便利です。
Clear-Host
:画面のクリア
コンソールの表示内容をクリアします。コマンドプロンプトの cls
や UNIX/Linux の clear
に相当します。
powershell
Clear-Host
これで、PowerShellのウィンドウをきれいにできます。
オブジェクト指向とパイプラインの威力
PowerShellの最も強力で特徴的な機能が、オブジェクト指向とそれを活用したパイプラインです。この概念を理解することが、PowerShellを使いこなすための鍵となります。
Linux/Unixシェルとの違い (テキスト vs オブジェクト)
従来のシェル(bash, cmd.exeなど)では、コマンドの出力は基本的に「テキスト」です。このテキストをパイプライン (|
) で別のコマンドに渡し、テキスト処理ツール(grep
, awk
, sed
, findstr
など)を使って必要な情報を抽出・加工します。
従来のシェルの例 (テキスト処理): 特定のプロセス名を含む行を検索
“`bash
Linux/Unix の場合
ps aux | grep ssh
コマンドプロンプトの場合
tasklist | findstr ssh
“`
これらのコマンドは、ps aux
や tasklist
の出力するテキストの中から「ssh」という文字列を含む行を探し出します。もしプロセス名だけでなく、特定のPIDの値を取り出して別の操作をしたい場合、さらに複雑なテキスト処理が必要になります。
一方、PowerShellでは、コマンドレットはテキストではなく「オブジェクト」を出力します。このオブジェクトは、様々なプロパティ(属性)やメソッド(操作)を持っています。パイプライン (|
) は、このオブジェクトを次のコマンドレットに渡します。後続のコマンドレットは、渡されたオブジェクトの構造と内容を理解した上で処理を行います。
PowerShellの例 (オブジェクト処理): 特定のプロセス名を含むプロセスオブジェクトを取得
“`powershell
名前に ssh を含むプロセスオブジェクトを取得
Get-Process | Where-Object { $_.ProcessName -like “ssh” }
“`
この例では、Get-Process
が各プロセスを表すオブジェクトのコレクションを出力し、それがパイプラインで Where-Object
に渡されます。Where-Object
は、各オブジェクトの ProcessName
プロパティの値が条件 (-like "*ssh*"
) を満たすかどうかを評価し、満たすオブジェクトだけを後続に渡します。
この「オブジェクトを渡す」という仕組みにより、データ構造を意識した柔軟で強力な処理が可能になります。
パイプライン演算子 (|
) の使い方
パイプライン演算子 (|
) は、左側のコマンドレットの出力を、右側のコマンドレットの入力として渡します。PowerShellでは、この「入力」は通常オブジェクトです。
“`powershell
実行中の全プロセスを取得し、そのリストを画面に表示
Get-Process | Write-Host # Write-Host は各オブジェクトの文字列表現を受け取る
現在のディレクトリにあるファイルとフォルダを取得し、名前だけを選択して表示
Get-ChildItem | Select-Object Name
実行中の全サービスを取得し、状態 (Status) が Running のものだけをフィルタリング
Get-Service | Where-Object { $_.Status -eq “Running” }
実行中の全プロセスを取得し、メモリ使用量 (WorkingSet) で降順にソートして表示
Get-Process | Sort-Object WorkingSet -Descending
“`
パイプラインは複数のコマンドレットを連結できます。
“`powershell
C:\Windows ディレクトリにある *.log ファイルを取得し、サイズが1MB以上のものをフィルタリングし、最終更新日時でソートして、名前とサイズだけを表示
Get-ChildItem C:\Windows*.log | Where-Object { $_.Length -ge 1MB } | Sort-Object LastWriteTime | Select-Object Name, Length
“`
このように、小さなコマンドレットをパイプラインで組み合わせることで、複雑な処理を記述できます。各コマンドレットが特定のタスク(取得、フィルタリング、ソート、選択など)に特化しており、それらをオブジェクトで繋ぐことで全体のワークフローを構築します。
オブジェクトのプロパティとメソッド
PowerShellで扱われるオブジェクトは、その対象に関する情報(プロパティ)や、その対象に対して実行できる操作(メソッド)を持っています。
例えば、Get-Process
が出力するプロセスオブジェクトは、以下のようなプロパティを持っています(一部):
Id
(PID)ProcessName
Path
(実行ファイルのパス)WorkingSet
(メモリ使用量)StartTime
(開始日時)Responding
(応答しているか)MainWindowTitle
(メインウィンドウのタイトル)
また、以下のようなメソッドを持っています(一部):
Kill()
(プロセスを強制終了する)CloseMainWindow()
(メインウィンドウを閉じる)
これらのプロパティやメソッドにアクセスするには、オブジェクトの後ろにドット (.
) を付け、その後にプロパティ名やメソッド名を記述します。
“`powershell
実行中のプロセスの中から、特定のプロセス (例: Notepad) の PID を取得
(Get-Process -Name Notepad).Id
実行中のプロセスの中から、特定のプロセス (例: Explorer) のメモリ使用量 (WorkingSet) を取得
(Get-Process -Name Explorer).WorkingSet
実行中のプロセスの中から、特定のプロセス (例: Notepad) を強制終了する (注意!対象のプロセスが終了します)
Get-Process -Name Notepad | ForEach-Object { $_.Kill() }
または、より直接的に
(Get-Process -Name Notepad).Kill()
複数のオブジェクトがある場合、それぞれのオブジェクトに対してプロパティにアクセスできる
全プロセスのプロセス名だけをリスト表示
Get-Process | Select-Object ProcessName
“`
オブジェクトのプロパティやメソッドを確認する方法は、次の Get-Member
コマンドレットを使います。
Get-Member
:オブジェクトのメンバーを表示
パイプラインで渡されるオブジェクトがどのようなプロパティやメソッドを持っているかを知りたい場合は、Get-Member
コマンドレットを使用します。これはデバッグや新しいコマンドレットの出力を探索する際に非常に役立ちます。
“`powershell
Get-Process が出力するオブジェクト (System.Diagnostics.Process 型) のメンバーを表示
Get-Process | Get-Member
Get-ChildItem が出力するオブジェクト (System.IO.DirectoryInfo または System.IO.FileInfo 型) のメンバーを表示
Get-ChildItem | Get-Member
文字列オブジェクト (“abc”) のメンバーを表示
“abc” | Get-Member
特定の種類のメンバーのみを表示 (-MemberType パラメータ)
Get-Process | Get-Member -MemberType Property # プロパティのみ
Get-Process | Get-Member -MemberType Method # メソッドのみ
Get-Process | Get-Member -MemberType Property, Method # プロパティとメソッド
“`
Get-Member
の出力を見ると、オブジェクトの TypeName
(型名)、その型が持つ Name
(メンバー名)、MemberType
(プロパティ、メソッドなど)、そして Definition
(定義、プロパティの場合は型、メソッドの場合はシグネチャ)が表示されます。
Select-Object
:オブジェクトの特定プロパティを選択
パイプラインで渡されたオブジェクトから、特定のプロパティだけを選んで出力したい場合に使用します。出力を簡潔にしたり、特定のデータ形式(CSVなど)に変換する前にデータを整形したりするのに役立ちます。
“`powershell
Get-Process の出力から、ProcessName と Id プロパティだけを選択して表示
Get-Process | Select-Object ProcessName, Id
プロパティの順序を指定
Get-Process | Select-Object Id, ProcessName, WorkingSet
全てのプロパティを表示 (* を使用) – Get-Process のデフォルト表示と同じことが多い
Get-Process | Select-Object *
先頭の N 個のオブジェクトだけを選択 (-First パラメータ)
Get-Process | Select-Object -First 10
末尾の N 個のオブジェクトだけを選択 (-Last パラメータ)
Get-Process | Select-Object -Last 10
指定したプロパティで重複しないユニークな値だけを取得 (-Unique パラメータ)
Get-Process | Select-Object ProcessName -Unique
“`
Select-Object
は、元のオブジェクトから指定されたプロパティを持つ新しいオブジェクトを作成して出力します。
Where-Object
:オブジェクトのフィルタリング
パイプラインで渡されたオブジェクトの中から、特定の条件を満たすものだけをフィルタリングして後続に渡します。PowerShellのパイプライン処理において、最もよく使われるコマンドレットの一つです。
Where-Object
は、オブジェクト一つ一つに対して指定されたスクリプトブロック { ... }
内の条件式を評価します。条件式が $true
を返した場合、そのオブジェクトは通過し、$false
を返した場合、そのオブジェクトは破棄されます。
スクリプトブロック内では、現在のオブジェクトを参照するために自動変数 $_
を使用します。
“`powershell
Get-Service の出力から、Status プロパティが “Running” に等しいものだけをフィルタリング
Get-Service | Where-Object { $_.Status -eq “Running” }
Get-Process の出力から、Id プロパティが 1000 より大きいものだけをフィルタリング
Get-Process | Where-Object { $_.Id -gt 1000 }
Get-ChildItem の出力から、Length プロパティが 102400 バイト (100KB) より大きく、かつ拡張子が “.log” のものだけをフィルタリング
Get-ChildItem | Where-Object { $.Length -gt 102400 -and $.Extension -eq “.log” }
プロパティ名が特定のパターンに一致するオブジェクトを取得
Get-Command | Where-Object { $_.Name -like “Item” }
“`
比較演算子
Where-Object
の条件式でよく使われる比較演算子です。これらの演算子は、他のプログラミング言語で使われる <
, >
, ==
などとは異なる記法であることに注意が必要です。
-eq
: 等しい (Equal)-ne
: 等しくない (Not Equal)-gt
: より大きい (Greater Than)-lt
: より小さい (Less Than)-ge
: より大きいか等しい (Greater than or Equal)-le
: より小さいか等しい (Less than or Equal)-like
: ワイルドカード (*
,?
) を使ったパターンマッチング-notlike
: ワイルドカードを使ったパターンに一致しない-match
: 正規表現を使ったパターンマッチング-notmatch
: 正規表現を使ったパターンに一致しない-contains
: 配列が特定の要素を含むか-notcontains
: 配列が特定の要素を含まないか-in
: オブジェクトが配列に含まれるか-notin
: オブジェクトが配列に含まれないか-is
: オブジェクトが特定の型であるか-isnot
: オブジェクトが特定の型でないか
論理演算子
複数の条件を組み合わせるには、論理演算子を使用します。
-and
: 両方の条件が真の場合に真-or
: いずれかの条件が真の場合に真-xor
: いずれか一方の条件のみが真の場合に真-not
または!
: 条件を否定
例:
“`powershell
状態が Running で、かつ DisplayName が “Windows” を含むサービス
Get-Service | Where-Object { $.Status -eq “Running” -and $.DisplayName -like “Windows” }
ProcessName が “chrome” または “firefox” のプロセス
Get-Process | Where-Object { $.ProcessName -eq “chrome” -or $.ProcessName -eq “firefox” }
“`
Sort-Object
:オブジェクトのソート
パイプラインで渡されたオブジェクトを、指定したプロパティの値に基づいてソートします。
“`powershell
Get-Process の出力から、ProcessName プロパティで昇順にソートして表示
Get-Process | Sort-Object ProcessName
Get-Process の出力から、Id プロパティで降順にソートして表示 (-Descending パラメータ)
Get-Process | Sort-Object Id -Descending
複数のプロパティでソート (Primary Sort Key, Secondary Sort Key…)
Get-ChildItem の出力から、まず Directory かどうかでソートし、次に Name でソート
Get-ChildItem | Sort-Object -Property @{Expression={$_.PsIsContainer}; Descending=$true}, Name
注: $_.PsIsContainer はディレクトリの場合 True、ファイルの場合 False を返す
@{Expression=…} 形式は、ソートキーをより柔軟に指定する方法
複数のプロパティをシンプルに指定 (カンマ区切り)
Get-Process | Sort-Object ProcessName, Id
“`
Sort-Object
は、データの並べ替えに欠かせないコマンドレットです。デフォルトは昇順ですが、-Descending
パラメータで降順に変更できます。
ここまでで、PowerShellのオブジェクト指向とパイプラインの基本、そしてそれを活用するための Get-Member
, Select-Object
, Where-Object
, Sort-Object
といった重要なコマンドレットを学びました。これらのコマンドレットを組み合わせることで、様々なシステム情報の取得、フィルタリング、整形が自在に行えるようになります。
次章では、実際のファイルやディレクトリの操作に焦点を当てたコマンドレットを見ていきましょう。
ファイルとディレクトリの操作
PowerShellの FileSystem
プロバイダーを使用することで、ファイルやディレクトリ(フォルダ)を効率的に操作できます。多くの操作は、前述の基本コマンドレットのバリエーションや、Item
という名詞を持つコマンドレットで行います。
New-Item
:新しいファイルやフォルダの作成
新しいファイルやディレクトリを作成します。-ItemType
パラメータで作成する種類を指定します。
“`powershell
現在のディレクトリに新しいディレクトリ (フォルダ) を作成
New-Item -Path .\NewFolder -ItemType Directory
特定のパスに新しいファイルを作成
New-Item -Path C:\Temp\MyFile.txt -ItemType File
複数のディレクトリを一度に作成
New-Item -Path C:\Temp\Folder1, C:\Temp\Folder2 -ItemType Directory
新しいディレクトリを作成し、そのディレクトリに移動
New-Item -Path .\Reports -ItemType Directory | Set-Location
“`
-Path
パラメータは、作成するアイテムの名前とパスを指定します。相対パス (.\
) も絶対パスも使用できます。
Copy-Item
:ファイルやフォルダのコピー
ファイルやディレクトリをコピーします。
“`powershell
MyFile.txt を MyFileCopy.txt という名前でコピー
Copy-Item -Path .\MyFile.txt -Destination .\MyFileCopy.txt
MyFile.txt を別のディレクトリ (C:\Backup) にコピー
Copy-Item -Path .\MyFile.txt -Destination C:\Backup
NewFolder ディレクトリとその中身を、NewFolder_Backup という名前でコピー
Copy-Item -Path .\NewFolder -Destination .\NewFolder_Backup -Recurse
C:\Source*.* (Sourceディレクトリ内の全てのファイル) を C:\Destination にコピー
Copy-Item -Path C:\Source*.* -Destination C:\Destination
C:\Source ディレクトリ自体を C:\Destination の中にコピー (結果: C:\Destination\Source)
Copy-Item -Path C:\Source -Destination C:\Destination -Recurse
“`
-Recurse
パラメータは、ディレクトリとそのサブディレクトリ、ファイルを再帰的にコピーするために必要です。-Force
パラメータは、コピー先に同名のファイルやフォルダが存在する場合に上書きするために使用します(注意して使用してください)。
Move-Item
:ファイルやフォルダの移動
ファイルやディレクトリを移動(または名前変更)します。
“`powershell
MyFile.txt を C:\Archive ディレクトリに移動
Move-Item -Path .\MyFile.txt -Destination C:\Archive
NewFolder ディレクトリとその中身を C:\Archive ディレクトリに移動
Move-Item -Path .\NewFolder -Destination C:\Archive -Recurse # フォルダの移動も -Recurse が必要な場合がある
MyFile.txt の名前を RenamedFile.txt に変更 (実質的には同じディレクトリ内での移動)
Move-Item -Path .\MyFile.txt -Destination .\RenamedFile.txt
“`
-Destination
パラメータに指定するパスが既存のディレクトリであれば移動、存在しない名前であれば名前変更として機能します。Copy-Item
と同様に -Force
パラメータがあります。
Remove-Item
:ファイルやフォルダの削除
ファイルやディレクトリを削除します。削除されたファイルは通常ゴミ箱を経由せず、直接削除されるため、非常に注意が必要です。
“`powershell
MyFileCopy.txt ファイルを削除
Remove-Item -Path .\MyFileCopy.txt
NewFolder_Backup ディレクトリを削除 (ディレクトリが空でない場合はエラーになる)
Remove-Item -Path .\NewFolder_Backup
NewFolder_Backup ディレクトリを、中身があっても強制的に再帰的に削除 (非常に危険な操作!)
Remove-Item -Path .\NewFolder_Backup -Recurse -Force
現在のディレクトリにある *.tmp 拡張子のファイルを全て削除
Remove-Item -Path .*.tmp
パイプラインと組み合わせて特定の条件のファイルを削除
更新日時が7日以上前の *.log ファイルを検索し、削除
Get-ChildItem *.log | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } | Remove-Item
“`
-Recurse
パラメータは、ディレクトリとその中身を削除するために必要です。-Force
パラメータは、読み取り専用ファイルや隠しファイルなどを削除したり、ユーザー確認プロンプトなしで削除したりするために使用します。特に -Recurse -Force
の組み合わせは非常に強力で危険なため、実行前にはコマンドレットに -WhatIf
パラメータを付けて、何が実行されるかを確認することを強く推奨します。
“`powershell
このコマンドを実行すると、実際に削除する前に「何が削除されるか」を教えてくれる
Remove-Item -Path .\NewFolder_Backup -Recurse -Force -WhatIf
“`
-WhatIf
は、多くのコマンドレットでサポートされており、実際に実行せずにそのコマンドが何をするかを確認できる便利なパラメータです。
Rename-Item
:ファイルやフォルダの名前変更
ファイルやディレクトリの名前を変更します。
“`powershell
OldName.txt ファイルの名前を NewName.txt に変更
Rename-Item -Path .\OldName.txt -NewName NewName.txt
OldFolderName ディレクトリの名前を NewFolderName に変更
Rename-Item -Path .\OldFolderName -NewName NewFolderName
“`
Move-Item
を使って名前変更することもできますが、Rename-Item
の方が意図が明確になります。
コンテンツの操作
ファイルの「中身」(テキストコンテンツ)を読み書きするコマンドレットです。
Get-Content
:ファイルの内容取得
ファイルのテキスト内容を読み込みます。
“`powershell
MyFile.txt の内容を画面に表示
Get-Content -Path .\MyFile.txt
MyFile.txt の内容を1行ずつ取得し、パイプラインに渡す
Get-Content -Path .\MyFile.txt | ForEach-Object { “行: ” + $_ }
ファイルの内容を全て一つの文字列として取得 (-Raw パラメータ)
$fileContent = Get-Content -Path .\MyFile.txt -Raw
Write-Host $fileContent
ファイルの末尾 N 行を取得 (-Tail パラメータ)
Get-Content -Path .\MyFile.txt -Tail 10
“`
-Path
は gc
というエイリアスがあります。
Set-Content
:ファイルへの書き込み (上書き)
指定したファイルにテキスト内容を書き込みます。ファイルが存在しない場合は新規作成され、存在する場合は内容が全て上書きされます。
“`powershell
新しいファイルを作成し、文字列を書き込む
Set-Content -Path .\NewFile.txt -Value “これは最初の行です。”
既存の MyFile.txt を上書きし、新しい内容に置き換える
Set-Content -Path .\MyFile.txt -Value “この行が新しい内容です。”
複数の行を書き込む (配列として値を渡す)
Set-Content -Path .\MyFile.txt -Value @(“行1”, “行2”, “行3”)
パイプラインの出力をファイルに書き込む
Get-Process | Select-Object ProcessName, Id | Set-Content -Path .\ProcessList.txt
“`
-Path
は sc
というエイリアスがあります。
Add-Content
:ファイルへの追記
指定したファイルにテキスト内容を追記します。ファイルが存在しない場合は新規作成されます。
“`powershell
MyFile.txt に新しい行を追記
Add-Content -Path .\MyFile.txt -Value “これは追記された行です。”
複数の行を追記
Add-Content -Path .\MyFile.txt -Value @(“別の行1”, “別の行2”)
パイプラインの出力をファイルに追記
“新しいプロセス情報” | Add-Content -Path .\ProcessList.txt
Get-Process | Select-Object ProcessName, Id | Add-Content -Path .\ProcessList.txt
“`
-Path
は ac
というエイリアスがあります。
Set-Content
と Add-Content
は、文字コード(エンコーディング)に関するパラメータ(-Encoding
)も持っています。特に指定しない場合、PowerShellのバージョンや設定によってデフォルトのエンコーディング(BOM付きUTF-8やUTF16LEなど)が異なります。特定のエンコーディングでファイルを保存したい場合は、明示的に指定することが重要です(例: -Encoding UTF8
)。
これで、基本的なファイルやディレクトリの作成、コピー、移動、削除、名前変更、そしてファイル内容の読み書きができるようになりました。これらのコマンドレットは、日常的なファイル操作や、後のスクリプト作成で頻繁に使用します。
システム情報の取得
PowerShellは、Windowsシステムの様々な情報にアクセスするための豊富なコマンドレットを提供しています。ここでは、よく使われるシステム情報取得コマンドレットを紹介します。
Get-Process
:実行中のプロセス情報
現在システムで実行されているプロセスに関する情報を取得します。
“`powershell
実行中の全てのプロセスを表示
Get-Process
特定の名前のプロセスを表示 (例: Chrome)
Get-Process -Name chrome
複数の名前のプロセスを表示
Get-Process -Name chrome, firefox, edge
名前にワイルドカードを使用
Get-Process -Name host # host を含む名前のプロセス
特定のID (PID) のプロセスを表示
Get-Process -Id 1234
パイプラインと組み合わせて、特定の条件のプロセスをフィルタリング
応答していないプロセスを表示
Get-Process | Where-Object { -not $_.Responding }
メモリ使用量 (WorkingSet) が大きい順にソートして表示 (上位10個)
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10 ProcessName, Id, WorkingSet
特定のプロセスのCPU使用率 (CPU プロパティは終了したプロセスでの合計CPU時間) や起動時間 (StartTime) を表示
Get-Process | Select-Object ProcessName, Id, StartTime, @{Name=”CPU(s)”; Expression={$_.CPU}}
プロセスのKill()メソッドを呼び出して強制終了 (危険な操作なので注意)
Get-Process -Name notepad | ForEach-Object { $_.Kill() }
“`
Get-Process
は ps
というエイリアスがあります。プロセスオブジェクトは System.Diagnostics.Process
型で、様々なプロパティを持っています(Get-Member
で確認)。CPU使用率の瞬間値を取得するには、WMI (Windows Management Instrumentation) など他の手段が必要になる場合があります。
Get-Service
:サービス情報
Windowsサービスに関する情報を取得します。
“`powershell
全てのサービスを表示
Get-Service
特定の名前のサービスを表示 (例: spooler – Print Spooler サービス)
Get-Service -Name spooler
名前にワイルドカードを使用
Get-Service -Name update # update を含む名前のサービス
状態 (Status) が実行中 (Running) のサービスのみを表示
Get-Service | Where-Object { $_.Status -eq “Running” }
状態 (Status) が停止 (Stopped) のサービスのみを表示し、Display Name でソート
Get-Service | Where-Object { $_.Status -eq “Stopped” } | Sort-Object DisplayName
“`
Get-Service
が出力するサービスオブジェクトは System.ServiceProcess.ServiceController
型で、Name
, DisplayName
, Status
, StartType
(Automatic, Manual, Disabled など) などのプロパティを持っています。
サービスオブジェクトには、サービスを開始 (Start()
), 停止 (Stop()
), 再起動 (Restart()
) するためのメソッドも存在します。または、専用のコマンドレットを使用することもできます。
Start-Service <ServiceName>
Stop-Service <ServiceName>
Restart-Service <ServiceName>
Suspend-Service <ServiceName>
Resume-Service <ServiceName>
例:
“`powershell
Print Spooler サービスを停止 (注意!)
Stop-Service -Name spooler
Print Spooler サービスを開始 (注意!)
Start-Service -Name spooler
Print Spooler サービスを再起動 (注意!)
Restart-Service -Name spooler
“`
サービスの開始・停止・再起動には、管理者権限が必要な場合があります。
Get-ComputerInfo
:コンピュータのシステム情報
オペレーティングシステム、ハードウェア、ネットワーク設定など、コンピュータに関する詳細な情報を取得します。このコマンドレットはPowerShell 5.1 以降で利用可能です。
“`powershell
コンピュータの全ての情報を表示
Get-ComputerInfo
特定の情報だけを選択して表示 (例: OSバージョン、コンピュータ名)
Get-ComputerInfo -Property OsName, OsVersion, CsName
プロパティ名にワイルドカードを使用
Get-ComputerInfo -Property Os, Windows
“`
Get-ComputerInfo
は、多くのプロパティを持つ単一のオブジェクトを出力します。これにより、システムの構成情報を簡単に確認できます。
PowerShell 7.x では Get-ComputerInfo
に加えて、より一般的なシステム情報にアクセスできるクロスプラットフォーム対応のコマンドレットが利用可能です。
Get-EventLog
:イベントログの参照
Windowsイベントログの内容を取得します。システムの診断やトラブルシューティングに非常に役立ちます。
“`powershell
Application ログの最新 100 件を取得
Get-EventLog -LogName Application -Newest 100
System ログの過去 24 時間のエラーイベントを取得
Get-EventLog -LogName System -EntryType Error -After (Get-Date).AddHours(-24)
Security ログから、特定のイベントID (例: 4624 – ログオン成功) のイベントを検索
Get-EventLog -LogName Security -EventId 4624
特定の Source (ソース) からのエラーイベントを取得
Get-EventLog -LogName Application -Source “Microsoft-Windows-WindowsUpdateClient” -EntryType Error
特定の期間のイベントを取得
Get-EventLog -LogName System -After “2023/01/01” -Before “2023/01/31”
パイプラインと組み合わせてフィルタリング
Get-EventLog -LogName Application | Where-Object { $.Message -like “error” -and $.EntryType -eq “Warning” }
“`
Get-EventLog
は、指定した条件に一致するイベントログエントリのオブジェクトコレクションを出力します。各イベントオブジェクトは EntryType
, Source
, EventID
, TimeWritten
, Message
などのプロパティを持っています。
イベントログは非常に大量になることがあるため、-Newest
や日付/時刻によるフィルタリング (-After
, -Before
)、あるいは Where-Object
によるフィルタリングで、取得する件数を絞ることが重要です。
注意: PowerShell 7.x では Get-EventLog
はレガシーとされており、代わりに Get-WinEvent
を使用することが推奨されています。Get-WinEvent
はより新しい形式のイベントログ(ETW: Event Tracing for Windows)にも対応しており、フィルタリング機能も強力です。
“`powershell
Get-WinEvent の例: Application ログの最新 100 件を取得
Get-WinEvent -LogName Application -MaxEvents 100
System ログからエラーと警告を取得 (XPath クエリを使用すると詳細なフィルタリングが可能)
Get-WinEvent -LogName System -FilterXPath ‘/System/Level=2 or /System/Level=3′ # Level 2=Error, Level 3=Warning
“`
Get-WinEvent
のフィルタリングは少し複雑ですが、より柔軟です。まずは Get-EventLog
で基本的な取得方法を理解し、必要に応じて Get-WinEvent
にステップアップすると良いでしょう。
これらのコマンドレットは、システムの現在の状態を確認したり、問題発生時の情報を収集したりするために不可欠です。取得したシステム情報をパイプラインで処理することで、レポート作成や自動対応などのタスクに活用できます。
変数とデータ型
PowerShellでは、取得したデータや計算結果などを変数に格納して再利用できます。変数を効果的に使うことで、コマンドやスクリプトの可読性や再利用性が向上します。
変数の宣言と代入
変数は $
記号に続けて変数名を記述します。変数名には英数字、アンダースコアを使用できますが、先頭に数字は使えません。また、ハイフンを含む名前を使用する場合は {}
で囲む必要があります(例: ${my-var}
)。
変数への値の代入は =
演算子で行います。
“`powershell
文字列を代入
$greeting = “Hello, PowerShell!”
数値を代入
$count = 100
配列を代入
$numbers = 1, 2, 3, 4, 5
$fruits = “Apple”, “Banana”, “Orange”
コマンドの出力結果を代入
$processes = Get-Process
ハッシュテーブル (キーと値のペアのコレクション) を代入
$userInfo = @{
Name = “Taro Yamada”
Age = 30
City = “Tokyo”
}
変数の内容を表示
Write-Host $greeting
Write-Host $numbers
Write-Host $userInfo
“`
変数名は大文字・小文字を区別しません(Windowsのデフォルト設定の場合)。例えば $myVariable
と $myvariable
は同じ変数を指します。
データ型
PowerShellは動的にデータ型を扱いますが、内部的には様々なデータ型を認識しています。変数に代入された値の種類によって、PowerShellが自動的に適切な型を割り当てます。
“`powershell
文字列型 (System.String)
$text = “This is a string.”
$text.GetType().FullName # -> System.String
整数型 (System.Int32 または System.Int64)
$integer = 100
$integer.GetType().FullName # -> System.Int32
浮動小数点数型 (System.Double)
$double = 123.45
$double.GetType().FullName # -> System.Double
真偽値 (System.Boolean)
$isTrue = $true
$isFalse = $false
$isTrue.GetType().FullName # -> System.Boolean
配列型 (System.Object[] または特定の型の配列)
$array = 1, “two”, $true
$array.GetType().FullName # -> System.Object[]
$intArray = 1, 2, 3 # すべて同じ型の場合、特定の型の配列になることもある
$intArray.GetType().FullName # -> System.Int32[]
ハッシュテーブル型 (System.Collections.Hashtable)
$hash = @{ Key1 = “Value1”; Key2 = 123 }
$hash.GetType().FullName # -> System.Collections.Hashtable
日付/時刻型 (System.DateTime)
$date = Get-Date
$date.GetType().FullName # -> System.DateTime
“`
必要に応じて、変数や式の前に [型名]
を付けてキャスト(型変換)や型指定を行うことも可能です。
“`powershell
文字列 “123” を整数型に変換
$stringNumber = “123”
$integerNumber = [int]$stringNumber
$integerNumber.GetType().FullName # -> System.Int32
変数に格納できる型を制限
[string]$name = “Alice”
[int]$name = 123 # これはエラーにならないが、文字列 “123” が格納され、次に数値を代入しようとするとエラーになる場合がある。
型を厳密に指定したい場合は、パラメータ宣言などで使用する。
“`
自動変数
PowerShellには、環境情報やセッションの状態に関する情報を提供する「自動変数」が多数定義されています。これらの変数は、PowerShell自身によって管理され、特別な意味を持っています。主な自動変数:
$PSVersionTable
: 現在のPowerShellセッションに関する情報(バージョン、エディション、OSなど)。$Error
: 発生したエラーの履歴を格納する配列。$?
: 直前のコマンドの実行結果が成功したか ($true) 失敗したか ($false) を示す。$_
または$PSItem
: パイプラインで処理中の現在のオブジェクト。Where-Object
やForEach-Object
などでよく使用。$Args
: スクリプトに渡されたコマンドライン引数の配列。$PSScriptRoot
: 実行中のスクリプトが格納されているディレクトリのパス。$Profile
: 現在のユーザー、現在のホストに関するPowerShellプロファイルのパス。$Home
: 現在のユーザーのホームディレクトリのパス。$Null
: 何も値がないことを示す特別な値。$True
,$False
: 真偽値。$PID
: 現在のPowerShellセッションのプロセスID。
さらに、$env:
ドライブを使って環境変数にアクセスできます。
“`powershell
環境変数 PATH の値を表示
Get-ChildItem Env:\PATH
または
$env:PATH
新しい環境変数を設定 (現在のセッションのみ有効)
$env:MY_VAR = “SomeValue”
“`
自動変数は非常に便利ですが、中には変更可能なものもあるため(例: $ErrorActionPreference
)、注意が必要です。
配列の操作
配列は、複数の値を順序付けられたコレクションとして格納するのに使われます。
“`powershell
配列の作成
$myArray = “apple”, “banana”, “cherry”
$anotherArray = @(10, 20, 30, 40) # @() 構文は単一要素の場合でも配列として扱いたい場合に便利
配列の要素数 (Count プロパティ)
$myArray.Count # -> 3
配列の要素へのアクセス (0 から始まるインデックス)
$myArray[0] # -> “apple”
$myArray[2] # -> “cherry”
範囲指定で要素にアクセス
$anotherArray[1..3] # -> 20, 30, 40
配列に要素を追加 (+= 演算子は実際には新しい配列を作成して代入し直すため、大規模な配列には非効率)
$myArray += “date” # $myArray は “apple”, “banana”, “cherry”, “date” になる
配列の繰り返し処理 (ForEach ループや ForEach-Object コマンドレットを使用)
foreach ($fruit in $myArray) {
Write-Host “果物: $fruit”
}
$myArray | ForEach-Object {
Write-Host “果物: $_”
}
“`
配列はパイプラインで要素を一つずつ渡すため、ForEach-Object
との相性が非常に良いです。
ハッシュテーブルの操作
ハッシュテーブル(辞書、連想配列とも呼ばれる)は、キーと値のペアを格納するコレクションです。特定の情報に名前でアクセスしたい場合に便利です。
“`powershell
ハッシュテーブルの作成
$myHash = @{
Name = “Alice”
Age = 25
City = “London”
}
ハッシュテーブルの要素へのアクセス (キーを指定)
$myHash[“Name”] # -> “Alice”
$myHash.Age # ドット記法でもアクセス可能 (キー名にスペースなどを含む場合は不可)
要素の追加または更新
$myHash[“Job”] = “Engineer” # 追加
$myHash[“Age”] = 26 # 更新
要素の削除
$myHash.Remove(“City”)
ハッシュテーブルのキーや値を取得
$myHash.Keys # -> Name, Age, Job
$myHash.Values # -> Alice, 26, Engineer
ハッシュテーブルの繰り返し処理 (キーと値のペアを取得)
foreach ($pair in $myHash.GetEnumerator()) {
Write-Host “Key: $($pair.Key), Value: $($pair.Value)”
}
“`
ハッシュテーブルは、設定情報の管理や、オブジェクトをカスタマイズして出力する際など、様々な場面で使用されます。
変数とデータ型を理解することで、PowerShellコマンドレットの出力をより柔軟に扱い、複雑なデータ構造をプログラム的に操作できるようになります。これは、簡単なコマンド実行から一歩進んで、スクリプトを作成する上で不可欠な知識です。
制御フロー
PowerShellスクリプトでは、特定の条件に基づいて異なる処理を実行したり、同じ処理を繰り返したりすることがよくあります。これを行うのが制御フロー構文です。
条件分岐:If
, ElseIf
, Else
指定した条件が真($true)の場合に特定の処理を実行します。
“`powershell
現在のディレクトリが C:\Temp かどうかを判定
$currentLocation = Get-Location
if ($currentLocation.Path -eq “C:\Temp”) {
Write-Host “現在は C:\Temp ディレクトリにいます。”
}
条件を満たさない場合の処理を追加 (Else)
$service = Get-Service -Name spooler -ErrorAction SilentlyContinue
if ($service -eq $null) {
Write-Host “Print Spooler サービスは見つかりませんでした。”
} else {
Write-Host “Print Spooler サービスのステータス: $($service.Status)”
}
複数の条件を判定 (ElseIf)
$number = 5
if ($number -gt 10) {
Write-Host “数値は10より大きいです。”
} elseif ($number -eq 10) {
Write-Host “数値は10に等しいです。”
} else {
Write-Host “数値は10より小さいです。”
}
“`
条件式では、前述の比較演算子(-eq
, -ne
, -gt
, -lt
, -ge
, -le
, -like
, -match
など)や論理演算子(-and
, -or
, -not
)を使用します。
複数の条件式を括弧 ()
で囲んで評価の優先順位を指定することもできます。
“`powershell
(A かつ B) または C
if (($conditionA -and $conditionB) -or $conditionC) {
# 処理
}
“`
繰り返し処理
特定の処理を複数回繰り返すための構文です。
ForEach
ループ
配列やコレクションの各要素に対して処理を実行する最も一般的な方法です。
“`powershell
配列の各要素を処理
$fruits = “Apple”, “Banana”, “Cherry”
foreach ($fruit in $fruits) {
Write-Host “現在の果物: $fruit”
}
コマンドレットの出力結果(オブジェクトのコレクション)を処理
$processes = Get-Process -Name chrome, firefox
foreach ($process in $processes) {
Write-Host “プロセスID: $($process.Id), プロセス名: $($process.ProcessName)”
# 例: 各プロセスオブジェクトのメソッドを呼び出す
# $process.Kill()
}
“`
foreach
ループは、繰り返しの対象($fruits
や $processes
)を全てメモリに読み込んでから処理を開始します。
ForEach-Object
コマンドレット
パイプラインで渡された各オブジェクトに対して処理を実行します。大規模なデータセットを扱う場合や、パイプライン内で処理を逐次的に行いたい場合に適しています。自動変数 $_
で現在のオブジェクトを参照します。
“`powershell
Get-Process の出力(各プロセスオブジェクト)を一つずつ処理
Get-Process | ForEach-Object {
Write-Host “プロセスID: $($.Id), プロセス名: $($.ProcessName)”
# 例: 特定の条件を満たすオブジェクトに対して操作を行う
# if ($.ProcessName -eq “notepad”) { $.Kill() }
}
ファイルリストをパイプラインで渡し、各ファイルに対して操作
Get-ChildItem *.txt | ForEach-Object {
Write-Host “処理中のファイル: $($.Name)”
# 例: 各ファイルの先頭行を読み込む
# Get-Content $.FullName -First 1
}
“`
ForEach-Object
は、%
というエイリアスがあります。短い処理を書く際によく使用されます。
powershell
Get-Process | % { Write-Host "$($_.ProcessName): $($_.Id)" }
ForEach-Object
は、パイプラインで渡されたオブジェクトをストリームとして処理するため、メモリ効率が良い場合があります。特に大量のデータを扱う場合は、foreach
ループよりも ForEach-Object
が推奨されることがあります。
For
ループ
特定の回数だけ処理を繰り返したい場合や、数値の範囲に基づいて繰り返したい場合に使用します。
“`powershell
0 から 4 までの数値を表示
for ($i = 0; $i -lt 5; $i++) {
Write-Host “カウント: $i”
}
配列の要素をインデックスでアクセスしながら処理
$fruits = “Apple”, “Banana”, “Cherry”
for ($i = 0; $i -lt $fruits.Count; $i++) {
Write-Host “インデックス $i: $($fruits[$i])”
}
“`
構文は多くのプログラミング言語の for
ループと同じです。
While
ループ
指定した条件が真($true)である間、処理を繰り返します。繰り返し回数が事前に決まっていない場合に適しています。ループ内で条件が偽になるように、変数の値を変更する処理が必要です。
“`powershell
カウンタが5未満の間繰り返す
$counter = 0
while ($counter -lt 5) {
Write-Host “カウンタ: $counter”
$counter++ # 条件を変化させる必要がある
}
“`
誤った条件式や条件を変更する処理がない場合、無限ループになる危険性があります。
Do-While
/ Do-Until
ループ
最初にブロック内の処理を一度実行し、その後条件を評価して繰り返すかどうかを決定します。
Do-While
: 条件が真の間繰り返すDo-Until
: 条件が偽の間繰り返す
“`powershell
Do-While: 少なくとも1回実行され、条件が真の間繰り返す
$input = “”
do {
$input = Read-Host “何か入力してください (‘quit’ で終了)”
Write-Host “入力内容: $input”
} while ($input -ne “quit”)
Do-Until: 少なくとも1回実行され、条件が偽の間繰り返す
$count = 0
do {
Write-Host “カウント: $count”
$count++
} until ($count -ge 5)
“`
これらのループ構文を組み合わせることで、PowerShellスクリプトで複雑なロジックを実装できるようになります。
スクリプトの作成と実行
PowerShellのコマンドを単発で実行するだけでなく、一連のコマンドをまとめた「スクリプト」として保存し、繰り返し実行することができます。これにより、定型作業の自動化が容易になります。
PowerShellスクリプトファイル (.ps1
) とは
PowerShellスクリプトは、コマンドレットや制御フロー構文などをテキストファイルに記述したものです。ファイル拡張子は .ps1
です。テキストエディタ(メモ帳でも可)で作成できますが、前述のPowerShell ISEやVS Codeのような専用のエディタを使用すると、コード補完やデバッグ機能などの恩恵を受けられます。
基本的なスクリプトの書き方
“`powershell
これはコメント行です。スクリプトの実行には影響しません。
変数の定義
$backupDir = “C:\Backup\Logs”
$logFilePattern = “*.log”
$daysToKeep = 30
バックアップディレクトリが存在しない場合は作成
if (-not (Test-Path $backupDir)) {
New-Item -Path $backupDir -ItemType Directory -Force
Write-Host “バックアップディレクトリ $backupDir を作成しました。”
}
処理対象のログファイルを取得
$logFiles = Get-ChildItem -Path C:\App\Logs -Filter $logFilePattern
取得したファイルに対して繰り返し処理
foreach ($file in $logFiles) {
# 最終更新日時が $daysToKeep 日より古いファイルを特定
if ($file.LastWriteTime -lt (Get-Date).AddDays(-$daysToKeep)) {
Write-Host “古いログファイルが見つかりました: $($file.FullName)”
# バックアップディレクトリへ移動
try {
Move-Item -Path $file.FullName -Destination $backupDir -Force -ErrorAction Stop
Write-Host " --> $($file.Name) を $backupDir に移動しました。"
} catch {
Write-Host " --> エラー: $($_.Exception.Message)" -ForegroundColor Red
}
}
}
Write-Host “ログファイルの整理が完了しました。”
“`
スクリプトの構成要素:
- コメント:
#
で始まる行はコメントとして扱われ、実行されません。スクリプトの説明やコードの意図を記述するのに重要です。 - コマンドレット:
Get-ChildItem
,New-Item
,Move-Item
など、これまで学んだコマンドレットを使用します。 - 変数: 情報を格納し、再利用します(
$backupDir
,$logFiles
など)。 - 制御フロー:
if
文で条件分岐、foreach
ループで繰り返し処理を行います。 - エラー処理:
try/catch
ブロックで、エラーが発生した場合の処理を定義します(後述)。
VS Codeなどのエディタを使うと、シンタックスハイライトやコード補完が効き、記述が楽になります。
スクリプトの実行方法
作成した .ps1
ファイルを実行するにはいくつかの方法があります。
- PowerShell コンソールから実行: スクリプトファイルが置かれているディレクトリに
Set-Location
で移動し、ファイル名の前に.\
を付けて実行します。
powershell
Set-Location C:\Path\To\Your\Script
.\MyScript.ps1
別のディレクトリから実行する場合は、絶対パスを指定します。
powershell
C:\Path\To\Your\Script\MyScript.ps1
.\
や絶対パスが必要なのは、セキュリティ上の理由(カレントディレクトリにある悪意のあるスクリプトが意図せず実行されるのを防ぐため)です。 - PowerShell ISE から実行: ISEでスクリプトファイルを開き、緑色の再生ボタン(または
F5
キー)をクリックします。スクリプトペインで選択した部分だけを実行することも可能です。 - VS Code から実行: VS Codeでスクリプトファイルを開き、右上隅の再生ボタンをクリックするか、ターミナルで前述の方法で実行します。VS CodeのPowerShell拡張機能を使えば、ブレークポイントを設定してデバッグ実行することも可能です。
実行ポリシー (Execution Policy)
PowerShellスクリプトを実行する際に、セキュリティ設定である「実行ポリシー」が関係してきます。実行ポリシーは、PowerShellがスクリプトを実行できるかどうか、どのような条件で実行できるかを制御します。デフォルトの設定では、インターネットからダウンロードしたスクリプトや、デジタル署名のないローカルスクリプトの実行が制限されている場合があります。
現在の実行ポリシーを確認するには:
powershell
Get-ExecutionPolicy
一般的なポリシー(Windows PowerShell 5.1 の場合):
Restricted
: スクリプトの実行を許可しない(デフォルト設定の場合がある)。AllSigned
: 全てのスクリプトは信頼された発行者によるデジタル署名が必要。RemoteSigned
: ローカルで作成したスクリプトは署名不要だが、インターネットからダウンロードしたスクリプトは信頼された発行者による署名が必要(一般的な推奨設定)。Unrestricted
: 全てのスクリプトを実行できるが、インターネットからダウンロードしたスクリプトは実行前に警告が表示される。Bypass
: 警告やブロックなしで全て実行(非常に危険!)。Undefined
: スコープ固有のポリシーが定義されていない。
ポリシーを変更するには(管理者権限が必要):
“`powershell
実行ポリシーを RemoteSigned に変更 (推奨設定の一つ)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
“`
-Scope
パラメータでポリシーを適用する範囲を指定できます。CurrentUser
は現在のユーザーにのみ適用され、管理者権限なしで設定できる場合があります。LocalMachine
はコンピュータ全体に適用され、管理者権限が必要です。
警告: 実行ポリシーの変更はセキュリティに関わる設定です。安易に Unrestricted
や Bypass
に設定せず、必要最小限のポリシー(多くの場合 RemoteSigned
)に設定し、信頼できないソースから取得したスクリプトは実行しないように注意してください。
PowerShell 7.x では実行ポリシーの動作が一部異なりますが、基本的な概念は同じです。
パラメータ付きスクリプト
スクリプトに外部から値(引数)を渡して、スクリプトの挙動を動的に変更したい場合があります。例えば、整理するログファイルのパスや、保存しておく日数をスクリプト実行時に指定したいなどです。これには、スクリプト内でパラメータを定義します。
スクリプトファイルの先頭に param()
ブロックを記述してパラメータを定義します。
“`powershell
.\CleanLogs.ps1
param(
[string]$LogPath = “C:\App\Logs”, # デフォルト値付きの文字列パラメータ
[string]$LogPattern = “*.log”, # デフォルト値付きの文字列パラメータ
[int]$DaysToKeep = 30, # 整数型のパラメータ
[switch]$WhatIf # スイッチパラメータ (指定すると $true になる)
)
変数の定義 (パラメータの値をそのまま使う)
$backupDir = “C:\Backup\Logs”
… (バックアップディレクトリ作成などの処理は前述の例と同様) …
処理対象のログファイルを取得 (パラメータを使用)
$logFiles = Get-ChildItem -Path $LogPath -Filter $LogPattern
取得したファイルに対して繰り返し処理
foreach ($file in $logFiles) {
if ($file.LastWriteTime -lt (Get-Date).AddDays(-$DaysToKeep)) {
Write-Host “古いログファイルが見つかりました: $($file.FullName)”
# WhatIf スイッチが指定されている場合は移動せず、メッセージだけ表示
if ($WhatIf) {
Write-Host " --> -WhatIf が指定されたため移動しません。"
} else {
# バックアップディレクトリへ移動
try {
Move-Item -Path $file.FullName -Destination $backupDir -Force -ErrorAction Stop
Write-Host " --> $($file.Name) を $backupDir に移動しました。"
} catch {
Write-Host " --> エラー: $($_.Exception.Message)" -ForegroundColor Red
}
}
}
}
Write-Host “ログファイルの整理が完了しました。”
“`
パラメータ付きスクリプトの実行例:
“`powershell
デフォルト値で実行
.\CleanLogs.ps1
LogPath と DaysToKeep を指定して実行
.\CleanLogs.ps1 -LogPath “D:\OtherLogs” -DaysToKeep 60
何が実行されるか確認だけ行う (-WhatIf スイッチを指定)
.\CleanLogs.ps1 -WhatIf
LogPath を指定し、何が実行されるか確認
.\CleanLogs.ps1 -LogPath “E:\TestLogs” -WhatIf
“`
パラメータを定義することで、スクリプトの汎用性が高まり、コマンドレットのように -ParamName Value
の形式で引数を渡せるようになります。パラメータには型を指定したり(例: [int]$DaysToKeep
)、必須にしたり([Parameter(Mandatory=$true)]$LogPath
)、バリデーションを設定したりすることも可能です。
スクリプトは、PowerShellの自動化機能を最大限に引き出すための重要な要素です。最初は簡単なスクリプトから始め、徐々に複雑なタスクに挑戦していくと良いでしょう。
エラー処理
スクリプトを実行する際、ファイルが見つからない、アクセス権がない、ネットワークに接続できないなど、様々なエラーが発生する可能性があります。エラーが発生した場合にスクリプトが予期せず停止するのではなく、適切に対処するための仕組みがエラー処理です。
エラーの種類
PowerShellのエラーには、主に以下の2種類があります。
- 終了しないエラー (Non-terminating Error): エラーが発生しても、PowerShellは実行を続行します。例えば、
Get-ChildItem
で存在しないパスを指定した場合などです。デフォルトではエラーメッセージが表示されますが、スクリプトの実行は停止しません。 - 終了するエラー (Terminating Error): エラーが発生すると、PowerShellは即座にスクリプトの実行を停止します。例えば、存在しないコマンドレットを実行しようとした場合や、
Try/Catch
ブロック内でthrow
ステートメントを使用した場合などです。
$Error
変数
PowerShellで発生したエラーは、自動変数 $Error
という配列に記録されます。最新のエラーは $Error[0]
に格納されます。
“`powershell
存在しないファイルを取得しようとしてエラーを発生させる (終了しないエラー)
Get-ChildItem -Path C:\NonExistentFolder -ErrorAction Continue # ErrorAction はデフォルト Continue
$Error
変数の内容を確認
$Error[0]
エラーオブジェクトのタイプやメッセージを確認
$Error[0].GetType().FullName
$Error[0].Exception.Message
発生したエラーの数をカウント
$Error.Count
$Error
変数の内容を全てクリア
$Error.Clear()
“`
$Error
変数に格納されるエラーオブジェクトは、エラーに関する詳細な情報(エラータイプ、エラーメッセージ、発生したコマンド、スタックトレースなど)を持っています。
-ErrorAction
パラメータ
多くのコマンドレットは共通パラメータとして -ErrorAction
を持っています。これにより、そのコマンドレットでエラーが発生した場合の挙動を制御できます。
よく使われる -ErrorAction
の値:
Continue
: エラーメッセージを表示し、実行を続行する(多くのコマンドレットのデフォルト)。SilentlyContinue
: エラーメッセージを表示せず、実行を続行する。Stop
: エラーメッセージを表示し、実行を停止する(終了するエラーとなる)。Inquire
: エラー発生時にユーザーにどうするか問い合わせる。Suspend
: ワークフローでのみ有効。Ignore
: エラーを完全に無視し、$Error
変数にも記録しない(PowerShell 3.0 以降)。
例:
“`powershell
存在しないファイルでもエラーメッセージを表示せず続行
Get-ChildItem -Path C:\NonExistentFolder -ErrorAction SilentlyContinue
存在しないファイルの場合に実行を停止させる
Get-ChildItem -Path C:\NonExistentFolder -ErrorAction Stop
“`
-ErrorAction Stop
を指定することで、終了しないエラーを終了するエラーに変換し、後述の Try/Catch
ブロックで捕捉できるようになります。
$ErrorActionPreference
という自動変数で、全てのコマンドレットに対するデフォルトの -ErrorAction
を設定できます。例えば $ErrorActionPreference = "Stop"
と設定すると、特に指定しない限り全てのエラーが終了するエラーとして扱われます(注意して使用してください)。
Try
, Catch
, Finally
ブロック
Try/Catch/Finally
ブロックは、終了するエラーを捕捉し、それに対して処理を実行するための構造化されたエラー処理メカニズムです。
Try
: エラーが発生する可能性のあるコードを記述します。Catch
:Try
ブロック内で終了するエラーが発生した場合に実行されます。発生したエラーに関する情報は自動変数$_
(これはエラーオブジェクトそのもの)で参照できます。Finally
:Try
ブロックの実行結果(成功または失敗)に関わらず、常に最後に実行されます。リソースの解放など、クリーンアップ処理によく使われます。
例:
“`powershell
function Get-ContentWithErrorHandling {
param([string]$Path)
try {
Write-Host "ファイル [$Path] の内容を読み込みます..."
# ファイルが存在しない場合、デフォルトは終了しないエラーだが
# -ErrorAction Stop を指定することで終了するエラーにする
Get-Content -Path $Path -ErrorAction Stop
Write-Host "読み込みが完了しました。"
} catch {
# Catch ブロックが実行される = エラーが発生した
Write-Host "エラーが発生しました: $($_.Exception.Message)" -ForegroundColor Red
# 例: エラーの種類によって異なる処理を行う
if ($_.Exception.GetType().Name -eq "ItemNotFoundException") {
Write-Host " --> 指定されたファイルが見つかりません。"
}
} finally {
# Try/Catch の実行結果に関わらず、常に実行される
Write-Host "エラー処理ブロックの実行を終了します。"
}
}
存在するファイルを指定
Get-ContentWithErrorHandling -Path “C:\Windows\notepad.exe” # 存在しないファイルなのでエラー発生
存在しないファイルを指定
Get-ContentWithErrorHandling -Path “C:\NonExistentFile.txt”
“`
Catch
ブロックは複数記述でき、特定のエラータイプだけを捕捉するように指定することも可能です(例: catch [System.IO.IOException]
)。
エラー処理は、堅牢なスクリプトを作成する上で非常に重要です。予期しない状況でもスクリプトがクラッシュせず、ユーザーに適切なフィードバックを提供したり、代替処理を実行したりできるようになります。
モジュール
PowerShellの機能は「モジュール」によって拡張されます。モジュールは、関連するコマンドレット、関数、プロバイダーなどを一つにまとめたものです。
モジュールとは?
PowerShell自体が基本的な機能を提供しますが、OSの特定機能(Active Directory、IIS、Exchange Serverなど)を管理したり、特定のツールやサービス(Azure, AWS, VMwareなど)を操作したりするためのコマンドレットは、通常モジュールとして提供されます。モジュールを利用するには、PowerShellセッションにそれを「読み込む」必要があります。
Get-Module
:読み込まれているモジュールを表示
現在のPowerShellセッションに読み込まれているモジュールの一覧を表示します。
“`powershell
現在読み込まれているモジュールを表示
Get-Module
利用可能な全てのモジュールを表示 (-ListAvailable パラメータ)
Get-Module -ListAvailable
“`
Get-Module -ListAvailable
は、システムにインストールされているが、まだ現在のセッションには読み込まれていないモジュールも表示します。
Find-Module
/ Install-Module
:モジュールの検索とインストール
PowerShell Gallery は、Microsoftやコミュニティによって公開されているPowerShellモジュールのリポジトリです。Find-Module
と Install-Module
コマンドレットを使用して、PowerShell Gallery からモジュールを検索・インストールできます(インターネット接続が必要です)。これらのコマンドレットは PowerShellGet
というモジュールに含まれており、通常はPowerShell 5.0以降に標準で利用可能です。
“`powershell
PowerShell Gallery から名前が “AzureAD” のモジュールを検索
Find-Module -Name AzureAD
PowerShell Gallery から名前が “Azure” を含むモジュールを検索
Find-Module -Name Azure*
モジュールをインストール (通常、管理者権限が必要)
Install-Module -Name AzureAD
現在のユーザーのみにインストール (-Scope CurrentUser) (管理者権限不要)
Install-Module -Name Pester -Scope CurrentUser
インストール済みのモジュールを更新
Update-Module -Name AzureAD
“`
モジュールのインストール先は、-Scope
パラメータによって異なります。AllUsers
(デフォルト、管理者権限必要) の場合、$env:ProgramFiles\PowerShell\Modules
または $PSHOME\Modules
にインストールされます。CurrentUser
の場合、$HOME\Documents\PowerShell\Modules
にインストールされます。
Import-Module
:モジュールの読み込み
インストールしたモジュールや、ローカルにあるモジュールファイル (.psd1
, .psm1
) を現在のPowerShellセッションに読み込みます。モジュールを読み込むことで、その中に含まれるコマンドレットや関数が利用可能になります。
多くの標準モジュールや、PowerShell 7.x でインストールされたモジュールは、その中のコマンドレットを初めて実行する際に自動的に読み込まれます(「モジュールの自動読み込み」機能)。しかし、古いモジュールや特定の状況では、明示的に Import-Module
を実行する必要があります。
“`powershell
Active Directory モジュールを読み込む
Import-Module ActiveDirectory
特定のパスにあるモジュールファイルを読み込む
Import-Module -Path “C:\MyModules\MyCustomModule.psd1”
読み込んだモジュールに含まれるコマンドレットを確認
Get-Command -Module ActiveDirectory
“`
Import-Module
は、Microsoft.PowerShell.Core
モジュールなど、既にセッションで利用可能なコアコマンドレットを提供するモジュールには使用できません。また、モジュールによっては依存関係があったり、特定のWindows機能がインストールされている必要があったりします。
モジュールを使いこなすことは、PowerShellの機能をさらに拡張し、特定の分野の管理タスクを効率的に行うために不可欠です。
応用例と実践テクニック(概要)
ここまでに学んだ基本的な概念とコマンドレットを組み合わせることで、様々な応用が可能になります。ここでは、いくつかの応用例と実践的なテクニックの概要を紹介します。
簡単な自動化スクリプト例
- 定期的なレポート作成: システム情報 (
Get-ComputerInfo
), プロセス一覧 (Get-Process
), サービス状態 (Get-Service
) などを取得し、整形してテキストファイルやHTMLファイルとして出力するスクリプト。 - ファイルの整理: 特定の条件(更新日時、サイズ、ファイル名パターンなど)に基づいて、ファイルを別の場所に移動したり、削除したりするスクリプト。
- ソフトウェアのインストール/設定: PowerShell Desired State Configuration (DSC) やパッケージ管理モジュール (
PackageManagement
,PSDesiredStateConfiguration
) を使用して、ソフトウェアのインストールやシステム設定を自動化する(より高度なトピック)。
CSV / JSON データの操作
PowerShellは、CSV (Comma Separated Values) や JSON (JavaScript Object Notation) といった構造化データを簡単に扱うためのコマンドレットを提供しています。
Import-Csv <FilePath>
: CSVファイルを読み込み、各行をプロパティを持つオブジェクトとして扱えるように変換します。Export-Csv <FilePath>
: オブジェクトのコレクションをCSVファイルとして出力します。ConvertFrom-Json <JsonString>
: JSON形式の文字列をPowerShellオブジェクトに変換します。ConvertTo-Json <PowerShellObject>
: PowerShellオブジェクトをJSON形式の文字列に変換します。
これらのコマンドレットを使うと、外部データファイルから情報を読み込んで処理したり、PowerShellで取得した情報を外部システムが利用できる形式で出力したりできます。
“`powershell
サンプル CSV ファイルを作成 (例: users.csv)
@”
Name,Age,City
Alice,25,London
Bob,30,Paris
Charlie,35,Tokyo
“@ | Set-Content users.csv -Encoding UTF8
CSV ファイルを読み込み、フィルタリングして表示
Import-Csv users.csv | Where-Object { $_.Age -gt 28 } | Select-Object Name, City
オブジェクトを CSV ファイルに出力
Get-Process | Select-Object ProcessName, Id, WorkingSet | Export-Csv process_list.csv -NoTypeInformation
“`
リモート処理
PowerShell Remoting を使用すると、ネットワーク上の他のコンピュータでコマンドやスクリプトを実行できます。これは、複数のサーバーを管理する際に非常に強力です。
Invoke-Command -ComputerName <ComputerName> -ScriptBlock { ... }
: リモートコンピュータで指定したスクリプトブロックを実行します。Enter-PSSession -ComputerName <ComputerName>
: リモートコンピュータとの対話型セッションを開始します。リモートコンピュータ上で直接コマンドを実行しているかのように操作できます。Exit-PSSession
: リモートセッションを終了します。
リモート処理をセットアップするには、リモートコンピュータでPowerShell Remotingを有効にする必要があります(Enable-PSRemoting
コマンドレット、管理者権限必要)。また、ファイアウォール設定なども確認する必要があります。
バックグラウンドジョブ
時間のかかる処理は、現在のPowerShellセッションをブロックせずにバックグラウンドで実行することができます。
Start-Job -ScriptBlock { ... }
: スクリプトブロックをバックグラウンドでジョブとして実行します。Get-Job
: 現在のセッションで実行中のジョブや完了したジョブの一覧を表示します。Receive-Job -Id <JobId>
: 指定したジョブの出力を取得します。Remove-Job -Id <JobId>
: 完了したジョブをジョブリストから削除します。
これにより、複数のタスクを並行して実行したり、ユーザーインターフェースをブロックせずに長時間かかる管理タスクを実行したりできます。
これらの応用例はPowerShellが持つ機能のほんの一部ですが、基本コマンドレットと制御構造、そしてモジュールの使い方をマスターすれば、これらの応用へと自然にステップアップできるようになります。
さらなる学習リソース
この記事ではPowerShellの基礎の基礎から、いくつかの重要な概念とコマンドレット、スクリプトの作成方法までを解説しました。PowerShellの世界は非常に広く深く、これらはまだ入り口に過ぎません。さらに学習を進めるためのリソースを紹介します。
- Microsoft Docs (公式ドキュメント): PowerShellに関する最も正確で詳細な情報源です。コマンドレットのリファレンス、概念解説、チュートリアルなどが豊富に揃っています。 https://learn.microsoft.com/ja-jp/powershell/
- Microsoft Learn: インタラクティブな形式でPowerShellやその他のMicrosoftテクノロジーを学べる無料のオンライン学習プラットフォームです。体系的に学ぶのに適しています。 https://learn.microsoft.com/ja-jp/training/power/
- PowerShell Practice and Development (PoshPractice): GitHubで公開されている、PowerShellの基本的なタスクを練習するためのリポジトリです。 https://github.com/devblackops/PoshPractice
- 書籍: PowerShellに関する優れた入門書や実践書が多数出版されています。自分に合ったレベルやテーマの本を探してみましょう。
- ブログやコミュニティ: PowerShellに関する技術ブログやオンラインコミュニティ(フォーラム、Slack、Discordなど)では、最新の情報や他のユーザーの経験、解決策などを得られます。積極的に参加してみましょう。
- YouTubeなどの動画プラットフォーム: PowerShellのチュートリアル動画やデモンストレーション動画が多数公開されています。実際に操作を見ながら学ぶのに役立ちます。
これらのリソースを参考に、実際に手を動かしながら様々なコマンドやスクリプトを試してみてください。エラーに出会うこともありますが、それは学習プロセスの一部です。Get-Help
を活用したり、エラーメッセージを検索したりしながら解決していくことで、着実にスキルが向上します。
まとめ
この記事では、PowerShellコマンド入門として、以下の内容を詳細に解説しました。
- PowerShellの概要と学ぶ理由
- PowerShellのインストールと起動方法、主要な開発環境
- コマンドレット、オブジェクト、パイプライン、変数、エイリアス、プロバイダーといったPowerShellの基本概念
Get-Command
,Get-Help
, ファイル/ディレクトリ操作 (Get-ChildItem
,Set-Location
,New-Item
,Copy-Item
,Move-Item
,Remove-Item
,Rename-Item
,Get-Content
,Set-Content
,Add-Content
) といった最初のコマンドレット- オブジェクト指向とパイプラインの強力さ、そしてそれを活用する
Get-Member
,Select-Object
,Where-Object
,Sort-Object
の使い方 - システム情報取得 (
Get-Process
,Get-Service
,Get-ComputerInfo
,Get-EventLog
) - 変数とデータ型、配列、ハッシュテーブルの基本操作
- 条件分岐 (
If
) と繰り返し処理 (ForEach
,ForEach-Object
,For
,While
,Do-While/Until
) といった制御フロー - PowerShellスクリプトの作成、実行、実行ポリシー、パラメータ付きスクリプトの作り方
- 基本的なエラー処理 (
$Error
,-ErrorAction
,Try/Catch/Finally
) - モジュールの利用方法 (
Get-Module
,Find-Module
,Install-Module
,Import-Module
) - 応用例とさらなる学習リソースの紹介
PowerShellは、単なるコマンドラインツールではなく、強力な自動化プラットフォームです。習得には時間がかかりますが、その投資はシステム管理作業の効率化や、より高度なITタスクへの挑戦を可能にする形で報われるはずです。
まずは、簡単なコマンドレットを組み合わせてファイル操作やシステム情報の取得から始めてみてください。次に、取得した情報をパイプラインでフィルタリングしたりソートしたりすることを試みましょう。慣れてきたら、学んだ制御フローや変数を使って簡単なスクリプトを作成し、日常的なタスクを自動化してみましょう。
PowerShellの学習は継続が鍵です。焦らず、楽しみながら、少しずつできることを増やしていきましょう。この記事が、あなたのPowerShell学習の素晴らしい第一歩となることを願っています。
頑張ってください!