PowerShell入門:Windows、Linux、macOSで使える強力なツールの徹底解説

はじめに:PowerShellとは?

PowerShell(パワーシェル)は、Microsoftによって開発された、コマンドラインシェル(CLI)およびスクリプト言語です。元々はWindows向けに開発されましたが、現在ではクロスプラットフォームに対応し、Windows、Linux、macOS上で動作します。

従来のコマンドプロンプト(cmd.exe)やUnix系のシェル(Bashなど)と比較して、PowerShellには以下のような大きな特徴があります。

  • オブジェクト指向: PowerShellはテキストではなく、.NETオブジェクトを扱います。これにより、コマンド(コマンドレット)間で構造化されたデータを簡単に受け渡し、操作できます。パイプライン(`|`)で繋がれたコマンドレットは、単なる文字列ではなく、豊富な情報を持つオブジェクトをやり取りします。
  • コマンドレット (Cmdlet): 「動詞-名詞」形式(例: `Get-Process`, `Set-Location`)の専用コマンドが多数用意されており、直感的で一貫性のある操作が可能です。
  • スクリプト言語: 高度なスクリプト機能(変数、制御構文、関数、エラーハンドリングなど)を備え、複雑なタスクの自動化やシステム管理を効率化できます。
  • 拡張性: モジュール機構により、機能を追加・拡張できます。Microsoftの各種サービス(Azure, Microsoft 365など)やAWSなどを操作するための公式・サードパーティ製モジュールが多数存在します。

PowerShell Core(バージョン6以降)はオープンソース化され、.NET Core(現 .NET)上で動作します。これにより、Windows以外のプラットフォームでも利用できるようになりました。(2018年1月にPowerShell Core 6.0がリリースされ、Windows、macOS、Linuxでの動作が可能になりました)。Windowsに標準搭載されているのはWindows PowerShell(バージョン5.1以前)ですが、最新の機能を利用するにはPowerShell 7以降のインストールが推奨されます。

このブログでは、PowerShellの基本的な使い方から、便利なコマンドレット、スクリプトの書き方、そして実践的な活用例まで、幅広く解説していきます。初心者の方でも理解しやすいように、具体的なコード例を交えながら進めていきますので、ぜひ最後までお付き合いください!

PowerShellを使ってみよう!基本操作編

PowerShellを起動する方法はいくつかあります。

  • Windows:
    • スタートメニューで「PowerShell」と検索し、「Windows PowerShell」または「PowerShell 7」(インストールしている場合)を選択します。
    • [Windowsキー] + [R] で「ファイル名を指定して実行」を開き、「powershell」と入力してEnterキーを押します。
    • 管理者権限が必要な場合は、アイコンを右クリックして「管理者として実行」を選択します。(一部のコマンドレットは管理者権限がないと実行できません)
  • macOS / Linux: ターミナルを開き、「`pwsh`」と入力してEnterキーを押します。(事前にインストールが必要です)

起動すると、以下のようなプロンプトが表示されます。

PS C:\Users\YourUsername>

これでPowerShellのコマンドを入力する準備ができました!

PowerShellのコマンドは「コマンドレット (Cmdlet)」と呼ばれ、「動詞名詞」という形式の名前を持っています。これにより、コマンドの目的が分かりやすくなっています。

動詞 (Verb)意味
Get取得する`Get-Process` (プロセスを取得), `Get-Service` (サービスを取得)
Set設定・変更する`Set-Location` (カレントディレクトリを変更), `Set-ItemProperty` (項目のプロパティを変更)
Start開始する`Start-Process` (プロセスを開始), `Start-Service` (サービスを開始)
Stop停止する`Stop-Process` (プロセスを停止), `Stop-Service` (サービスを停止)
New新しく作成する`New-Item` (ファイルやフォルダを作成)
Remove削除する`Remove-Item` (ファイルやフォルダを削除)
Write書き出す`Write-Host` (コンソールに出力), `Write-Output` (パイプラインに出力)

例えば、現在実行中のプロセス一覧を取得するには、以下のコマンドレットを実行します。

Get-Process

特定のコマンドレットの使い方を知りたい場合は、`Get-Help`コマンドレットが非常に役立ちます。

