pwsh (PowerShell) を使いこなそう!基本から応用まで徹底解説

はじめに:pwshって何?

pwshは、PowerShellの実行可能ファイル名です。PowerShellは、Microsoftによって開発された、強力なコマンドラインシェルであり、スクリプト言語でもあります。もともとはWindows向けに開発されましたが、PowerShell 6.0以降 (旧称: PowerShell Core) はオープンソース化され、Windowsだけでなく、macOSやLinuxでも動作するクロスプラットフォームなツールへと進化しました。

従来のWindowsに標準搭載されていた「Windows PowerShell」(実行ファイル名: `powershell.exe`) と区別するため、クロスプラットフォーム版の実行ファイル名は `pwsh.exe` (Windows) または `pwsh` (macOS/Linux) となっています。

pwsh (PowerShell) の主な特徴は以下の通りです。

  • クロスプラットフォーム: Windows, macOS, Linux で動作します。
  • オブジェクト指向: コマンドの出力がテキストではなく、構造化されたオブジェクトであるため、パイプライン (`|`) でデータを渡しやすく、柔軟な処理が可能です。
  • .NETベース: 最新版は.NETプラットフォーム上で動作し、豊富な機能を利用できます。
  • コマンドレット (Cmdlet): 「動詞-名詞」形式 (例: `Get-Process`, `Set-Location`) の分かりやすいコマンド体系を持っています。
  • スクリプティング: 高度なスクリプトを作成し、システム管理や定型作業の自動化を実現できます。
  • オープンソース: GitHubで開発が進められており、コミュニティによる貢献も活発です。

pwshのインストール

pwsh (PowerShell 7以降) は、Windowsに標準では搭載されていないため、別途インストールが必要です(Windows PowerShell 5.1は標準搭載)。macOSやLinuxでも利用するにはインストールが必要です。

Windowsへのインストール

いくつかの方法があります。

  • Winget (推奨): Windows 10/11 のパッケージマネージャー Winget を使うのが簡単です。管理者権限でターミナルを開き、以下のコマンドを実行します。
    winget search Microsoft.PowerShell
    winget install --id Microsoft.Powershell --source winget
  • MSIインストーラー: Microsoftの公式ドキュメントやGitHubリリースページからMSIファイルをダウンロードしてインストールします。GUIでオプションを選択しながらインストールできます。
  • Microsoft Store: Microsoft Storeからもインストール可能ですが、一部制限がある場合があります。手軽に試したい場合に便利です。
  • ZIPパッケージ: 特定のフォルダに展開するだけで利用できますが、パス設定などを手動で行う必要があります。
  • .NET グローバルツール: .NET SDKがインストールされていれば、以下のコマンドでインストールできます。
    dotnet tool install --global PowerShell

macOSへのインストール

Homebrewを使うのが一般的です。

# Homebrew が未インストールの場合
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# PowerShell のインストール
brew install --cask powershell

インストール後、ターミナルで `pwsh` と入力して起動できます。

Linuxへのインストール

ディストリビューションによって方法が異なります。多くの場合、パッケージマネージャー (apt, yumなど) を利用できます。

Ubuntu/Debian系の例 (apt):

# Microsoftリポジトリのキーとソースを追加 (初回のみ)
sudo apt-get update
sudo apt-get install -y wget apt-transport-https software-properties-common
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update

# PowerShell のインストール
sudo apt-get install -y powershell

CentOS/RHEL系の例 (yum/dnf):

# Microsoftリポジトリを追加 (初回のみ)
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl=https://packages.microsoft.com/rhel/7/prod/\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/microsoft.repo' # RHEL 7 の例。バージョンに合わせて変更
sudo yum update # または dnf update

# PowerShell のインストール
sudo yum install -y powershell # または dnf install -y powershell

各ディストリビューションの最新のインストール方法は公式ドキュメントを確認してください。

基本的な使い方

pwshを起動するには、ターミナル (Windows Terminal, コマンドプロンプト, Terminal.app, etc.) を開き、`pwsh` と入力してEnterキーを押します。

コマンドレット (Cmdlet)

PowerShellの基本的なコマンドは「コマンドレット」と呼ばれ、「動詞-名詞」の形式になっています。

# ヘルプを表示 (manコマンドのようなもの)
Get-Help Get-Process

# 利用可能なコマンドを検索
Get-Command *Process*

# 実行中のプロセス一覧を取得
Get-Process

# 現在の場所 (ディレクトリ) を取得
Get-Location

# ディレクトリを移動 (cd と同じ)
Set-Location C:\Users

# ファイルやフォルダの一覧を表示 (ls や dir と同じ)
Get-ChildItem

