徹底解説!PowerShell入門:ゼロから始める方法
はじめに:PowerShellの世界へようこそ
コンピュータを操作する方法はいくつかあります。多くの人が日常的に使っているのは、アイコンをクリックしたり、ウィンドウをドラッグしたりするグラフィカルユーザーインターフェース(GUI)です。しかし、コンピュータをもっと効率的に、もっと強力に、そしてもっと自動的に操作したいと思ったことはありませんか?
そんなとき、強力な武器となるのが「コマンドライン」です。そして、Windows環境において、そのコマンドライン操作を次のレベルに引き上げるツールが PowerShell です。
PowerShellは、マイクロソフトが開発した、タスク自動化と構成管理のためのコマンドラインシェルおよびスクリプト言語です。Windowsシステムの管理はもちろん、最近ではmacOSやLinuxでも動作するクロスプラットフォームなツールとなり、クラウドサービス(Azure, AWSなど)の管理にも広く使われています。
「コマンドライン?難しそう…」と感じる方もいるかもしれません。確かに、最初はとっつきにくく感じることもあるでしょう。しかし、PowerShellはその設計思想において、初心者にも扱いやすい工夫が凝らされています。特に、その「オブジェクト指向」という特性は、他の伝統的なシェルにはない大きな強みであり、使いこなせばシステム管理や日常業務の自動化が飛躍的に効率化されます。
この記事では、PowerShellを「ゼロ」から始める方を対象に、その基本的な概念から、インストール、起動方法、基本的なコマンドの使い方、そしてPowerShellを特別なものにしている「オブジェクト指向」や「パイプライン」といった強力な機能、さらには簡単なスクリプトの書き方まで、徹底的に解説していきます。
PowerShellを学ぶことは、あなたのPCスキルを大きく向上させ、日々の作業を効率化する強力な一歩となるはずです。さあ、PowerShellの世界へ一緒に踏み出しましょう!
第1章 PowerShellの基本概念を知る
PowerShellを学び始める前に、いくつかの基本的な概念を理解しておきましょう。
1.1 シェルとは何か? CLI vs GUI
コンピュータのOS(オペレーティングシステム)は、ユーザーがコンピュータと対話するための「シェル」を提供します。シェルは、ユーザーの指示を受け付け、それをOSが理解できる形式に変換して実行させるためのインターフェースです。
- GUI (Graphical User Interface): WindowsのエクスプローラーやmacOSのFinderのように、アイコン、ウィンドウ、メニューなどを視覚的に操作するインターフェースです。直感的で分かりやすい反面、定型的な繰り返し作業や、複数の操作を一度に行うようなタスクには向きません。
- CLI (Command Line Interface): キーボードからコマンド(命令)を入力してコンピュータを操作するインターフェースです。Windowsのコマンドプロンプト、PowerShell、macOSやLinuxでよく使われるBashやZshなどがこれにあたります。初心者には難しく見えるかもしれませんが、一度コマンドを覚えれば、GUIでは困難な複雑な操作を効率的に行ったり、複数の操作をまとめて自動化したりすることが得意です。
PowerShellは、このCLIの一つであり、マイクロソフトが開発した最新のシェルです。
1.2 なぜコマンドラインが重要なのか?
現代でもGUIが主流であるにもかかわらず、なぜコマンドライン、特にPowerShellが重要視されるのでしょうか。
- 自動化: 定型的な作業(例: ファイルのコピー、ソフトウェアのインストール、設定の変更など)をスクリプトとして記述しておけば、ワンクリックまたはスケジュールされた時間に自動的に実行できます。これは、GUIでは不可能なことです。
- 効率化: 複数のファイルに対して一括で操作を行ったり、複雑な条件に基づいて処理を実行したりする際に、GUIよりもはるかに少ない手順で実現できます。
- リモート管理: ネットワーク上の他のコンピュータに対して、コマンドラインからリモートで操作を行うことができます。多数のサーバーを管理する場合などに非常に便利です。
- レポート作成: システムの状態(プロセス、サービス、ディスク容量など)を取得し、整形してレポートとして出力することができます。
- 高度な機能へのアクセス: GUIでは提供されていない、あるいは設定が複雑なシステム内部の機能に直接アクセスできます。
システム管理者、開発者、あるいはコンピュータをより深く理解し、使いこなしたいと考える人にとって、PowerShellのような強力なコマンドラインツールは必須のスキルとなっています。
1.3 PowerShellの特徴
PowerShellが他のCLIと一線を画す、主要な特徴をいくつか紹介します。
- オブジェクト指向: これがPowerShellの最大の強みです。他の多くのシェルがコマンドの出力を単なる「テキスト」として扱うのに対し、PowerShellは「オブジェクト」として扱います。オブジェクトは、データとそのデータに対する操作(メソッド)をひとまとめにしたものです。これにより、データのフィルタリング、並べ替え、整形などが非常に容易かつ強力に行えます。(詳細は後述の「強力な機能」で解説します。)
- コマンドレット (Cmdlet): PowerShellの基本的なコマンドは「コマンドレット」と呼ばれます。コマンドレットは、特定のタスクを実行するために設計された特別な命令です。ほとんどのコマンドレットは
Verb-Noun
の形式(例:Get-Process
,Set-Location
,Remove-Item
)になっており、何をするコマンドなのかが直感的に理解しやすくなっています。 - 一貫性: コマンドレットの命名規則 (
Verb-Noun
) や、共通のパラメータ(例: ほとんどのコマンドレットで-Verbose
や-Debug
といった共通のパラメータが使えます)に一貫性があるため、一度基本的な使い方を覚えれば、新しいコマンドレットも比較的容易に使いこなせます。 - パイプライン: Unix/Linuxシェルにもパイプライン機能はありますが、PowerShellのパイプラインは「オブジェクト」を渡すため、より強力です。あるコマンドレットの出力オブジェクトを、別のコマンドレットの入力として渡すことで、複数のコマンドを連携させて複雑な処理を効率的に行うことができます。(詳細は後述の「強力な機能」で解説します。)
- 豊富な機能: ファイルシステム、レジストリ、証明書ストア、プロセス、サービスなど、OSの様々な要素に統一的な方法でアクセスできます。また、WMI (Windows Management Instrumentation) や CIM (Common Information Model) といった Windows の管理機能にも容易にアクセスできます。
- クロスプラットフォーム: PowerShell Core (PowerShell 7以降) は、Windowsだけでなく、macOSやLinux上でも動作します。これにより、様々なOSが混在する環境でも、同じPowerShellの知識とスキルで管理が可能になります。
1.4 他のシェルとの違い(コマンドプロンプト、Bashなど)
Windowsには伝統的なCLIとして「コマンドプロンプト (cmd.exe)」があります。また、LinuxやmacOSでは「Bash」などのシェルがよく使われます。PowerShellはこれらと何が違うのでしょうか?
- コマンドプロンプト (cmd.exe): DOS時代のコマンドを引き継いでおり、基本的なファイル操作などは可能ですが、機能は限定的です。特に、コマンドの出力を単なる文字列としてしか扱えないため、複雑なデータ処理やシステム管理には向きません。PowerShellはコマンドプロンプトの上位互換と位置づけられます。
- Bash: Unix/Linux系の伝統的なシェルで、非常に強力です。テキスト処理に優れており、
grep
,sed
,awk
といった強力なテキスト処理ツールと連携することで、様々なタスクをこなせます。しかし、基本的にコマンドの出力を「テキストストリーム」として扱うため、構造化されたデータ(オブジェクト)の操作にはPowerShellの方が向いています。PowerShellはBashのようなスクリプト機能も持ち合わせていますが、その最大の強みはやはりオブジェクト指向である点です。
簡単に言えば、コマンドプロンプトは古いツールであり、PowerShellに取って代わられつつあります。Bashはテキスト処理に強く、PowerShellはオブジェクト処理に強い、という特徴があります。Windows環境でのシステム管理や自動化には、PowerShellが最も適しています。
第2章 PowerShellのインストールと起動
PowerShellを使うためには、まずコンピュータにインストールされているか確認し、必要であればインストールまたは起動する必要があります。
2.1 Windowsへのインストール
Windowsには、歴史的に2つのPowerShellが存在します。
- Windows PowerShell: Windows 7 / Windows Server 2008 R2以降のWindows OSに標準搭載されているPowerShellです。バージョンは5.1までで開発は終了しています。OSに最初から入っているので、特にインストール作業は不要です。
- PowerShell Core (PowerShell 6以降): .NET Core/.NET 上で動作する、クロスプラットフォームでオープンソースのPowerShellです。PowerShell 7が最新の安定版として推奨されています。Windows PowerShellよりも新しい機能が追加されており、開発が続けられています。Windows環境でも、新しい機能を利用したり、macOSやLinuxと共通の環境を使いたい場合は、こちらをインストールします。
Windows PowerShell (標準搭載版)
Windows 10やWindows 11、新しいバージョンのWindows Serverをお使いであれば、既にインストールされています。特に何もする必要はありません。
PowerShell Core (最新版)
Microsoftの公式GitHubリポジトリやMicrosoft Storeからダウンロードしてインストールできます。最新版の機能を利用したい場合は、こちらをインストールすることをおすすめします。
インストール方法はいくつかありますが、最も簡単なのはMicrosoft Storeを使う方法です。
- Microsoft Storeを開きます。
- 「PowerShell」と検索します。
- 「PowerShell」アプリが表示されるので、「入手」または「インストール」ボタンをクリックします。
- インストールが完了したら、スタートメニューなどから起動できるようになります。
手動でインストールする場合、GitHubのPowerShellリリースページからインストーラー(msi
ファイルなど)をダウンロードして実行します。
2.2 Windows以外のOS(macOS, Linux)へのインストール
PowerShell Core (PowerShell 7以降) は、macOSやLinuxでも動作します。これらのOSにインストールするには、まず .NET 環境が必要です。多くの場合は、PowerShellのインストーラーが依存関係を解決してくれるか、公式ドキュメントにインストール手順が詳しく書かれています。
- macOS: Homebrewを使う方法が一般的です。ターミナルを開いて
brew install powershell
と実行します。 -
Linux: 各ディストリビューション(Ubuntu, CentOS, Fedoraなど)向けのパッケージマネージャー(apt, yum, dnfなど)を使ってインストールできます。具体的なコマンドはディストリビューションによって異なりますが、公式ドキュメントに手順が記載されています。例えば、Ubuntuの場合は以下のようになります。
“`bash
Microsoft リポジトリの登録 (初回のみ)
wget https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.debPowerShell のインストール
sudo apt update
sudo apt install -y powershell
“`
インストール後は、ターミナルを開いて pwsh
と入力することでPowerShellを起動できます。(Windows PowerShellは powershell.exe
ですが、PowerShell Coreは pwsh
という実行ファイル名です。)
2.3 バージョンの確認方法
インストールされているPowerShellのバージョンを確認するには、PowerShellプロンプトで以下のコマンドを実行します。
powershell
$PSVersionTable
このコマンドは、PowerShellのバージョンやOSのバージョンなど、環境に関する情報をハッシュテーブル(キーと値のペアの集まり)として出力します。出力の中に PSVersion
という項目があり、そこにバージョン番号が表示されます。
Name Value
---- -----
PSVersion 7.3.6
PSEdition Core
... (以下略) ...
PSVersion
が5.1以下であればWindows PowerShell、6以上であればPowerShell Coreです。
第3章 PowerShellの起動と終了
PowerShellの起動方法と終了方法を学びましょう。
3.1 起動方法
PowerShellを起動する方法はいくつかあります。
- スタートメニューから起動:
- Windows PowerShell: スタートメニューを開き、「Windows PowerShell」と入力して検索します。表示されたアプリをクリックして起動します。
- PowerShell Core: Microsoft Storeからインストールした場合などは、「PowerShell」と入力して検索します。
- ファイル名を指定して実行 (Windows):
Windowsキー + R
を押して「ファイル名を指定して実行」ダイアログを開きます。- 「powershell」と入力してEnterキーを押すと、Windows PowerShellが起動します。
- 「pwsh」と入力してEnterキーを押すと、PowerShell Coreが起動します(PowerShell Coreがインストールされ、環境変数PATHに追加されている場合)。
- エクスプローラーのアドレスバーから起動 (Windows):
- エクスプローラーで任意のフォルダを開きます。
- アドレスバーをクリックし、「powershell」または「cmd」と入力してEnterキーを押すと、そのフォルダをカレントディレクトリとしてPowerShell(またはコマンドプロンプト)が起動します。
- Windows Terminalから起動:
- Windows Terminalは、PowerShell, コマンドプロンプト, WSL (Windows Subsystem for Linux) など、複数のシェルをタブで管理できる高機能なターミナルアプリケーションです。Windows Terminalを起動し、新しいタブを開く際にPowerShellを選択するのが最も推奨される方法です。Windows TerminalはMicrosoft Storeから無料でインストールできます。
3.2 管理者権限での起動
システムの重要な設定を変更したり、特定のソフトウェアをインストールしたりする際には、管理者権限が必要になることがあります。PowerShellを管理者権限で起動するには、スタートメニューなどでPowerShellを検索した際に、右クリックして「管理者として実行」を選択します。
管理者権限で起動されたPowerShellウィンドウのタイトルバーには、「管理者:Windows PowerShell」または「管理者:PowerShell」のように「管理者」と表示されます。
注意: 管理者権限での操作はシステム全体に影響を与える可能性があるため、必要な場合のみ使用し、コマンドの実行には十分注意してください。
3.3 PowerShell ISE(統合スクリプト環境)について
PowerShell ISE (Integrated Scripting Environment) は、PowerShellスクリプトを作成、テスト、デバッグするためのグラフィカルなツールです。コマンドの入力補完、シンタックスハイライト、デバッガー機能などがあり、スクリプト開発に便利です。
Windows PowerShellには標準で付属していますが、PowerShell Coreでは非推奨となり、代わりに Visual Studio Code のPowerShell拡張機能の使用が推奨されています。Visual Studio Codeは無料の高機能なコードエディタで、PowerShellスクリプト開発においてISE以上の機能を提供します。
初心者のうちは、まずコマンドプロンプト形式のPowerShellウィンドウで基本的なコマンド操作に慣れることから始め、スクリプトを書き始める段階でISEやVisual Studio Codeのような開発環境に移行するのが良いでしょう。
3.4 終了方法
PowerShellセッションを終了するには、以下のコマンドを入力してEnterキーを押します。
powershell
exit
または、ウィンドウの右上の閉じるボタンをクリックしても終了できます。
第4章 基本的なコマンド(コマンドレット)を使ってみよう
PowerShellの基本的な操作は、コマンドレットを入力して実行することです。前述したように、コマンドレットは Verb-Noun
の形式をしています。
- Verb (動詞): そのコマンドレットが何をするかを表します(例: Get, Set, New, Remove, Stop, Start, Write, Readなど)。PowerShellには承認された標準の動詞リストがあり、これによりコマンドレットの挙動がある程度予測できます。
- Noun (名詞): そのコマンドレットが操作の対象とするものを表します(例: Process, Service, Item, Content, Locationなど)。
例えば、Get-Process
は実行中のプロセスを取得するコマンドレットです。Stop-Service
はサービスを停止するコマンドレットです。
4.1 コマンドレットを探す: Get-Command
どんなコマンドレットが使えるのか知りたいときは、Get-Command
コマンドレットを使います。
powershell
Get-Command
これにより、システムに登録されているすべてのコマンドレット、関数、エイリアスなどが一覧表示されます。数が多すぎる場合は、条件を指定して絞り込むことができます。
- 特定の名前を含むコマンドレットを探す:
powershell
Get-Command *Process*
(*
はワイルドカードで、「Process」を含む名前、という意味になります。) - 特定の動詞を持つコマンドレットを探す:
powershell
Get-Command -Verb Get - 特定のモジュールに属するコマンドレットを探す:
powershell
Get-Command -Module Microsoft.PowerShell.Management
4.2 コマンドレットの使い方を調べる: Get-Help
特定のコマンドレットが何をするのか、どのようなオプション(パラメータ)があるのか、どのように使うのかを知りたい場合は、Get-Help
コマンドレットを使います。
powershell
Get-Help Get-Process
これにより、Get-Process
コマンドレットの概要、構文、説明、関連リンクなどが表示されます。
より詳しい情報を表示するには、パラメータを追加します。
- 詳細な情報を表示:
powershell
Get-Help Get-Process -Detailed - 完全な情報を表示(パラメータの説明、例などを含む):
powershell
Get-Help Get-Process -Full - 使用例のみを表示:
powershell
Get-Help Get-Process -Examples
Get-Help
は情報をインターネットから取得する場合があるため、初回実行時や情報が古い場合は、ヘルプ情報の更新を促されることがあります。その際は、以下のコマンドを実行してヘルプ情報を更新すると良いでしょう。
powershell
Update-Help
(このコマンドは管理者権限が必要な場合があります。)
4.3 よく使う基本的なコマンドレット
それでは、いくつかの基本的なコマンドレットを使って、実際に操作してみましょう。
4.3.1 ファイル・ディレクトリ操作
ファイルやディレクトリ(フォルダ)の操作は、PowerShellの基本中の基本です。
-
現在の場所を表示する:
Get-Location
(pwd
)
現在の作業ディレクトリ(カレントディレクトリ)を表示します。Unix/Linuxのpwd
コマンドや、コマンドプロンプトのcd
を引数なしで実行するのと同じです。
powershell
Get-Location
# またはエイリアスを使用
pwd -
場所を移動する:
Set-Location
(cd
,chdir
)
現在の作業ディレクトリを変更します。Unix/Linuxのcd
コマンドや、コマンドプロンプトのcd
コマンドと同じです。
“`powershell
# 親ディレクトリに移動
Set-Location ..
# またはエイリアス
cd ..指定したパスに移動
Set-Location C:\Windows\System32
またはエイリアス
cd C:\Windows\System32
“` -
ファイルやディレクトリの一覧を表示する:
Get-ChildItem
(ls
,dir
)
指定したパスにあるファイルやディレクトリの一覧を表示します。Unix/Linuxのls
コマンドや、コマンドプロンプトのdir
コマンドと同じです。
“`powershell
# 現在のディレクトリの内容を表示
Get-ChildItem
# またはエイリアス
ls
dir特定のディレクトリの内容を表示
Get-ChildItem C:\Users
オプションを使うことで、表示する情報を絞り込んだり、非表示ファイルを含めたりできます。
powershell指定した拡張子のファイルのみ表示
Get-ChildItem *.txt
ディレクトリのみ表示
Get-ChildItem -Directory
ファイルのみ表示
Get-ChildItem -File
非表示ファイルやシステムファイルも表示
Get-ChildItem -Force
サブディレクトリの内容も再帰的に表示
Get-ChildItem -Recurse
“` -
新しいファイルやディレクトリを作成する:
New-Item
(mkdir
)
新しいファイルやディレクトリを作成します。
“`powershell
# 新しいディレクトリを作成
New-Item -Path C:\temp\MyNewFolder -ItemType Directory
# またはエイリアス
mkdir C:\temp\MyNewFolder新しいファイルを作成
New-Item -Path C:\temp\MyNewFile.txt -ItemType File
“` -
ファイルやディレクトリを削除する:
Remove-Item
(rm
,del
,erase
)
指定したファイルやディレクトリを削除します。このコマンドは元に戻せないので注意が必要です。
“`powershell
# ファイルを削除
Remove-Item C:\temp\MyNewFile.txtディレクトリを削除(空でない場合でも削除するには -Recurse をつける)
Remove-Item C:\temp\MyNewFolder -Recurse -Force
``
-Forceパラメータは、通常は削除できない隠しファイルや読み取り専用ファイルなどを強制的に削除する場合に使います。ディレクトリを削除する際は、
-Recurse` をつけることで、そのディレクトリ内のファイルやサブディレクトリもまとめて削除できます。 -
ファイルやディレクトリをコピーする:
Copy-Item
(cp
)
ファイルやディレクトリをコピーします。
“`powershell
# ファイルをコピー
Copy-Item C:\temp\MyFile.txt C:\temp\MyFile_copy.txtディレクトリをコピー(内容もコピーするには -Recurse をつける)
Copy-Item C:\temp\MyFolder C:\temp\MyFolder_copy -Recurse
“` -
ファイルやディレクトリを移動する:
Move-Item
(mv
)
ファイルやディレクトリを移動します。
“`powershell
# ファイルを移動
Move-Item C:\temp\MyFile.txt C:\Users\YourName\Documents\ディレクトリを移動
Move-Item C:\temp\MyNewFolder C:\temp\archives\
“` -
ファイルやディレクトリの名前を変更する:
Rename-Item
(ren
)
ファイルやディレクトリの名前を変更します。
“`powershell
# ファイル名を変更
Rename-Item C:\temp\MyFile.txt NewName.txtディレクトリ名を変更
Rename-Item C:\temp\MyFolder RenamedFolder
“`
4.3.2 プロセスの操作
コンピュータ上で実行中のプログラムを「プロセス」と呼びます。PowerShellでプロセスを操作できます。
-
実行中のプロセスを取得する:
Get-Process
(ps
,get-ps
)
現在実行中のプロセスの一覧を表示します。
powershell
Get-Process
# またはエイリアス
ps
特定のプロセス名を指定して情報を取得することもできます。
“`powershell
# Explorer プロセスの情報を取得
Get-Process Explorer複数のプロセスを指定
Get-Process chrome, firefox, msedge
“` -
プロセスを停止する:
Stop-Process
(kill
)
指定したプロセスを強制的に終了させます。このコマンドはアプリケーションのデータ損失を引き起こす可能性があるため、慎重に使用してください。
“`powershell
# PID (プロセスID) を指定して停止
Stop-Process -Id 1234プロセス名を指定して停止
Stop-Process -Name notepad
``
-Force` パラメータをつけないと停止できないプロセスもあります。 -
プログラムを開始する:
Start-Process
(start
)
新しいプログラムを実行します。
“`powershell
# メモ帳を起動
Start-Process notepadオプションを指定して起動(例: ウェブサイトを既定のブラウザで開く)
Start-Process https://www.microsoft.com
“`
4.3.3 サービスの操作
Windowsサービスは、バックグラウンドで実行されるプログラムです。
-
サービスの状態を取得する:
Get-Service
コンピュータにインストールされているサービスの一覧と状態を表示します。
powershell
Get-Service
特定のサービスを指定することもできます。
“`powershell
# BITS サービスの状態を取得
Get-Service BITS実行中のサービスのみを表示
Get-Service | Where-Object Status -eq Running
“` -
サービスを開始する:
Start-Service
停止しているサービスを開始します。
powershell
Start-Service -Name Spooler -
サービスを停止する:
Stop-Service
実行中のサービスを停止します。
powershell
Stop-Service -Name Themes -
サービスを再起動する:
Restart-Service
サービスを停止してから開始します。
powershell
Restart-Service -Name wuauserv # Windows Update Service
4.3.4 変数
PowerShellでは、データを一時的に保存するために「変数」を使うことができます。変数の名前は $
記号で始まります。
“`powershell
変数 $name に文字列を代入
$name = “Alice”
変数 $age に数値を代入
$age = 30
変数の内容を表示
Write-Host “Hello, my name is $($name) and I am $($age) years old.”
変数 $files に Get-ChildItem の結果を代入
$files = Get-ChildItem C:\Windows
“`
変数は、コマンドレットの出力を保存しておき、後で処理したり参照したりする場合に非常に便利です。
4.3.5 エイリアス
PowerShellには、よく使うコマンドレットに対して短い別名(エイリアス)があらかじめ定義されています。例えば、Get-ChildItem
のエイリアスは ls
や dir
です。これにより、他のシェルに慣れているユーザーでも使いやすくなっています。
定義されているエイリアスを確認するには、Get-Alias
コマンドレットを使います。
powershell
Get-Alias
特定のコマンドレットに対応するエイリアスを確認するには、名前を指定します。
powershell
Get-Alias Get-ChildItem
エイリアスは便利ですが、スクリプトを書く際には、可読性を高めるためにエイリアスではなく正式なコマンドレット名を使用することが推奨されます。
第5章 PowerShellの強力な機能:オブジェクトとパイプライン
PowerShellが他のシェルと最も異なる点であり、その最大の強みとなっているのが、「オブジェクト指向」と、それによって実現される「パイプライン」です。
5.1 オブジェクト指向とは
前述の通り、PowerShellのコマンドレットは、その出力を単なるテキストではなく「オブジェクト」として扱います。オブジェクトとは、データ(プロパティ)とそのデータに対して行える操作(メソッド)をまとめたものです。
例えば、Get-Process
コマンドレットを実行すると、表示されるのはテキストの表のように見えますが、実際には各プロセスを表す複数の「プロセスオブジェクト」が出力されています。それぞれのプロセスオブジェクトは、Id
, Name
, CPU
, WorkingSet
といったプロパティ(データの属性)や、Kill()
といったメソッド(操作)を持っています。
文字列処理 vs オブジェクト処理
伝統的なシェル(コマンドプロンプトやBashなど)では、コマンドの出力は基本的に「文字列」です。文字列の中から必要な情報を抽出するには、テキスト処理ツール(grep, sed, awkなど)を使って特定のパターンを検索したり、区切り文字で分割したりといった複雑な処理が必要でした。
PowerShellでは、オブジェクトのプロパティに直接アクセスできます。これにより、より簡単に、正確に、そして強力にデータを操作できます。
例:実行中のExplorerプロセスのIDを取得したい場合
- 文字列処理の場合(概念):
Get-Process
の出力テキストを一行ずつ読み込み、「explorer」という文字列を含む行を探し、その行の特定の列(空白やタブで区切られた箇所)から数値部分(ID)を抜き出す。区切り文字やフォーマットが変わると処理が破綻する可能性があります。 - PowerShell (オブジェクト処理) の場合:
Get-Process
で取得したプロセスオブジェクトの中から、Name
プロパティが"Explorer"
であるオブジェクトを選び出し、そのオブジェクトのId
プロパティの値を参照する。オブジェクトのプロパティは構造化されているため、より確実です。
5.2 オブジェクトのプロパティとメソッドを調べる: Get-Member
特定のコマンドレットが出力するオブジェクトがどのようなプロパティやメソッドを持っているかを知りたいときは、Get-Member
コマンドレットを使います。
Get-Member
は単体で使うのではなく、他のコマンドレットの出力をパイプラインで渡して使用します。
powershell
Get-Process | Get-Member
このコマンドを実行すると、Get-Process
が出力するプロセスオブジェクトが持っている様々なメンバー(TypeName, Name, MemberType, Definitionなど)の一覧が表示されます。MemberType
が Property
であればプロパティ、Method
であればメソッドです。
例えば、Get-Process | Get-Member
の出力を見ると、CPU
, Id
, Name
, Path
などが Property
としてリストされているのが分かります。
5.3 パイプライン (|
) を活用する
PowerShellのパイプライン (|
記号)は、あるコマンドレットの出力(オブジェクト)を、別のコマンドレットの入力として渡すための機能です。これにより、複数のコマンドレットを鎖のように繋げて、より複雑な処理を段階的に実行できます。
伝統的なシェルでもパイプラインはありますが、PowerShellのパイプラインはオブジェクトを渡す点が異なります。これにより、データのロスやフォーマット変換の手間が少なく、より効率的な処理が可能になります。
例:Get-Process
の出力結果を、別のコマンドレットで処理する
“`powershell
実行中のプロセスを取得し、その結果を画面に表示する(通常は自動的に行われる)
Get-Process | Out-Host
“`
Out-Host
コマンドレットは、入力を受け取ってコンソール画面に表示する役割を持ちます。普段 Get-Process
とだけ入力して結果が表示されるのは、PowerShellが既定で Out-Host
を追加しているためです。
パイプラインと組み合わせてよく使われるコマンドレットを紹介します。これらは、パイプラインで渡されてくるオブジェクトを受け取り、フィルタリング、選択、並べ替え、または各オブジェクトへの操作を行います。
-
フィルタリング:
Where-Object
(where
,?
)
パイプラインで渡されてきたオブジェクトの中から、指定した条件に一致するものだけを選択します。
構文はWhere-Object { $_.PropertyName -オペレーター 値 }
の形式が基本です。$_
はパイプラインから渡されてきた現在のオブジェクトを表します。-オペレーター
には、-eq
(等しい),-ne
(等しくない),-gt
(より大きい),-lt
(より小さい),-like
(パターン一致),-match
(正規表現一致) などが使われます。例:CPU使用率が100より大きいプロセスを取得する
powershell
Get-Process | Where-Object { $_.CPU -gt 100 }
例:名前に “chrome” を含むプロセスを取得する
“`powershell
Get-Process | Where-Object { $_.Name -like “chrome” }または正規表現で
Get-Process | Where-Object { $_.Name -match “chrome” }
“` -
プロパティの選択/変更:
Select-Object
(select
)
パイプラインで渡されてきたオブジェクトから、必要なプロパティだけを選択したり、新しいプロパティを追加したりします。例:プロセス名とID、CPU使用率だけを表示する
powershell
Get-Process | Select-Object Name, ID, CPU
例:ファイルリストからファイル名と最終書き込み時刻だけを表示する
powershell
Get-ChildItem | Select-Object Name, LastWriteTime -
並べ替え:
Sort-Object
(sort
)
パイプラインで渡されてきたオブジェクトを指定したプロパティの値に基づいて並べ替えます。例:CPU使用率の高い順にプロセスを並べる
powershell
Get-Process | Sort-Object CPU -Descending
-Descending
パラメータで降順(大きい順)になります。既定は昇順(小さい順)です。例:ファイルサイズが大きい順にファイルを表示する
powershell
Get-ChildItem -File | Sort-Object Length -Descending -
各オブジェクトへの操作:
ForEach-Object
(foreach
,%
)
パイプラインで渡されてきたオブジェクト一つ一つに対して、指定した処理を実行します。例:取得した各プロセスのIDを表示する
“`powershell
Get-Process | ForEach-Object { Write-Host “Process ID: $($_.Id)” }またはエイリアス
Get-Process | % { Write-Host “Process ID: $($.Id)” }
``
{ … }の中はスクリプトブロックと呼ばれ、実行したい処理を記述します。ここでも
$` は現在のオブジェクトを表します。
5.4 パイプラインを使った複合的な例
これらのコマンドレットをパイプラインで組み合わせることで、複雑な処理を簡潔に記述できます。
例1:容量が1MBより大きい .log
ファイルを検索し、最終書き込み時刻の新しい順に、ファイル名と容量だけを表示する
powershell
Get-ChildItem *.log -File |
Where-Object { $_.Length -gt 1MB } |
Sort-Object LastWriteTime -Descending |
Select-Object Name, Length
このように、Get-ChildItem
でファイルリストを取得し、そのオブジェクトを Where-Object
でフィルタリングし、フィルタリングされたオブジェクトを Sort-Object
で並べ替え、最後に並べ替えられたオブジェクトから Select-Object
で必要なプロパティだけを選択して表示しています。
例2:CPU使用率が最も高いプロセスの上位5つを表示する
powershell
Get-Process |
Sort-Object CPU -Descending |
Select-Object -First 5 Name, CPU, ID
まず Get-Process
で全プロセスを取得し、Sort-Object CPU -Descending
でCPU使用率の高い順に並べ替え、最後に Select-Object -First 5 Name, CPU, ID
で最初の5つのオブジェクトから Name, CPU, ID プロパティを選択して表示しています。
このように、PowerShellのオブジェクト指向とパイプラインを理解すると、システムの状態を取得し、分析し、操作することが非常に効率的に行えるようになります。これは、PowerShellを学ぶ上で最も重要なポイントの一つです。
5.5 リモート処理の基本
PowerShellは、ネットワーク経由で他のコンピュータ上でコマンドやスクリプトを実行する「リモート処理」の機能も備えています。これは、多数のサーバーやクライアントPCを管理する際に非常に強力な機能です。
リモート処理にはいくつかの方法がありますが、代表的なのは Invoke-Command
コマンドレットです。
“`powershell
Server01 というコンピュータ上で Get-Process を実行する
Invoke-Command -ComputerName Server01 -ScriptBlock { Get-Process }
“`
-ComputerName
パラメータで対象のコンピュータ名を指定し、-ScriptBlock
パラメータでリモートで実行したいPowerShellコードを {}
で囲んで指定します。
リモート処理を行うには、対象のコンピュータでPowerShell Remotingが有効になっている必要があります。有効化するには、管理者権限のPowerShellで Enable-PSRemoting
コマンドレットを実行します。セキュリティ上の理由から、既定では無効になっています。
また、リモートセッションを確立して、複数のコマンドを対話的に実行することも可能です。
“`powershell
Server01 とリモートセッションを確立し、対話的に操作を開始
Enter-PSSession -ComputerName Server01
プロンプトが変更され、リモートコンピュータ上での操作となる
Server01:>
リモートコンピュータでコマンドを実行
Get-Service
リモートセッションを終了し、元のコンピュータに戻る
Exit-PSSession
“`
リモート処理はPowerShellの高度な機能の一つですが、基本的なコマンドレットの使い方に慣れてきたら、ぜひ挑戦してみてください。
第6章 PowerShellスクリプトの書き方
PowerShellコマンドを一行ずつ実行するだけでなく、複数のコマンドをまとめて記述し、自動的に実行させるのが「スクリプト」です。PowerShellスクリプトファイルは、通常 .ps1
という拡張子を持ちます。
6.1 簡単なスクリプトの作成と実行
簡単なスクリプトを作成してみましょう。テキストエディタ(メモ帳、Visual Studio Codeなど)を開き、以下の内容を記述します。
“`powershell
これはコメントです。スクリプトの実行には影響しません。
画面に挨拶を表示
Write-Host “Hello, PowerShell Script!”
現在の日付と時刻を取得して表示
$currentTime = Get-Date
Write-Host “Current time is: $($currentTime)”
指定したディレクトリのファイル一覧を表示
Get-ChildItem C:\Users\YourName\Documents
“`
(YourName
の部分は、あなたのユーザー名に置き換えてください。)
この内容を MyFirstScript.ps1
という名前で適当なフォルダ(例: C:\Scripts
)に保存します。
保存したスクリプトを実行するには、PowerShellプロンプトからスクリプトファイルのパスを指定して実行します。
“`powershell
スクリプトがあるディレクトリに移動している場合
.\MyFirstScript.ps1
スクリプトがあるディレクトリに移動していない場合(フルパス指定)
C:\Scripts\MyFirstScript.ps1
“`
先頭の .\
は、現在のディレクトリにあるスクリプトを実行することを明示するための記述です。セキュリティ上の理由から、PowerShellは既定では現在のディレクトリにあるスクリプトを .\
や ..\
をつけずにファイル名だけで実行することを許可していません。
6.2 実行ポリシー (Execution Policy
)
PowerShellには、スクリプトの実行を制限するための「実行ポリシー」というセキュリティ機能があります。これは、悪意のあるスクリプトが意図せず実行されるのを防ぐためのものです。
Get-ExecutionPolicy
コマンドレットで現在の実行ポリシーを確認できます。
powershell
Get-ExecutionPolicy
実行ポリシーにはいくつかの種類があります(例: Restricted
, AllSigned
, RemoteSigned
, Unrestricted
)。既定値は Restricted
であることが多く、この状態ではPowerShellスクリプト(.ps1
ファイル)を全く実行できません。
スクリプトを実行できるようにするには、実行ポリシーを変更する必要があります。変更には Set-ExecutionPolicy
コマンドレットを使用します。
“`powershell
リモートからダウンロードしたスクリプトは信頼できる発行者による署名が必要、
ローカルで作成したスクリプトは署名なしで実行可能
Set-ExecutionPolicy RemoteSigned
“`
RemoteSigned
は、インターネットからダウンロードしたスクリプトに対しては署名を要求しますが、自分で作成したローカルのスクリプトは署名なしで実行できるため、比較的安全かつ開発しやすい設定です。
Set-ExecutionPolicy
は管理者権限が必要な場合があります。実行ポリシーを変更する際は、その影響を理解し、セキュリティリスクを考慮して慎重に行ってください。変更後は、元のポリシーに戻すことを検討しましょう。
“`powershell
ポリシーを Restricted に戻す
Set-ExecutionPolicy Restricted
“`
6.3 コメントアウト
スクリプト内に説明やメモを記述したい場合は、コメントアウトを使用します。#
記号を行の先頭またはコマンドの後に記述すると、その行の \#
より後ろの部分はスクリプトの実行時に無視されます。
“`powershell
これは単一行コメントです
Get-Process # このコマンドは実行中のプロセスを取得します
“`
6.4 基本的な構文
PowerShellスクリプトを構成する基本的な要素について説明します。
6.4.1 変数
前述したように、変数は $
記号で始まります。データを代入したり、コマンドの出力を保持したりします。
powershell
$filePath = "C:\temp\mydata.txt"
$content = Get-Content $filePath
6.4.2 データ型
PowerShellは様々なデータ型を扱えます。主なものに以下があります。
- 文字列 (String):
"Hello"
や'World'
のように引用符で囲まれたテキスト。 - 整数 (Int):
123
,-45
のような小数点を含まない数値。 - 浮動小数点数 (Double):
3.14
,-0.5
のような小数点を含む数値。 - ブール値 (Boolean):
$true
または$false
。条件判断などで使われます。 - 配列 (Array): 複数の値を順番に格納したもの。
@(1, 2, 3)
や$("a", "b", "c")
。 - ハッシュテーブル (Hashtable): キーと値のペアの集まり。
@{Name="Alice"; Age=30}
。 - オブジェクト (Object): コマンドレットの出力など。
変数に代入する際にデータ型を明示的に指定することもできます(キャストと呼ばれます)。
powershell
[int]$count = "100" # 文字列 "100" を整数型に変換して代入
6.4.3 演算子
- 算術演算子:
+
,-
,*
,/
,%
(剰余) - 比較演算子:
-eq
(等しい)-ne
(等しくない)-gt
(より大きい)-ge
(より大きいか等しい)-lt
(より小さい)-le
(より小さいか等しい)-like
(ワイルドカードパターン一致)-match
(正規表現一致)-contains
(配列が特定の要素を含むか)-in
(要素が特定の配列に含まれるか)
- 論理演算子:
-and
(かつ)-or
(または)-not
または!
(否定)
6.4.4 制御フロー
スクリプトの実行の流れを制御するための構文です。
-
条件分岐:
If
,ElseIf
,Else
指定した条件に基づいて、実行するコードブロックを切り替えます。
“`powershell
$num = 10if ($num -gt 0) {
Write-Host “Number is positive.”
} elseif ($num -lt 0) {
Write-Host “Number is negative.”
} else {
Write-Host “Number is zero.”
}
“` -
繰り返し (ループ):
For
,ForEach
,While
,Do/While
,Do/Until
同じ処理を繰り返し実行します。-
ForEach
: 配列やコレクションの各要素に対して処理を行います。パイプラインのForEach-Object
とは異なりますが、機能的に似ています。スクリプト内では通常こちらを使います。
“`powershell
$files = Get-ChildItem C:\tempforeach ($file in $files) {
Write-Host “File: $($file.Name), Size: $($file.Length) bytes”
}
``
Get-ChildItem C:\temp | ForEach-Object { Write-Host “File: $($.Name), Size: $($.Length) bytes” }` と書くこともできます。)
(パイプラインを使うと -
For
: カウンターを使って指定回数繰り返します。
powershell
for ($i = 1; $i -le 5; $i++) {
Write-Host "Count: $i"
} -
While
: 条件が真である限り繰り返します。
powershell
$i = 0
while ($i -lt 3) {
Write-Host "Loop $i"
$i++
}
-
-
Switch
: 一つの値に対して複数の可能な値と比較し、一致した値に対応するコードブロックを実行します。
“`powershell
$choice = “A”switch ($choice) {
“A” { Write-Host “Selected A” }
“B” { Write-Host “Selected B” }
default { Write-Host “Invalid choice” }
}
“`
6.4.5 関数 (function
)
繰り返し使う処理をまとめて「関数」として定義できます。関数は名前を付けて呼び出すことができます。
“`powershell
簡単な関数定義
function Say-Hello {
Write-Host “Hello from function!”
}
関数呼び出し
Say-Hello
パラメータを持つ関数
function Get-Greeting {
param(
[string]$Name = “Guest” # パラメータ定義と既定値
)
Write-Host “Hello, $Name!”
}
パラメータを指定して関数呼び出し
Get-Greeting -Name “PowerShell User”
Get-Greeting # 既定値が使われる
``
param()` ブロックで関数が受け付けるパラメータを定義できます。データ型を指定したり、既定値を設定したりすることも可能です。
6.4.6 エラーハンドリング (Try/Catch/Finally
)
スクリプトの実行中に発生する可能性のあるエラーを適切に処理するための構文です。
Try
: エラーが発生する可能性のあるコードを記述します。Catch
:Try
ブロック内でエラーが発生した場合に実行されるコードを記述します。Finally
:Try
またはCatch
ブロックの後に、エラーの有無にかかわらず必ず実行されるコードを記述します(省略可能)。
“`powershell
try {
# 存在しないファイルを削除しようとする(エラーが発生する)
Remove-Item C:\nonexistent_file.txt -ErrorAction Stop # エラー発生時にスクリプトを停止させる
# この行はエラー発生時には実行されない
Write-Host "File removed successfully."
} catch {
# エラーが発生した場合に実行される
Write-Host “An error occurred: $($.Exception.Message)” # エラーメッセージを表示
} finally {
# エラーの有無にかかわらず常に実行される
Write-Host “Cleanup or final actions here.”
}
``
Remove-Itemコマンドレットに
-ErrorAction Stopをつけることで、通常はエラーを無視して続行するPowerShellの既定の挙動を変更し、エラー発生時にスクリプトを停止させ、
Catchブロックへ処理を移すようにしています。
$は、
Catch` ブロック内で直前に発生したエラーオブジェクトを表します。
6.5 ユーザー入力の取得: Read-Host
スクリプトの実行中にユーザーに情報を入力させたい場合は、Read-Host
コマンドレットを使用します。
powershell
$userName = Read-Host "Please enter your name"
Write-Host "Hello, $userName!"
6.6 出力の操作
スクリプトの実行結果を画面に表示したり、ファイルに保存したりする方法です。
Write-Host
: コンソールに直接テキストを表示します。主にメッセージや色付きのテキスト表示に使われます。Write-Output
: オブジェクトをパイプラインに出力します。通常、スクリプトの実行結果として他のコマンドレットやファイルへのリダイレクトに使われます。Write-Output
で出力されたオブジェクトは、既定ではOut-Host
によって画面に表示されます。特別な理由がなければ、メッセージ表示にはWrite-Host
、スクリプトの主要な結果の出力にはWrite-Output
(または何もつけない)を使うのが一般的です。-
Out-File
: パイプラインから渡されたオブジェクトをファイルに書き込みます。“`powershell
ファイル一覧を取得し、結果をテキストファイルに保存
Get-ChildItem C:\temp | Out-File C:\temp\filelist.txt
ファイルに追記する場合
Get-Process | Out-File C:\temp\processlist.txt -Append
``
-Append` パラメータを指定すると、既存のファイルに追記されます。既定ではファイルを上書きします。 -
Add-Content
: 指定したファイルに内容を追加します。“`powershell
ファイルの末尾に一行追加
Add-Content C:\temp\mylog.txt “Script executed at $(Get-Date)”
“`
6.7 モジュール
PowerShellの機能は、「モジュール」という単位で整理されています。モジュールには、関連するコマンドレット、関数、ワークフロー、変数などが含まれています。多くのコマンドレットは、OSに標準で付属するモジュール(例: Microsoft.PowerShell.Management
, Microsoft.PowerShell.Utility
)に含まれています。
特定のタスク(例: Active Directory管理、Azure管理、Microsoft 365管理)を行うためには、専用のモジュールをインストールして読み込む必要があります。
- インストールされているモジュールを確認する:
Get-Module -ListAvailable
- 現在読み込まれているモジュールを確認する:
Get-Module
- モジュールをインストールする(管理者権限が必要):
Install-Module ModuleName
(PowerShell Galleryからダウンロード) - モジュールを読み込む:
Import-Module ModuleName
(通常、モジュール内のコマンドレットを実行しようとすると自動的に読み込まれます)
例えば、Active Directoryを管理するためのコマンドレットを使いたい場合は、ActiveDirectory
モジュールをインストールして読み込みます(通常、RSAT (Remote Server Administration Tools) をインストールすることで利用可能になります)。
“`powershell
ActiveDirectory モジュールを読み込む
Import-Module ActiveDirectory
ユーザー一覧を取得するコマンドレットが使えるようになる
Get-ADUser -Filter *
“`
モジュールを利用することで、PowerShellの機能を無限に拡張していくことができます。
第7章 PowerShellの応用例
PowerShellの基本的な操作とスクリプトの書き方を学んだら、様々な応用が可能になります。
- システム管理の自動化: ユーザーアカウントの作成/削除、ソフトウェアのインストール/アンインストール、サービスの起動/停止、イベントログの収集と分析、ネットワーク設定の変更などをスクリプト化できます。
- 日常業務の効率化: 複数のファイルをまとめてリネームしたり、特定の条件を満たすファイルを検索して移動/コピーしたり、レポートファイルを自動生成したりといった定型作業を自動化できます。
- Active Directory管理: Active Directoryのユーザー、グループ、コンピュータなどをコマンドレットで効率的に管理できます。
- クラウドサービス管理: AzureやAWS、Microsoft 365などのクラウドサービスは、それぞれPowerShellモジュールを提供しており、PowerShellからこれらのサービスを自動的にプロビジョニング、管理できます。
- レジストリ操作: Windowsのレジストリをコマンドレット(例:
Get-ChildItem Registry::HKEY_CURRENT_USER
,Set-ItemProperty
)で操作できます。 - タスクスケジューラとの連携: 作成したPowerShellスクリプトをWindowsのタスクスケジューラに登録すれば、指定した時間に自動的に実行させることができます。
これらの応用例はほんの一部ですが、PowerShellを使えば、GUIでの手作業では考えられないような効率で、様々なタスクを自動化・管理できるようになります。
第8章 学習リソース
PowerShellは非常に奥深く、ここで解説した内容はごく基本的な部分に過ぎません。さらに学習を進めるためのリソースを紹介します。
- PowerShell 公式ドキュメント: Microsoft Docsには、PowerShellのコマンドレットリファレンス、概念解説、チュートリアルなどが豊富に用意されています。最も信頼できる情報源です。(https://docs.microsoft.com/ja-jp/powershell/)
- Microsoft Learn: PowerShellを含むマイクロソフト製品について、インタラクティブな形式で学べる無料のオンライン学習プラットフォームです。(https://learn.microsoft.com/ja-jp/training/powersehll)
- 書籍: PowerShellに関する入門書から応用書まで、様々な書籍が出版されています。自分のレベルや目的に合ったものを選んでみましょう。
- PowerShell Gallery: PowerShellのモジュールやスクリプトが公開されている公式リポジトリです。ここで便利なモジュールを探したり、自分の作成したスクリプトを共有したりできます。(https://www.powershellgallery.com/)
- コミュニティ: PowerShellに関するオンラインフォーラムやSNSグループに参加して、他のユーザーと情報交換したり、質問したりすることも有効な学習方法です。
まとめ:PowerShell学習の次のステップ
この記事では、PowerShellとは何かという基本的な概念から、インストール、起動、基本的なコマンドレットの使い方、そしてオブジェクト指向、パイプライン、スクリプトといったPowerShellの強力な機能を「ゼロから始める」方に向けて徹底的に解説しました。
PowerShellは、Windows環境におけるシステム管理やタスク自動化の強力なツールです。最初はコマンドラインに慣れないかもしれませんが、この記事で学んだ基本的な概念とコマンドを繰り返し使ってみることで、徐々にその便利さと強力さを実感できるはずです。
次のステップとして、以下のことに挑戦してみましょう。
- 実際にPowerShellプロンプトを開き、この記事で紹介した基本的なコマンドレット(
Get-Location
,Set-Location
,Get-ChildItem
,Get-Process
,Get-Service
など)を繰り返し実行して感覚をつかむ。 Get-Help
コマンドレットを使って、興味のあるコマンドレットの情報を調べてみる。特に-Examples
オプションで使い方を確認する。Get-Process | Get-Member
やGet-ChildItem | Get-Member
を実行して、オブジェクトがどのようなプロパティを持っているか確認し、オブジェクト指向の感覚を掴む。- パイプラインを使って、
Get-Process | Where-Object { ... } | Select-Object { ... }
のような複合的なコマンドを試してみる。 - 簡単なスクリプト(例えば、特定のディレクトリのファイル数を数える、特定のサービスの起動状態を確認するなど)を作成し、
.ps1
ファイルとして保存して実行してみる。必要であれば実行ポリシーを変更する。 - Microsoft LearnのPowerShellに関する無料コースを試してみる。
PowerShellの学習は、自転車の乗り方と似ています。最初はバランスを取るのが難しく感じるかもしれませんが、一度コツを掴み、実際に乗り始めると、行動範囲が大きく広がります。
PowerShellを使いこなすことで、あなたのITスキルは確実に向上し、日々の作業がより効率的で自動化されたものになるでしょう。諦めずに、一歩ずつ学習を進めていってください。
PowerShellの世界は広大ですが、この記事があなたの素晴らしい旅の出発点となれば幸いです。
頑張ってください!