# Get-Process コマンドレットのヘルプを表示
Get-Help Get-Process
# 詳細なヘルプを表示
Get-Help Get-Process -Detailed
# 使用例を表示
Get-Help Get-Process -Examples
# Web上の最新ヘルプを表示 (インターネット接続が必要)
Get-Help Get-Process -Online

よく使われるコマンドレットには、短縮形の「エイリアス (Alias)」が定義されています。例えば、`Get-ChildItem`(ファイルやフォルダの一覧を取得)には、`ls`, `gci`, `dir` というエイリアスがあります。`Set-Location`(カレントディレクトリを変更)には、`cd`, `chdir`, `sl` があります。

# これらはすべて同じ意味 (カレントディレクトリの内容を表示)
Get-ChildItem
ls
gci
dir
# これらも同じ意味 (C:\Windows ディレクトリに移動)
Set-Location C:\Windows
cd C:\Windows
sl C:\Windows

利用可能なエイリアスの一覧は `Get-Alias` コマンドレットで確認できます。

Get-Alias

エイリアスは対話的な操作では便利ですが、スクリプト内では可読性や互換性のため、正式なコマンドレット名 (`Get-ChildItem` など) を使うことが推奨されます。

PowerShellの最も強力な機能の一つが「パイプライン (`|`)」です。パイプラインを使うと、あるコマンドレットの出力(オブジェクト)を、別のコマンドレットの入力として渡すことができます。

例えば、実行中のプロセスの中から、CPU使用率が高いものだけを絞り込んで表示したい場合、以下のように記述します。

# すべてのプロセスを取得し (|)、CPU使用率 (CPUプロパティ) が 100 より大きいものだけを選択する
Get-Process | Where-Object {$_.CPU -gt 100}

ここでは、

  1. `Get-Process` が全プロセスのオブジェクトを生成します。
  2. パイプライン `|` がそれらのオブジェクトを `Where-Object` に渡します。
  3. `Where-Object` は、渡された各オブジェクト (`$_` で表される) の `CPU` プロパティが `-gt` (より大きい) `100` であるかを評価し、条件に合うオブジェクトだけを次のパイプライン(またはコンソール)に出力します。

さらに、結果をCPU使用率で降順に並べ替えることもできます。

Get-Process | Where-Object {$_.CPU -gt 100} | Sort-Object -Property CPU -Descending

このように、複数のコマンドレットをパイプラインで繋ぐことで、複雑な処理を簡潔に記述できます。

よく使う便利なコマンドレットたち

日常的な作業で役立つ、基本的なコマンドレットをいくつか紹介します。