# 画面に文字列を出力
Write-Host "こんにちは、PowerShell!" -ForegroundColor Yellow

多くのコマンドレットにはエイリアス (短縮形) が用意されています。例えば `Get-ChildItem` のエイリアスは `ls`, `dir`, `gci` などです。エイリアスは `Get-Alias` で確認できますが、スクリプト内では可読性のため、完全なコマンドレット名を使うことが推奨されます。

パイプライン (`|`)

PowerShellの強力な機能の一つがパイプラインです。コマンドレットの出力を別のコマンドレットの入力として渡すことができます。PowerShellではテキストではなくオブジェクトがパイプラインを流れるため、柔軟な処理が可能です。

# プロセス一覧を取得し、CPU使用率が高い順にソートして上位5件を表示
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5

# カレントディレクトリのファイル一覧から、名前が ".log" で終わるものだけを選択
Get-ChildItem | Where-Object {$_.Name -like "*.log"}

# サービス一覧を取得し、実行中のものだけをCSVファイルに出力
Get-Service | Where-Object {$_.Status -eq "Running"} | Export-Csv -Path ./running_services.csv -NoTypeInformation

変数

変数は `$` で始まり、値を格納するために使います。

$userName = "Taro"
$age = 30
$message = "私の名前は $userName で、年齢は $age 歳です。"
Write-Host $message

# コマンドの結果を変数に格納
$processes = Get-Process
Write-Host "現在、$($processes.Count) 個のプロセスが実行中です。"

演算子

比較演算子や論理演算子などがあります。多くは `-` で始まります。

演算子意味
-eq等しい (Equal)`$a -eq 10`
-ne等しくない (Not Equal)`$name -ne “admin”`
-gtより大きい (Greater Than)`$count -gt 100`
-ge以上 (Greater than or Equal)`$score -ge 60`
-ltより小さい (Less Than)`$index -lt 0`
-le以下 (Less than or Equal)`$value -le 1000`
-likeワイルドカード比較`$filename -like “*.txt”`
-notlikeワイルドカード否定比較`$path -notlike “*System*”`
-match正規表現比較`$email -match “@example\.com$”`
-notmatch正規表現否定比較`$input -notmatch “^\d+$”`
-containsコレクションに含まれるか`$array -contains “apple”`
-notcontainsコレクションに含まれないか`$list -notcontains “error”`
-and論理 AND`($age -ge 20) -and ($hasLicense -eq $true)`
-or論理 OR`($status -eq “Stopped”) -or ($status -eq “Stopping”)`
-not / !論理 NOT`-not ($isAdmin)`

制御構文

スクリプトの流れを制御するための構文です。

# if / elseif / else
$score = 75
if ($score -ge 80) {
    Write-Host "優"
} elseif ($score -ge 60) {
    Write-Host "良"
} else {
    Write-Host "可"
}

# foreach (コレクションのループ)
$fruits = "apple", "banana", "cherry"
foreach ($fruit in $fruits) {
    Write-Host "I like $fruit"
}

# ForEach-Object (パイプラインでのループ)
Get-Process | ForEach-Object {
    Write-Host "プロセス名: $($_.Name), ID: $($_.Id)"
}

# for (カウンタ変数を使ったループ)
for ($i = 0; $i -lt 5; $i++) {
    Write-Host "カウント: $i"
}

# while (条件が真の間ループ)
$count = 0
while ($count -lt 3) {
    Write-Host "whileループ: $count"
    $count++
}

# switch (値による分岐)
$day = (Get-Date).DayOfWeek
switch ($day) {
    "Monday" { Write-Host "月曜日です" }
    "Tuesday" { Write-Host "火曜日です" }
    # ... 他の曜日 ...
    Default { Write-Host "週末です!" }
}

スクリプティング

一連のPowerShellコマンドをファイルに保存し、再利用可能なスクリプトを作成できます。スクリプトファイルの拡張子は `.ps1` です。

スクリプトの作成と実行

  1. テキストエディタ (VS Code, メモ帳など) を開き、PowerShellコマンドを記述します。
  2. ファイルを `.ps1` 拡張子で保存します (例: `MyScript.ps1`)。文字コードはUTF-8 (BOM付きまたはBOMなし) が推奨されます。
  3. PowerShellコンソールを開き、スクリプトファイルを実行します。セキュリティのため、デフォルトではスクリプトの実行が制限されている場合があります。
    # スクリプトの実行 (カレントディレクトリにある場合)
    .\MyScript.ps1
    
    # フルパスで指定して実行
    C:\Scripts\MyScript.ps1

実行ポリシー (Execution Policy)

