🚀 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` をむンストヌルし、日々の䜜業効率化に圹立おおみおください

参考情報

コメント

タむトルずURLをコピヌしたした