コマンドレットエイリアス例説明使用例
`Get-ChildItem``ls`, `gci`, `dir`ファイルやフォルダの一覧を取得`Get-ChildItem C:\Work`
`ls -Recurse *.txt` (サブフォルダ含め全txtファイル検索)
`Set-Location``cd`, `chdir`, `sl`カレントディレクトリを変更`Set-Location C:\Work`
`cd ..` (親ディレクトリへ移動)
`Get-Location``pwd`, `gl`現在のカレントディレクトリを取得`Get-Location`
`New-Item``ni`新しいファイルやフォルダを作成`New-Item -Path .\MyFile.txt -ItemType File`
`New-Item -Path .\MyFolder -ItemType Directory`
`Copy-Item``cp`, `copy`, `cpi`ファイルやフォルダをコピー`Copy-Item -Path .\MyFile.txt -Destination C:\Backup\`
`Copy-Item -Path .\MyFolder -Destination C:\Backup\ -Recurse` (フォルダを再帰的にコピー)
`Move-Item``mv`, `move`, `mi`ファイルやフォルダを移動`Move-Item -Path .\MyFile.txt -Destination C:\Archive\`
`Remove-Item``rm`, `del`, `erase`, `rd`, `ri`ファイルやフォルダを削除`Remove-Item -Path .\OldFile.txt`
`Remove-Item -Path .\TempFolder -Recurse -Force` (フォルダを強制削除)
`Rename-Item``ren`, `rni`ファイルやフォルダの名前を変更`Rename-Item -Path .\MyFile.txt -NewName Report.txt`
`Get-Content``cat`, `gc`, `type`ファイルの内容を取得`Get-Content -Path .\MyFile.txt`
`gc .\MyFile.txt -TotalCount 5` (最初の5行を取得)
`Set-Content``sc`ファイルに内容を書き込む(上書き)`Set-Content -Path .\NewFile.txt -Value “Hello, PowerShell!”`
`Add-Content``ac`ファイルに内容を追記する`Add-Content -Path .\Log.txt -Value “Process completed.”`
コマンドレットエイリアス例説明使用例
`Get-Process``gps`, `ps`実行中のプロセスを取得`Get-Process`
`Get-Process -Name “chrome”` (特定の名前のプロセスを取得)
`Stop-Process``kill`, `spps`プロセスを停止`Stop-Process -Name “notepad”`
`Get-Process -Name “badapp” | Stop-Process -Force` (パイプラインで渡して強制停止)
`Get-Service``gsv`システムサービスを取得`Get-Service`
`Get-Service -Name “Spooler”` (特定の名前のサービスを取得)
`Start-Service``sasv`サービスを開始`Start-Service -Name “Spooler”`
`Stop-Service``spsv`サービスを停止`Stop-Service -Name “Spooler”`
`Restart-Service``rs`サービスを再起動`Restart-Service -Name “Spooler”`
`Get-ComputerInfo`コンピュータのシステム情報を取得 (OS, ハードウェアなど)`Get-ComputerInfo`
`Get-EventLog` / `Get-WinEvent`イベントログを取得 (後者はより高機能)`Get-WinEvent -LogName System -MaxEvents 10` (システムログの最新10件)
コマンドレットエイリアス例説明使用例
`Test-Connection``ping`, `tcm`ICMPエコー要求(Ping)を送信`Test-Connection -ComputerName www.google.com`
`Test-Connection -ComputerName Server01 -Count 1`
`Get-NetIPConfiguration`ネットワークインターフェースのIP構成情報を取得`Get-NetIPConfiguration`
`Get-NetIPConfiguration -InterfaceAlias “Ethernet”`
`Resolve-DnsName`DNS名前解決を実行`Resolve-DnsName -Name www.microsoft.com`
コマンドレットエイリアス例説明使用例
`Select-Object``select`オブジェクトから特定のプロパティを選択、または最初のN個/最後のN個を選択`Get-Process | Select-Object -Property Name, CPU, WorkingSet -First 5` (プロセスの名前、CPU、メモリを最初の5つ表示)
`Where-Object``where`, `?`条件に一致するオブジェクトをフィルタリング`Get-Service | Where-Object {$_.Status -eq ‘Running’}` (実行中のサービスを抽出)
`Sort-Object``sort`オブジェクトを指定したプロパティで並べ替え`Get-ChildItem | Sort-Object -Property Length -Descending` (ファイルをサイズが大きい順に並べ替え)
`Measure-Object``measure`オブジェクトの数やプロパティの数値計算(合計、平均など)を行う`Get-ChildItem *.log | Measure-Object -Property Length -Sum -Average` (ログファイルの合計サイズと平均サイズを計算)
`ConvertTo-Csv`オブジェクトをCSV形式の文字列に変換`Get-Process | Select-Object Name, Id, CPU | ConvertTo-Csv -NoTypeInformation`
`Export-Csv``epcsv`オブジェクトをCSVファイルに出力`Get-Service | Export-Csv -Path .\services.csv -Encoding UTF8 -NoTypeInformation`
`Import-Csv``ipcsv`CSVファイルをオブジェクトとしてインポート`Import-Csv -Path .\users.csv`
`ConvertTo-Json`オブジェクトをJSON形式の文字列に変換`Get-Process | Select Name, Id | ConvertTo-Json`
`ConvertFrom-Json`JSON形式の文字列をオブジェクトに変換`'{“Name”:”UserA”, “ID”:123}’ | ConvertFrom-Json`

これらのコマンドレットとパイプラインを組み合わせることで、多くの定型作業を効率化できます。ぜひ `Get-Help` を活用して、各コマンドレットのオプションなどを調べてみてください!

PowerShellスクリプトをはじめよう!