PowerShellには、悪意のあるスクリプトからシステムを保護するための実行ポリシーがあります。デフォルトでは `Restricted` (スクリプト実行不可) または `RemoteSigned` (ローカルのスクリプトは実行可、ダウンロードしたスクリプトは署名が必要) になっていることが多いです。

# 現在の実行ポリシーを確認
Get-ExecutionPolicy

# 実行ポリシーを変更 (管理者権限が必要)
# RemoteSigned: ローカルスクリプトは許可、ネットからのは署名必要
Set-ExecutionPolicy RemoteSigned

# AllSigned: 署名されたスクリプトのみ許可
# Set-ExecutionPolicy AllSigned

# Unrestricted: 全てのスクリプトを許可 (非推奨)
# Set-ExecutionPolicy Unrestricted

# Bypass: 何もブロックせず警告も表示しない (一時的な実行に)
# Set-ExecutionPolicy Bypass -Scope Process # 現在のプロセスのみ一時的に変更

# デフォルトに戻す
# Set-ExecutionPolicy Default

実行ポリシーの変更はシステムのセキュリティに影響します。安易に `Unrestricted` に設定せず、リスクを理解した上で適切なポリシーを選択してください。`RemoteSigned` が一般的に推奨されます。

関数 (Function)

処理をまとめて再利用可能な関数を作成できます。

function Show-Greeting {
    param(
        [Parameter(Mandatory=$true)]
        [string]$Name,

        [string]$Greeting = "こんにちは"
    )
    Write-Host "$Greeting, $Name さん!"
}

# 関数の呼び出し
Show-Greeting -Name "佐藤"
Show-Greeting -Name "Suzuki" -Greeting "Hello"

エラーハンドリング (Try/Catch/Finally)

エラーが発生する可能性のある処理を囲み、適切に処理します。

try {
    # エラーが発生する可能性のある処理
    $content = Get-Content -Path C:\non_existent_file.txt -ErrorAction Stop
    Write-Host "ファイルの内容: $content"
} catch [System.Management.Automation.ItemNotFoundException] {
    Write-Warning "指定されたファイルが見つかりませんでした: $($_.Exception.Message)"
} catch {
    # その他のエラー
    Write-Error "予期せぬエラーが発生しました: $($_.Exception.Message)"
} finally {
    # エラーの有無に関わらず常に実行される処理
    Write-Host "処理を終了します。"
}

`-ErrorAction Stop` をつけると、通常は処理を続行するエラー (Non-Terminating Error) でもスクリプトを停止させ、`catch` ブロックで捕捉できるようになります。

モジュール

モジュールは、関連するコマンドレット、関数、変数などをまとめたパッケージです。モジュールを利用することで、PowerShellの機能を拡張できます。多くの製品やサービス (Azure, Microsoft 365, Active Directoryなど) が、管理用のPowerShellモジュールを提供しています。

モジュールの検索とインストール

PowerShell Gallery という公式リポジトリからモジュールを検索し、インストールできます。

# モジュールを検索 (例: Azure関連)
Find-Module -Name Az.*

# 特定のモジュールをインストール (管理者権限が必要な場合あり)
# 初回実行時には NuGet プロバイダーのインストールやリポジトリの信頼を求められることがあります
Install-Module -Name Az -Scope CurrentUser # 現在のユーザーのみにインストール (推奨)
# Install-Module -Name PSWindowsUpdate # 全ユーザー向けにインストール (管理者権限が必要)

# インストール済みのモジュール一覧を表示
Get-InstalledModule

モジュールのインポートと使用

PowerShell 3.0以降では、モジュール内のコマンドを初めて使用する際に自動的にインポートされる機能 (Module Auto-Loading) がありますが、明示的にインポートすることも可能です。

# モジュールを明示的にインポート
Import-Module -Name Az

# モジュール内のコマンドを使用
Get-AzVM # (Azモジュールがインポートされている必要がある)

# 特定のモジュールに含まれるコマンドを確認
Get-Command -Module Az

# セッションからモジュールを削除
Remove-Module -Name Az

モジュールの更新とアンインストール

# インストール済みモジュールの更新を確認
Get-InstalledModule | Update-Module -WhatIf

# モジュールを更新 (管理者権限が必要な場合あり)
Update-Module -Name Az

# モジュールをアンインストール (管理者権限が必要な場合あり)
Uninstall-Module -Name Az

自作モジュール

自分で作成した関数などを `.psm1` ファイルにまとめ、特定のフォルダ構造に配置することで、自作モジュールとして利用することもできます。詳細は公式ドキュメントを参照してください。

pwsh vs Windows PowerShell

`pwsh` (PowerShell 7+) と `powershell.exe` (Windows PowerShell 5.1) の主な違いをまとめます。

