第2章: PowerShellの基礎 ~ コマンドラインの基本操作
1. この章で解説する主要な技術・概念(箇条書き)
- PowerShellインストールとセットアップ(Server Core/GUI環境での手順)
- Windows Serverでの標準搭載状況とバージョン確認方法
- 追加でPowerShell 7.xを導入する場合の注意点
- 基本的なコマンドレット構造と命名規則
- 「動詞-名詞」形式のメリット
- 別名(エイリアス)との使い分け
- ヘルプシステムの活用とアップデート
Get-Help
コマンド、Update-Help
の詳細.SYNOPSIS
や.DESCRIPTION
など、スクリプト内部でのヘルプコメントの書き方
- パイプラインとオブジェクト指向の概念
- オブジェクト同士を連鎖して処理するメリット
$_.
(パイプライン変数)とメンバーの理解
- 基本コマンドの実行とパラメータ指定
- Positionalパラメータ、Namedパラメータの違い
- 代表的なコマンドとオプション例(
Get-Process
、Get-Service
、Get-ChildItem
など)
- スクリプトの実行ポリシーとセキュリティ
Get-ExecutionPolicy
/Set-ExecutionPolicy
の概要- リモートスクリプトの取り扱い、署名付きスクリプトの考え方
2. PowerShellのインストールとセットアップ
2-1. 標準搭載されるPowerShellのバージョン
- Windows Server 2022 では、Windows PowerShell 5.1 が既定でインストール済み。
- 必要に応じてPowerShell 7.x(.NET 6/7ベース)を追加でインストール可能。
- 一部の管理コマンドレット(特に古いモジュール)は、5.1でしか動作しない場合があるため、併用が推奨されるケースも。
# PowerShellのバージョン確認
$PSVersionTable.PSVersion
- 出力例:
Major = 5, Minor = 1, Build = 19041, Revision = 2364
(環境により異なる)
2-2. Server Core/GUI版での違い
- Server Core: ログイン直後にコマンドプロンプトが表示されるため、
powershell
と入力してPowerShellに切り替えるのが基本。 - GUI(Desktop Experience)版: 「スタート」ボタンまたは右クリックメニューから「Windows PowerShell」を選択可能。
- サーバー管理に慣れている場合、Server Coreでも不便は少ないが、最初のうちはGUI版でPowerShellを学ぶほうがとっつきやすい。
3. 基本的なコマンドレット構造と命名規則
3-1. 「動詞-名詞」形式とそのメリット
- PowerShellのCmdletは、「動詞-名詞」 という形で命名される(例:
Get-Process
,Start-Service
)。 - これにより、どのような操作(動詞)をどのオブジェクト(名詞)に対して行うかが直感的に分かりやすい。
- 動詞は公式に推奨されるもの(
Get
,Set
,New
,Remove
,Test
など)があり、開発者や運用者が統一した命名をすることで可読性を高める。
3-2. エイリアス(Alias)との使い分け
- エイリアス(Alias)とは、Cmdlet名を短縮した別名。
- 例:
Get-ChildItem
→dir
orls
ForEach-Object
→%
- 初学者はエイリアスを多用すると正規のCmdlet名を覚えにくくなるデメリットもあるため、まずは正規名を習得するのがベター。
- エイリアスは対話的にコマンドを打つ際の省力に役立つが、スクリプトには正規Cmdlet名を使うことで可読性と保守性が高まる。
4. ヘルプシステムの活用とアップデート
4-1. Get-HelpとUpdate-Helpの詳細
Get-Help Get-Service
- Cmdletや関数の説明、シンタックス、パラメータ一覧を表示する。
-Examples
を付けると、具体例のみ表示するモードになる(例:Get-Help Get-Service -Examples
)。
Update-Help
- オフライン環境だと失敗する場合があるため、インターネット接続が必要。
- 指定言語のヘルプファイルをダウンロードし、ローカルにキャッシュしてくれる。
4-2. スクリプトへのヘルプコメントの書き方
- スクリプト冒頭や関数の直前に、下記のようにコメントを記述すると、
Get-Help
でスクリプト独自のヘルプを参照できる。
<#
.SYNOPSIS
This script demonstrates advanced help comment usage.
.DESCRIPTION
A more detailed description of what the script does.
.PARAMETER Name
Explanation of the 'Name' parameter.
.EXAMPLE
.\MyScript.ps1 -Name "Demo"
#>
param(
[string]$Name
)
- こうすることで、ユーザーが
Get-Help .\MyScript.ps1 -Full
と打った時、詳細な情報を取得可能となる。
5. パイプラインとオブジェクト指向の概念
5-1. パイプライン(|)の仕組み
- パイプライン演算子
|
は、左側コマンドの出力を右側コマンドの入力として渡す。 - UNIX系シェルと異なり、文字列ではなくオブジェクトを伝搬するのが大きな特徴。
- 例:
Get-Process | Where-Object { $_.CPU -gt 100 }
Get-Process
の出力(一連のProcessオブジェクト)を受け取り、.CPU
プロパティが100以上のものだけをフィルタする。
5-2. パイプライン変数 $_ とメンバーの操作
$_
は「パイプラインで渡される現在のオブジェクト」を表す特別変数。- メンバーを確認するには、
Get-Process | Get-Member
を実行し、どんなプロパティやメソッドがあるかチェック可能。
Get-Process | Get-Member
- 結果:CPU, WorkingSet, StartTime など、Processオブジェクトが持つ様々な情報が列挙される。
- これらのメンバーを使って条件分岐や出力成形を行う。
6. 基本コマンドの実行とパラメータ指定
6-1. 代表的なコマンド例
Get-ChildItem
: ディレクトリ一覧を取得- Linuxの
ls
やWindowsのdir
に相当 -Recurse
オプションで再帰的に取得
- Linuxの
Get-Service
: 現在のサービス情報を一覧表示| Where-Object Status -eq "Running"
などで絞り込み可能
Get-Process
: 実行中のプロセス一覧-Name
パラメータで特定のプロセスだけを対象にする
6-2. PositionalパラメータとNamedパラメータ
- Positionalパラメータ: パラメータ名を省略できる(順番に指定する)
- 例:
Get-Process notepad
は-Name
を省略している
- 例:
- Namedパラメータ:
-Name "notepad"
のように明示的に書く- 大規模スクリプトではNamedパラメータが可読性を高める。
Get-Help Get-Process -Full
などでパラメータのPosition情報が確認可能。
7. スクリプトの実行ポリシーとセキュリティ
7-1. 実行ポリシーの種類
- Restricted: スクリプトの実行が禁止される(インタラクティブなコマンドだけOK)
- RemoteSigned: ダウンロードしたスクリプトは署名付きでないと実行不可。ローカル作成スクリプトはOK
- AllSigned: すべてのスクリプトが署名必須
- Unrestricted: 全スクリプト実行可(実行時に警告メッセージが表示される場合あり)
Get-ExecutionPolicy
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
-Scope CurrentUser
を付けると現在のユーザーだけ対象となり、システム全体への影響を抑えられる。
7-2. リモートスクリプトの扱いと署名
- インターネットやファイルサーバー経由で取得した
.ps1
ファイルは、Zone.Identifier属性により「外部から来たファイル」として認識される。 RemoteSigned
ポリシー下では、署名なしの外部スクリプトを実行しようとするとエラーが出る。- 例: “File xxxx.ps1 cannot be loaded because the execution of scripts is disabled on this system”
- セキュアな運用を意識するなら、自己署名または企業CA署名を行い、スクリプト改ざんを検出できるようにすることが望ましい。
8. ハンズオン:PowerShellスクリプトの作成と実行
以下は、1章でも少し触れたスクリプト例を、より実務的な形に拡張したサンプルです。
8-1. サンプルスクリプト: サービス状態の自動チェックと再起動
<#
.SYNOPSIS
定期実行を前提としたサービス監視スクリプト
.DESCRIPTION
指定したサービスが停止している場合に自動再起動を試みるサンプル。
.PARAMETER ServiceName
監視対象のサービス名(内部名)を指定する。
.EXAMPLE
.\CheckService.ps1 -ServiceName "wuauserv"
Windows Updateサービスが停止状態なら再起動を試みる。
#>
param(
[Parameter(Mandatory = $true)]
[string]$ServiceName
)
$service = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
if ($null -eq $service) {
Write-Host "Service '$ServiceName' not found on this system."
return
}
Write-Host "Service Name:" $service.Name
Write-Host "Status:" $service.Status
if ($service.Status -eq "Stopped") {
Write-Host "Trying to start $ServiceName..."
Start-Service -Name $ServiceName
Start-Sleep -Seconds 3
# 状態を再確認
$updated = Get-Service -Name $ServiceName
if ($updated.Status -eq "Running") {
Write-Host "Service started successfully."
} else {
Write-Host "Failed to start the service."
}
} else {
Write-Host "Service is already running."
}
8-2. 実行手順
- スクリプトを「
CheckService.ps1
」として保存 - PowerShellを開き、
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
(必要に応じて) .\CheckService.ps1 -ServiceName "wuauserv"
- 出力を確認し、サービスが停止中なら自動再起動を試みる。
9. 章末まとめと次章へのつながり
9-1. 学習のまとめ
- PowerShellのインストールとセットアップでは、Windows Server標準(5.1)とPowerShell 7.xの共存・使い分けについて紹介し、GUI/Server Coreでの起動方法を把握しました。
- コマンドレット構造と命名規則(動詞-名詞形式)を学び、正規のCmdlet名とエイリアスの使い分けで混乱を防ぐ重要性を確認。
- ヘルプシステム(
Get-Help
/Update-Help
)によってCmdletの詳細を迅速に調べられる点、スクリプト内部にヘルプコメントを挿入する書き方などを学習しました。 - パイプラインやオブジェクト指向の概念によって、PowerShellが他のシェルとは異なる設計思想を持つことを再確認し、
$_
変数やGet-Member
を用いたオブジェクト解析の基礎を押さえました。 - 実行ポリシーとセキュリティ面では、
RemoteSigned
などのレベルごとの違いを理解し、リモートファイルの扱いや署名付きスクリプトの意義を学びました。 - 簡単なサービス監視スクリプトをハンズオンで試し、パラメータ指定やPowerShell特有のエラーハンドリングを体験しました。
9-2. 次章へのつながり
- 次章(第3章)では、Windows Server 2022の手動インストール手順にフォーカスし、インストールメディア作成・ブート設定・Server Core/GUI版の選択などを具体的に解説します。
- ここで学んだPowerShellの基礎を応用し、インストール後の初期設定やトラブルシュートにもスクリプトを活用できるようになります。
- 今後の章では、ユーザー管理やグループポリシー、ネットワーク設定など、Windows Server特有の管理機能をPowerShellで自動化する方法を段階的に学んでいきましょう。