PowerShellの真価は、コマンドを組み合わせてスクリプトを作成し、処理を自動化できる点にあります。ここでは、スクリプトの基本的な作成方法と実行方法について解説します。

  1. スクリプトファイルの作成:
    • PowerShellのコマンド列を記述したテキストファイルを作成します。
    • ファイル拡張子は `.ps1` とします。(例: `MyScript.ps1`)
    • Visual Studio Code (VS Code) に PowerShell 拡張機能 をインストールすると、シンタックスハイライトやインテリセンスが効き、効率的に開発できます。もちろん、メモ帳などのテキストエディタでも作成可能です。
  2. 簡単なスクリプト例 (`Hello.ps1`):
    # スクリプトの説明コメント
    Write-Host "Hello, PowerShell Script!"
    $userName = Read-Host "あなたの名前を入力してください"
    Write-Host "こんにちは、$userName さん!"
    Get-Date
  3. スクリプトの実行:
    • PowerShellコンソールを開き、スクリプトファイルがあるディレクトリに移動します (`Set-Location`)。
    • スクリプトファイルを実行するには、ファイルパスを指定します。カレントディレクトリにある場合は、`.\` をファイル名の前に付けます。
      PS C:\Scripts> .\Hello.ps1

PowerShellには、悪意のあるスクリプトの実行を防ぐためのセキュリティ機能として「実行ポリシー」があります。デフォルト設定では、スクリプトの実行が制限されている場合があります。

現在の実行ポリシーを確認するには、`Get-ExecutionPolicy` コマンドレットを使用します。

Get-ExecutionPolicy

スコープごとのポリシーを確認するには `-List` オプションをつけます。

Get-ExecutionPolicy -List

主な実行ポリシーの種類:

ポリシー説明
`Restricted`スクリプトの実行を許可しない(デフォルトの場合あり)。対話的なコマンド実行のみ許可。
`AllSigned`信頼された発行元によってデジタル署名されたスクリプトのみ実行を許可。
`RemoteSigned`ローカルで作成したスクリプトは実行可能。インターネットからダウンロードしたスクリプトは、信頼された発行元によるデジタル署名が必要(Windowsクライアントのデフォルト)。
`Unrestricted`すべてのスクリプトを実行可能(Windows Serverのデフォルト、Windows以外のデフォルト)。ただし、インターネットからダウンロードしたスクリプトの場合は実行前に警告が表示される。
`Bypass`何もブロックせず、警告も表示しない。
`Undefined`実行ポリシーが設定されていない(特定のスコープで)。

スクリプトを実行できない場合は、実行ポリシーの変更が必要になることがあります。`Set-ExecutionPolicy` コマンドレットで変更できますが、管理者権限が必要な場合が多いです。

# 例: 実行ポリシーを RemoteSigned に変更 (管理者として実行)
Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更は、システムのセキュリティに影響を与えます。組織のポリシーやセキュリティ要件を確認し、理解した上で変更してください。

一時的に特定のスクリプトだけ実行を許可したい場合は、`powershell.exe` の起動オプションを使う方法もあります。

powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\MyScript.ps1"

また、現在のプロセスのみ実行ポリシーを変更することも可能です(PowerShellを閉じると元に戻る)。

Set-ExecutionPolicy RemoteSigned -Scope Process -Force

PowerShellスクリプトでは、以下のようなプログラミング要素を利用できます。

  • コメント: `#` から行末までがコメントになります。
    # これは一行コメントです
    $value = 10 # ここもコメント
  • 変数: `$変数名` で定義・参照します。型を明示することも可能です。
    $message = "処理を開始します"
    [int]$count = 0
    Write-Host $message
    $count = $count + 1
  • 配列: `,` で区切るか、`@()` で囲んで作成します。
    $servers = "ServerA", "ServerB", "ServerC"
    $numbers = @(1, 2, 3, 4, 5)
    Write-Host $servers[0] # 最初の要素 (ServerA) を表示
  • ハッシュテーブル(連想配列): `@{“キー” = “値”; …}` で作成します。
    $userInfo = @{ Name = "Taro Yamada" Age = 30 Department = "IT"
    }
    Write-Host $userInfo.Name # 値にアクセス
  • 比較演算子: `-eq` (等しい), `-ne` (等しくない), `-gt` (より大きい), `-ge` (以上), `-lt` (より小さい), `-le` (以下), `-like` (ワイルドカード比較), `-match` (正規表現比較) など、`-` で始まる演算子を使用します。
    $number = 10
    if ($number -gt 5) { Write-Host "数値は5より大きいです"
    }
  • 論理演算子: `-and`, `-or`, `-xor`, `-not`
    $a = 10
    $b = 20
    if (($a -gt 5) -and ($b -lt 30)) { Write-Host "条件一致"
    }
  • 制御構文:
    • `if`/`elseif`/`else`: 条件分岐
      $score = 75
      if ($score -ge 80) { Write-Host "優"
      } elseif ($score -ge 60) { Write-Host "良"
      } else { Write-Host "可"
      }
    • `switch`: 多分岐
      $color = "Red"
      switch ($color) { "Red" { Write-Host "赤色です" } "Blue" { Write-Host "青色です" } default { Write-Host "その他の色です" }
      }
    • `for`: 指定回数の繰り返し
      for ($i = 0; $i -lt 5; $i++) { Write-Host "カウント: $i"
      }
    • `foreach`: 配列やコレクションの各要素に対する繰り返し
      $servers = "ServerA", "ServerB", "ServerC"
      foreach ($server in $servers) { Write-Host "処理中のサーバー: $server" # Test-Connection $server など
      }
    • `while` / `do-while` / `do-until`: 条件に基づく繰り返し
      $counter = 0
      while ($counter -lt 3) { Write-Host "Whileループ: $counter" $counter++
      }
  • 関数: 処理をまとめて再利用可能にします。
    function Show-Greeting { param ( [string]$Name = "Guest" # パラメータ定義とデフォルト値 ) Write-Host "ようこそ、$Name さん!"
    }
    # 関数の呼び出し
    Show-Greeting -Name "Suzuki"
    Show-Greeting # デフォルト値が使われる
  • エラーハンドリング (`try`/`catch`/`finally`): エラー発生時の処理を記述します。
    try { # エラーが発生する可能性のある処理 $result = 10 / 0 Write-Host "計算結果: $result"
    } catch { # エラー発生時の処理 Write-Error "エラーが発生しました: $($_.Exception.Message)"
    } finally { # エラーの有無に関わらず最後に実行される処理 Write-Host "処理を終了します。"
    }

これらの要素を組み合わせることで、実用的な自動化スクリプトを作成できます。

実践!PowerShell活用例

PowerShellは、様々な場面で活用できます。ここではいくつかの具体的な例を挙げます。

毎日・毎週行うような繰り返し作業は、PowerShellスクリプトで自動化するのに最適です。

  • ファイル整理: 特定のフォルダにある古いログファイルを定期的に削除したり、別フォルダに移動したりする。
    # 30日以上前の .log ファイルをアーカイブフォルダに移動する例
    $logPath = "C:\Logs"
    $archivePath = "C:\Logs\Archive"
    $threshold = (Get-Date).AddDays(-30)
    # アーカイブフォルダがなければ作成
    if (-not (Test-Path $archivePath)) { New-Item -Path $archivePath -ItemType Directory | Out-Null
    }
    Get-ChildItem -Path $logPath -Filter "*.log" | Where-Object { $_.LastWriteTime -lt $threshold } | Move-Item -Destination $archivePath -Verbose
  • レポート作成: サーバーのディスク空き容量をチェックし、結果をCSVファイルに出力する。
    # Cドライブの空き容量(GB)を取得してCSVに出力する例
    Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='C:'" | Select-Object DeviceID, @{Name="FreeSpaceGB";Expression={[math]::Round($_.FreeSpace / 1GB, 2)}}, @{Name="SizeGB";Expression={[math]::Round($_.Size / 1GB, 2)}} | Export-Csv -Path .\disk_space.csv -NoTypeInformation -Encoding UTF8
  • Active Directory (AD) 操作: 新入社員のアカウントを一括作成したり、定期的にパスワード変更が必要なユーザーをリストアップしたりする。(`ActiveDirectory` モジュールが必要)

複数のサーバーやPCを効率的に管理できます。

  • 複数サーバーへのコマンド実行: `Invoke-Command` を使って、複数のリモートコンピュータで同じコマンドやスクリプトを実行する。(WinRMの設定が必要)
    # Server01, Server02 で特定のサービスの状態を確認する例
    $servers = "Server01", "Server02"
    Invoke-Command -ComputerName $servers -ScriptBlock { Get-Service -Name "wuauserv" }
  • 状態監視: 特定のサービスが停止していないか、特定のイベントログが出力されていないかを定期的にチェックし、問題があれば通知する。
  • 構成管理: PowerShell Desired State Configuration (DSC) を利用して、サーバー構成をコードで定義し、維持する。

Azure、AWS、Google Cloudなどのクラウドサービスを操作するためのPowerShellモジュールが提供されています。

  • Azure: `Az` モジュールを使って、仮想マシンの作成・管理、ストレージアカウントの操作、Azure ADユーザーの管理などを行う。
    # Azureに接続し、特定のリソースグループのVM一覧を取得する例 (Az モジュールが必要)
    # Connect-AzAccount # 初回実行時など、ログインが必要
    # Get-AzVM -ResourceGroupName "MyResourceGroup" | Select-Object Name, PowerState
  • AWS: `AWS Tools for PowerShell` を使って、EC2インスタンスの管理、S3バケットの操作、IAMユーザーの管理などを行う。

CSV、JSON、XMLなどのデータを扱ったり、ログファイルから特定の情報を抽出したりするのに強力です。

  • ログ分析: 大量のログファイルから特定のエラーメッセージを抽出し、集計する。
    # *.log ファイルから "ERROR:" を含む行を抽出し、上位10件のエラーを表示する例
    Get-ChildItem -Path C:\AppLogs -Filter "*.log" -Recurse | Get-Content | Where-Object { $_ -match "ERROR:" } | Group-Object | Sort-Object Count -Descending | Select-Object -First 10 Name, Count
  • データ変換: CSVファイルを読み込み、必要な列だけを抽出してJSON形式で出力する。

これらの例はほんの一部です。PowerShellのオブジェクト指向と豊富なコマンドレットを活用すれば、アイデア次第で様々なタスクを自動化・効率化できます。

学習リソースと次のステップ

PowerShellは非常に奥が深く、常に進化しています。学習を続けるためのリソースをいくつか紹介します。

  • Microsoft Learn (公式ドキュメント): PowerShellに関する最も包括的で正確な情報源です。チュートリアル、リファレンス、概念説明などが豊富にあります。
  • `Get-Help` コマンドレット: PowerShell内でコマンドレットの使い方を調べる基本ツールです。`-Online` オプションで最新のWebドキュメントを開くこともできます。
  • 書籍: “PowerShell in a Month of Lunches” シリーズなど、初心者から中級者向けの優れた書籍が多数出版されています。(日本語版も存在するものがあります)
  • オンラインコミュニティ: Stack Overflow、Reddit (r/PowerShell)、各種フォーラムなどで質問したり、他のユーザーのスクリプトを参考にしたりできます。
  • 実際に使ってみる: 日常業務の中で「これはPowerShellで自動化できないか?」と考えて、簡単なスクリプトから試してみるのが一番の上達方法です。

学習のヒント:

  • まずは基本的なコマンドレット(`Get-Help`, `Get-Command`, `Get-Member`, `Select-Object`, `Where-Object` など)をしっかり理解しましょう。
  • パイプラインの概念と使い方に慣れましょう。
  • 簡単なスクリプトから始めて、徐々に変数、制御構文、関数などを取り入れていきましょう。
  • エラーメッセージをよく読み、`try/catch`でのエラーハンドリングを学びましょう。
  • 他の人のスクリプトを読んで、書き方を参考にしましょう。

まとめ

PowerShellは、Windows環境だけでなく、LinuxやmacOSでも利用できる強力なコマンドラインシェルおよびスクリプト言語です。オブジェクト指向のパイプライン、豊富なコマンドレット、高度なスクリプト機能により、システム管理、タスクの自動化、データ処理など、幅広い用途で活躍します。

最初は覚えることが多く感じるかもしれませんが、基本的なコマンドレットとパイプラインの使い方をマスターすれば、その便利さを実感できるはずです。ぜひ `Get-Help` を活用し、小さなスクリプトから始めて、PowerShellの世界を探求してみてください。きっとあなたの作業効率を大幅に向上させる強力な味方となるでしょう!

コメントを残す

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