項目pwsh (PowerShell 7+)Windows PowerShell 5.1
実行ファイル名`pwsh.exe` / `pwsh``powershell.exe`
プラットフォームWindows, macOS, LinuxWindowsのみ
ベース.NET.NET (Core) 6, 7, 8….NET Framework 4.x
開発状況活発に開発中 (オープンソース)開発終了 (セキュリティ修正のみ)
デフォルト搭載なし (別途インストール)Windows 7/Server 2008 R2 以降に標準搭載
互換性高い互換性を持つが、一部非互換あり。.NET Framework依存の古いモジュールは動かない場合がある (`WindowsCompatibility` モジュールで一部対応可)。従来のWindows向け機能との互換性が高い。
主な新機能パフォーマンス向上、新しい演算子やコマンドレット、クロスプラットフォーム対応、SSH経由のリモート処理改善など安定しているが新機能追加はない
PowerShell ISEサポート対象外 (VS Code + PowerShell拡張機能推奨)標準搭載 (開発終了)
どちらを使うべき?
新しい機能、パフォーマンス、クロスプラットフォーム対応が必要な場合は `pwsh` (PowerShell 7+) を積極的に利用しましょう。特に理由がない限り、最新のLTS (長期サポート) バージョンを使うのがおすすめです。
ただし、古いWindows環境や、.NET Frameworkに強く依存する既存のスクリプト・ツールをそのまま動かす必要がある場合は、Windows PowerShell 5.1 が必要になる場面もあります。両者は共存できるため、必要に応じて使い分けることが可能です。

ベストプラクティス

より良いPowerShellスクリプトを書くためのヒントです。

  • コメントを活用する: `#` で始まるコメントを適切に追加し、コードの意図を明確にします。複雑なロジックや前提条件を説明しましょう。
  • 命名規則を守る: 変数名や関数名は、処理内容がわかる具体的で一貫性のある名前をつけます (例: `$targetComputer`, `Get-SystemInfo`)。PascalCaseやcamelCaseが一般的です。
  • エイリアスを避ける: スクリプト内では、`ls` や `cd` のようなエイリアスではなく、`Get-ChildItem` や `Set-Location` のような完全なコマンドレット名を使用し、可読性を高めます。
  • エラーハンドリングを実装する: `try/catch/finally` を使用して、予期せぬエラーでスクリプトが停止しないようにし、問題発生時の原因究明を容易にします。
  • モジュール化を意識する: 繰り返し使う処理は関数化し、関連する関数はモジュール (.psm1) にまとめると、再利用性や保守性が向上します。
  • ハードコーディングを避ける: ファイルパス、サーバー名、認証情報などをスクリプト内に直接書き込まず、パラメータや設定ファイルから読み込むようにします。
  • 冪等性 (Idempotency) を考慮する: スクリプトを何度実行しても同じ結果になるように設計します。例えば、ファイルを作成する前に存在確認を行うなどです。
  • 詳細出力とデバッグ出力を活用する: `Write-Verbose` や `Write-Debug` をスクリプト内に埋め込み、`-Verbose` や `-Debug` スイッチを付けて実行することで、動作状況を確認しやすくします。`Write-Host` は対話的な表示には便利ですが、本番スクリプトのログ出力には向きません。
  • パラメータ検証を行う: 関数のパラメータには `[Parameter(Mandatory=$true)]` や `[ValidateSet(“Option1”, “Option2”)]`, `[ValidateRange(0, 100)]` などの属性を追加し、不正な入力値を早期に検出します。
  • #Requires ステートメントを使用する: スクリプトの先頭で `#Requires -Version 7.2` や `#Requires -Modules Az` のように、必要なPowerShellのバージョンやモジュールを明記します。

コードフォーマットのヒント

  • インデントにはスペース4つを使うのが一般的です。
  • 1行の長さを適切に保ち、読みやすさを維持します (例えば80~120文字程度)。
  • 演算子の前後やカンマの後にはスペースを入れます。
  • 括弧 `{}` のスタイルを一貫させます (例: One True Brace Style)。
  • Visual Studio Code などのエディタと PowerShell拡張機能 を使うと、フォーマットや構文チェックが自動で行われ便利です。

まとめ

pwsh (PowerShell) は、WindowsだけでなくmacOSやLinuxでも利用できる、非常に強力で柔軟なコマンドラインシェルおよびスクリプト言語です。オブジェクト指向のパイプラインや豊富なコマンドレット、.NETの機能を利用できる点が大きな特徴です。

基本的なコマンド操作から、複雑なシステム管理タスクの自動化まで、幅広い用途に活用できます。ぜひ積極的に `pwsh` をインストールし、日々の作業効率化に役立ててみてください!

参考情報

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です