powershell-master
Windows/Linux/macOS すべてのプラットフォームに対応した PowerShell の総合エキスパートシステムです。スクリプト・モジュール・コマンドレットの作成から、GitHub Actions や Azure DevOps などの CI/CD 自動化、Az・Microsoft.Graph・AWS Tools 等の主要モジュール活用、PSGallery によるモジュール管理、Azure/AWS/Microsoft 365 の自動化まで幅広く対応します。PowerShell 7+ の機能を駆使し、セキュリティやベストプラクティスに準拠した本番品質のクロスプラットフォーム自動化スクリプトを提供します。
description の原文を見る
Complete PowerShell expertise system across ALL platforms (Windows/Linux/macOS). PROACTIVELY activate for: (1) ANY PowerShell task (scripts/modules/cmdlets), (2) CI/CD automation (GitHub Actions/Azure DevOps/Bitbucket), (3) Cross-platform scripting, (4) Module discovery and management (PSGallery), (5) Azure/AWS/Microsoft 365 automation, (6) Script debugging and optimization, (7) Best practices and security. Provides: PowerShell 7+ features, popular module expertise (Az, Microsoft.Graph, PnP, AWS Tools), PSGallery integration, platform-specific guidance, CI/CD pipeline patterns, cmdlet syntax mastery, and production-ready scripting patterns. Ensures professional-grade, cross-platform PowerShell automation following industry standards.
SKILL.md 本文
PowerShell Master
🚨 重要なガイドライン
Windows ファイルパス要件
必須: Windows でのファイルパスでは必ずバックスラッシュを使用します
Windows で Edit または Write ツールを使用する場合、ファイルパスではフォワードスラッシュ (/) ではなく、バックスラッシュ (\) を使用する必要があります。
例:
- ❌ 間違い:
D:/repos/project/file.tsx - ✅ 正解:
D:\repos\project\file.tsx
これは以下に適用されます:
- Edit ツールの file_path パラメータ
- Write ツールの file_path パラメータ
- Windows システムでのすべてのファイル操作
ドキュメンテーション ガイドライン
ユーザーが明示的に要求しない限り、新しいドキュメンテーションファイルを作成しないでください。
- 優先順位: 新しいドキュメンテーションを作成するのではなく、既存の README.md ファイルを更新してください
- リポジトリの清潔性: ユーザーが特に要求しない限り、リポジトリルートをクリーンに保ちます (README.md のみ)
- スタイル: ドキュメンテーションは簡潔で直接的、かつプロフェッショナルである必要があります - AI 生成のトーンを避けます
- ユーザーの好み: ユーザーが特に .md ファイルのドキュメンテーションを要求した場合のみ、追加ファイルを作成します
すべてのプラットフォームでのスクリプティング、自動化、CI/CD、クラウド管理のための完全な PowerShell 専門知識。
🎯 有効化するタイミング
PowerShell 関連のタスクに対してプロアクティブに有効化します:
- ✅ PowerShell スクリプト - あらゆる .ps1 ファイルの作成、レビュー、最適化
- ✅ コマンドレットとモジュール - PowerShell モジュールの検索、インストール、使用
- ✅ クロスプラットフォーム - Windows、Linux、macOS の PowerShell タスク
- ✅ CI/CD 統合 - GitHub Actions、Azure DevOps、Bitbucket Pipelines
- ✅ クラウド自動化 - Azure (Az)、AWS、Microsoft 365 (Microsoft.Graph)
- ✅ モジュール管理 - PSGallery の検索、インストール、更新
- ✅ スクリプトのデバッグ - トラブルシューティング、パフォーマンス、セキュリティ
- ✅ ベストプラクティス - コード品質、標準、本番環境対応スクリプト
📋 PowerShell 概要
PowerShell バージョンとプラットフォーム
PowerShell 7+ (推奨)
- クロスプラットフォーム: Windows、Linux、macOS
- オープンソース、積極的に開発中
- PowerShell 5.1 よりもパフォーマンスが向上
- デフォルトで UTF-8
- 並列実行のサポート
- 三項演算子、null-coalescing 演算子
Windows PowerShell 5.1 (レガシー)
- Windows のみ
- Windows に付属
- デフォルトエンコーディングは UTF-16LE
- Windows 固有の一部モジュールで必須
インストール場所:
- Windows:
C:\Program Files\PowerShell\7\(PS7) またはC:\Windows\System32\WindowsPowerShell\v1.0\(5.1) - Linux:
/opt/microsoft/powershell/7/または/usr/bin/pwsh - macOS:
/usr/local/microsoft/powershell/7/または/usr/local/bin/pwsh
🔧 クロスプラットフォーム ベストプラクティス
1. パス処理
推奨:
# Join-Path でクロスプラットフォーム対応パスを作成
$configPath = Join-Path -Path $PSScriptRoot -ChildPath "config.json"
# パス操作に [System.IO.Path] を使用
$fullPath = [System.IO.Path]::Combine($home, "documents", "file.txt")
# PowerShell 7+ ではすべてのプラットフォームでフォワードスラッシュが動作
$path = "$PSScriptRoot/subfolder/file.txt"
非推奨:
# ハードコードされたバックスラッシュ (Windows のみ)
$path = "C:\Users\Name\file.txt"
# 大文字小文字を区別するファイルシステムを想定しない
Get-ChildItem "MyFile.txt" # Windows では動作、Linux/macOS では大文字小文字が違うと失敗
2. プラットフォーム検出
# 自動変数を使用
if ($IsWindows) {
# Windows 固有のコード
$env:Path -split ';'
}
elseif ($IsLinux) {
# Linux 固有のコード
$env:PATH -split ':'
}
elseif ($IsMacOS) {
# macOS 固有のコード
$env:PATH -split ':'
}
# PowerShell バージョン確認
if ($PSVersionTable.PSVersion.Major -ge 7) {
# PowerShell 7+ 機能
}
3. スクリプトではエイリアスを避ける
# エイリアスを使用しない (プラットフォーム間で異なる可能性がある)
ls | ? {$_.Length -gt 1MB} | % {$_.Name}
# フルコマンドレット名を使用
Get-ChildItem | Where-Object {$_.Length -gt 1MB} | ForEach-Object {$_.Name}
理由: Linux/macOS では、エイリアスが PowerShell コマンドレットではなくネイティブコマンドを呼び出す可能性があり、予期しない結果につながります。
4. テキストエンコーディング
# PowerShell 7+ はデフォルトで UTF-8 を使用
"Hello" | Out-File -FilePath output.txt
# PowerShell 5.1 互換性のためにエンコーディングを指定
"Hello" | Out-File -FilePath output.txt -Encoding UTF8
# ベストプラクティス: クロスプラットフォームスクリプトではエンコーディングを常に指定
$content | Set-Content -Path $file -Encoding UTF8NoBOM
5. 環境変数 (クロスプラットフォーム)
# ベストプラクティス: クロスプラットフォーム互換性のため .NET Environment クラスを使用
[Environment]::UserName # すべてのプラットフォームで動作
[Environment]::MachineName # すべてのプラットフォームで動作
[IO.Path]::GetTempPath() # すべてのプラットフォームで動作
# 非推奨: これらはプラットフォーム固有
$env:USERNAME # Windows のみ
$env:USER # Linux/macOS のみ
# 環境変数名は Linux/macOS では大文字小文字を区別
$env:PATH # Linux/macOS で正しい
$env:Path # Linux/macOS では機能しない可能性あり
6. シェル検出 (Windows: PowerShell vs Git Bash)
重要: Windows では PowerShell と Git Bash/MSYS2 環境を区別します:
# PowerShell 検出 (最も信頼性が高い)
if ($env:PSModulePath -and ($env:PSModulePath -split ';').Count -ge 3) {
Write-Host "PowerShell で実行中"
}
# プラットフォーム固有の自動変数 (PowerShell 7+)
if ($IsWindows) {
# Windows 固有のコード
}
elseif ($IsLinux) {
# Linux 固有のコード
}
elseif ($IsMacOS) {
# macOS 固有のコード
}
Git Bash/MSYS2 検出:
# Bash 検出 - MSYSTEM 環境変数を確認
if [ -n "$MSYSTEM" ]; then
echo "Git Bash/MSYS2 で実行中: $MSYSTEM"
# MSYSTEM 値: MINGW64、MINGW32、MSYS
fi
各シェルを使用するタイミング:
- PowerShell: Windows 自動化、Azure/M365、PSGallery モジュール、オブジェクトパイプライン
- Git Bash: Git 操作、Unix ツール (sed/awk/grep)、POSIX スクリプト、テキスト処理
パス処理の違い:
- PowerShell:
C:\Users\JohnまたはC:/Users/John(PS 7+ では両方動作) - Git Bash:
/c/Users/John(Unix スタイル、Windows ツール呼び出し時に自動変換)
詳細なクロスシェルガイダンスについては powershell-shell-detection スキルを参照してください。
7. 行末
# PowerShell は行末を自動的に処理
# しかし git やクロスプラットフォームツールでは明示的に指定
git config core.autocrlf input # Linux/macOS
git config core.autocrlf true # Windows
📦 モジュール管理 (PSResourceGet & PSGallery)
PSResourceGet - モダンなパッケージマネージャー (2025)
PSResourceGet は PowerShellGet より 2 倍高速で、積極的にメンテナンスされています:
# PSResourceGet は PowerShell 7.4 以降に付属 (または手動インストール)
Install-Module -Name Microsoft.PowerShell.PSResourceGet -Force
# モダンなコマンド (PSResourceGet)
Install-PSResource -Name Az -Scope CurrentUser # 2倍高速
Find-PSResource -Name "*Azure*" # より高速な検索
Update-PSResource -Name Az # バッチ更新
Get-InstalledPSResource # インストール済みを一覧
Uninstall-PSResource -Name OldModule # クリーンアンインストール
# 互換性: 古い Install-Module コマンドはまだ動作
# 内部的に PSResourceGet を自動呼び出し
Install-Module -Name Az -Scope CurrentUser # 動作、PSResourceGet を使用
モジュールの検索
# PSResourceGet (モダン)
Find-PSResource -Name "*Azure*"
Find-PSResource -Tag "Security"
Find-PSResource -Name Az | Select-Object Name, Version, PublishedDate
# レガシー PowerShellGet (まだ動作)
Find-Module -Name "*Azure*"
Find-Command -Name Get-AzVM
モジュールのインストール
# 推奨: PSResourceGet (2倍高速)
Install-PSResource -Name Az -Scope CurrentUser -TrustRepository
Install-PSResource -Name Microsoft.Graph -Version 2.32.0
# レガシー: PowerShellGet (低速だがまだ動作)
Install-Module -Name Az -Scope CurrentUser -Force
Install-Module -Name Pester -Scope AllUsers # 昇格が必要
インストール済みモジュールの管理
# インストール済みを一覧表示 (PSResourceGet)
Get-InstalledPSResource
Get-InstalledPSResource -Name Az
# モジュールを更新 (PSResourceGet)
Update-PSResource -Name Az
Update-PSResource # すべてを更新
# アンインストール (PSResourceGet)
Uninstall-PSResource -Name OldModule -AllVersions
# モジュールをインポート
Import-Module -Name Az.Accounts
オフラインインストール
# モジュールを保存 (どちらでも動作)
Save-PSResource -Name Az -Path C:\OfflineModules
# または: Save-Module -Name Az -Path C:\OfflineModules
# 保存された場所からインストール
Install-PSResource -Name Az -Path C:\OfflineModules
🌟 人気の PowerShell モジュール
Azure (Az モジュール 14.5.0)
最新: Az 14.5.0 (2025年10月) ゾーン冗長性とシンボリックリンク対応
# Azure モジュール 14.5.0 をインストール
Install-PSResource -Name Az -Scope CurrentUser
# または: Install-Module -Name Az -Scope CurrentUser -Force
# Azure に接続
Connect-AzAccount
# 一般的な操作
Get-AzVM
Get-AzResourceGroup
New-AzResourceGroup -Name "MyRG" -Location "EastUS"
# Az 14.5 の新機能: ストレージのゾーン冗長性
New-AzStorageAccount -ResourceGroupName "MyRG" -Name "storage123" `
-Location "EastUS" -SkuName "Standard_LRS" -EnableZoneRedundancy
# Az 14.5 の新機能: NFS ファイルシェアでのシンボリックリンク
New-AzStorageFileSymbolicLink -Context $ctx -ShareName "nfsshare" `
-Path "symlink" -Target "/target/path"
主なサブモジュール:
Az.Accounts- 認証 (2025年9月以降は MFA が必須)Az.Compute- VM、スケールセットAz.Storage- ストレージアカウント (ゾーン冗長性対応)Az.Network- 仮想ネットワーク、NSGAz.KeyVault- Key Vault 操作Az.Resources- リソースグループ、デプロイメント
Microsoft Graph (Microsoft.Graph 2.32.0)
重要: MSOnline および AzureAD モジュールは廃止 (2025年3月〜5月)。代わりに Microsoft.Graph を使用してください。
# Microsoft Graph 2.32.0 をインストール (2025年10月)
Install-PSResource -Name Microsoft.Graph -Scope CurrentUser
# または: Install-Module -Name Microsoft.Graph -Scope CurrentUser
# 必要なスコープで接続
Connect-MgGraph -Scopes "User.Read.All", "Group.ReadWrite.All"
# 一般的な操作
Get-MgUser
Get-MgGroup
New-MgUser -DisplayName "John Doe" -UserPrincipalName "john@domain.com" -MailNickname "john"
Get-MgTeam
# AzureAD/MSOnline からの移行
# 旧: Connect-AzureAD / Connect-MsolService
# 新: Connect-MgGraph
# 旧: Get-AzureADUser / Get-MsolUser
# 新: Get-MgUser
PnP PowerShell (SharePoint/Teams)
# PnP PowerShell をインストール
Install-Module -Name PnP.PowerShell -Scope CurrentUser
# SharePoint Online に接続
Connect-PnPOnline -Url "https://tenant.sharepoint.com/sites/site" -Interactive
# 一般的な操作
Get-PnPList
Get-PnPFile -Url "/sites/site/Shared Documents/file.docx"
Add-PnPListItem -List "Tasks" -Values @{"Title"="New Task"}
AWS Tools for PowerShell
# AWS ツールをインストール
Install-Module -Name AWS.Tools.Installer -Force
Install-AWSToolsModule AWS.Tools.EC2,AWS.Tools.S3
# 認証情報を設定
Set-AWSCredential -AccessKey $accessKey -SecretKey $secretKey -StoreAs default
# 一般的な操作
Get-EC2Instance
Get-S3Bucket
New-S3Bucket -BucketName "my-bucket"
その他の人気モジュール
# Pester (テストフレームワーク)
Install-Module -Name Pester -Force
# PSScriptAnalyzer (コード分析)
Install-Module -Name PSScriptAnalyzer
# ImportExcel (Excel なしでの Excel 操作)
Install-Module -Name ImportExcel
# PowerShellGet 3.x (モダンなパッケージ管理)
Install-Module -Name Microsoft.PowerShell.PSResourceGet
🚀 CI/CD 統合
GitHub Actions
name: PowerShell CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: PowerShell モジュールをインストール
shell: pwsh
run: |
Install-Module -Name Pester -Force -Scope CurrentUser
Install-Module -Name PSScriptAnalyzer -Force -Scope CurrentUser
- name: Pester テストを実行
shell: pwsh
run: |
Invoke-Pester -Path ./tests -OutputFormat NUnitXml -OutputFile TestResults.xml
- name: PSScriptAnalyzer を実行
shell: pwsh
run: |
Invoke-ScriptAnalyzer -Path . -Recurse -ReportSummary
マルチプラットフォーム行列:
jobs:
test:
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: ${{ matrix.os }} でテスト
shell: pwsh
run: |
./test-script.ps1
Azure DevOps パイプライン
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
Install-Module -Name Pester -Force -Scope CurrentUser
Invoke-Pester -Path ./tests -OutputFormat NUnitXml
displayName: 'Pester テストを実行'
- task: PowerShell@2
inputs:
filePath: '$(System.DefaultWorkingDirectory)/build.ps1'
arguments: '-Configuration Release'
displayName: 'ビルドスクリプトを実行'
- task: PublishTestResults@2
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResults.xml'
クロスプラットフォームパイプライン:
strategy:
matrix:
linux:
imageName: 'ubuntu-latest'
windows:
imageName: 'windows-latest'
mac:
imageName: 'macos-latest'
pool:
vmImage: $(imageName)
steps:
- pwsh: |
Write-Host "実行環境: $($PSVersionTable.OS)"
./test-script.ps1
displayName: 'クロスプラットフォームテスト'
Bitbucket パイプライン
image: mcr.microsoft.com/powershell:latest
pipelines:
default:
- step:
name: PowerShell でテスト
script:
- pwsh -Command "Install-Module -Name Pester -Force"
- pwsh -Command "Invoke-Pester -Path ./tests"
- step:
name: デプロイ
deployment: production
script:
- pwsh -File ./deploy.ps1
💻 PowerShell 構文とコマンドレット
コマンドレット構造
# 動詞-名詞パターン
Get-ChildItem
Set-Location
New-Item
Remove-Item
# 共通パラメータ (すべてのコマンドレットで利用可能)
Get-Process -Verbose
Set-Content -Path file.txt -WhatIf
Remove-Item -Path folder -Confirm
Invoke-RestMethod -Uri $url -ErrorAction Stop
変数とデータ型
# 変数 (型は動的)
$string = "Hello World"
$number = 42
$array = @(1, 2, 3, 4, 5)
$hashtable = @{Name="John"; Age=30}
# 強い型付け
[string]$name = "John"
[int]$age = 30
[datetime]$date = Get-Date
# 特殊な変数
$PSScriptRoot # スクリプトを含むディレクトリ
$PSCommandPath # スクリプトのフルパス
$args # スクリプト引数
$_ # 現在のパイプラインオブジェクト
演算子
# 比較演算子
-eq # 等しい
-ne # 等しくない
-gt # より大きい
-lt # より小さい
-match # 正規表現マッチ
-like # ワイルドカードマッチ
-contains # 配列に含む
# 論理演算子
-and
-or
-not
# PowerShell 7+ 三項演算子
$result = $condition ? "true" : "false"
# Null-coalescing (PS 7+)
$value = $null ?? "default"
制御フロー
# If-ElseIf-Else
if ($condition) {
# コード
} elseif ($otherCondition) {
# コード
} else {
# コード
}
# Switch
switch ($value) {
1 { "One" }
2 { "Two" }
{$_ -gt 10} { "10 より大きい" }
default { "その他" }
}
# ループ
foreach ($item in $collection) {
# アイテムを処理
}
for ($i = 0; $i -lt 10; $i++) {
# ループコード
}
while ($condition) {
# ループコード
}
do {
# ループコード
} while ($condition)
関数
function Get-Something {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string]$Name,
[Parameter()]
[int]$Count = 1,
[Parameter(ValueFromPipeline=$true)]
[string[]]$InputObject
)
begin {
# 初期化
}
process {
# 各パイプラインオブジェクトを処理
foreach ($item in $InputObject) {
# $item で作業
}
}
end {
# クリーンアップ
return $result
}
}
パイプラインとフィルタリング
# パイプラインの基本
Get-Process | Where-Object {$_.CPU -gt 100} | Select-Object Name, CPU
# 簡潔な構文 (PS 3.0+)
Get-Process | Where CPU -gt 100 | Select Name, CPU
# ForEach-Object
Get-ChildItem | ForEach-Object {
Write-Host $_.Name
}
# 簡潔な構文 (PS 4.0+)
Get-ChildItem | % Name
# グループ化、ソート、計測
Get-Process | Group-Object ProcessName
Get-Service | Sort-Object Status
Get-ChildItem | Measure-Object -Property Length -Sum
エラー処理
# Try-Catch-Finally
try {
Get-Content -Path "nonexistent.txt" -ErrorAction Stop
}
catch [System.IO.FileNotFoundException] {
Write-Error "ファイルが見つかりません"
}
catch {
Write-Error "エラーが発生しました: $_"
}
finally {
# クリーンアップコード
}
# エラーアクション設定
$ErrorActionPreference = "Stop" # すべてのエラーを終了エラーとして扱う
$ErrorActionPreference = "Continue" # デフォルト
$ErrorActionPreference = "SilentlyContinue" # エラーを抑制
🔒 セキュリティベストプラクティス (2025 標準)
モダンセキュリティフレームワーク (JEA + WDAC + ロギング)
2025 セキュリティ要件:
- JEA - ロールベースアクセス管理のための Just Enough Administration
- WDAC - スクリプト承認のための Windows Defender Application Control
- 制約付き言語モード - 非管理者ユーザー向け
- スクリプトブロックロギング - 監査証跡用
Just Enough Administration (JEA)
本番環境では 2025 年に必須:
# JEA セッション設定ファイルを作成
New-PSSessionConfigurationFile -SessionType RestrictedRemoteServer `
-Path "C:\JEA\HelpDesk.pssc" `
-VisibleCmdlets @{
Name = 'Restart-Service'
Parameters = @{ Name = 'Name'; ValidateSet = 'Spooler', 'Wuauserv' }
}, @{
Name = 'Get-Service'
} `
-LanguageMode NoLanguage `
-ExecutionPolicy RemoteSigned
# JEA エンドポイントを登録
Register-PSSessionConfiguration -Name HelpDesk `
-Path "C:\JEA\HelpDesk.pssc" `
-Force
# 制限された特権で接続
Enter-PSSession -ComputerName Server01 -ConfigurationName HelpDesk
Windows Defender Application Control (WDAC)
PowerShell スクリプト制御の AppLocker の代替:
# 承認済みスクリプト用 WDAC ポリシーを作成
New-CIPolicy -FilePath "C:\WDAC\PowerShellPolicy.xml" `
-ScanPath "C:\ApprovedScripts" `
-Level FilePublisher `
-Fallback Hash
# バイナリに変換
ConvertFrom-CIPolicy -XmlFilePath "C:\WDAC\PowerShellPolicy.xml" `
-BinaryFilePath "C:\Windows\System32\CodeIntegrity\SIPolicy.p7b"
# グループポリシーまたは MDM 経由でデプロイ
制約付き言語モード
すべての非管理者ユーザーに推奨:
# 現在の言語モードを確認
$ExecutionContext.SessionState.LanguageMode
# 出力: FullLanguage (管理者) または ConstrainedLanguage (標準ユーザー)
# システム全体で有効化 (環境変数経由)
[Environment]::SetEnvironmentVariable(
"__PSLockdownPolicy",
"4",
[System.EnvironmentVariableTarget]::Machine
)
スクリプトブロックロギング
セキュリティ監査用に有効化:
# グループポリシーまたはレジストリ経由で有効化
# HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
# EnableScriptBlockLogging = 1
# EnableScriptBlockInvocationLogging = 1
# ログを確認
Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" |
Where-Object Id -eq 4104 | # スクリプトブロックロギング
Select-Object TimeCreated, Message -First 10
実行ポリシー
# 現在の実行ポリシーを確認
Get-ExecutionPolicy
# 現在のユーザー用に設定 (管理者権限不要)
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# 単一セッション用にバイパス (慎重に使用)
pwsh -ExecutionPolicy Bypass -File script.ps1
認証情報管理
# 認証情報をハードコードしない
# 悪い例: $password = "MyP@ssw0rd"
# SecretManagement モジュールを使用 (モダンなアプローチ)
Install-PSResource -Name Microsoft.PowerShell.SecretManagement
Install-PSResource -Name SecretManagement.KeyVault
Register-SecretVault -Name AzureKeyVault -ModuleName SecretManagement.KeyVault
$secret = Get-Secret -Name "DatabasePassword" -Vault AzureKeyVault
# レガシー: インタラクティブ用に Get-Credential を使用
$cred = Get-Credential
# 本番環境用に Azure Key Vault を使用
$vaultName = "MyKeyVault"
$secret = Get-AzKeyVaultSecret -VaultName $vaultName -Name "DatabasePassword"
$secret.SecretValue
入力検証
function Do-Something {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$Name,
[Parameter()]
[ValidateRange(1, 100)]
[int]$Count,
[Parameter()]
[ValidateSet("Option1", "Option2", "Option3")]
[string]$Option,
[Parameter()]
[ValidatePattern('^\d{3}-\d{3}-\d{4}$')]
[string]$PhoneNumber
)
}
コード署名 (本番環境)
# コード署名証明書を取得
$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert
# スクリプトに署名
Set-AuthenticodeSignature -FilePath script.ps1 -Certificate $cert
⚡ パフォーマンス最適化
PowerShell 7+ 機能
# 並列 ForEach (PS 7+)
1..10 | ForEach-Object -Parallel {
Start-Sleep -Seconds 1
"処理済み $_"
} -ThrottleLimit 5
# 三項演算子
$result = $value ? "true" : "false"
# Null-coalescing
$name = $userName ?? "default"
# Null-conditional メンバーアクセス
$length = $string?.Length
効率的なフィルタリング
# パフォーマンス向上のため .NET メソッドを使用
# 代わりに: Get-Content large.txt | Where-Object {$_ -match "pattern"}
[System.IO.File]::ReadLines("large.txt") | Where-Object {$_ -match "pattern"}
# 利用可能な場合は -Filter パラメータを使用
Get-ChildItem -Path C:\ -Filter *.log -Recurse
# 代わりに: Get-ChildItem -Path C:\ -Recurse | Where-Object {$_.Extension -eq ".log"}
ArrayList vs Array
# 配列は不変 - 追加時に低速
$array = @()
1..1000 | ForEach-Object { $array += $_ } # 低速
# 動的コレクション向け ArrayList を使用
$list = [System.Collections.ArrayList]::new()
1..1000 | ForEach-Object { [void]$list.Add($_) } # 高速
# または汎用 List を使用
$list = [System.Collections.Generic.List[int]]::new()
1..1000 | ForEach-Object { $list.Add($_) }
🧪 Pester によるテスト
# Pester をインストール
Install-Module -Name Pester -Force
# 基本的なテスト構造
Describe "Get-Something テスト" {
Context "入力が有効の場合" {
It "期待される値を返す" {
$result = Get-Something -Name "Test"
$result | Should -Be "Expected"
}
}
Context "入力が無効の場合" {
It "エラーをスロー" {
{ Get-Something -Name $null } | Should -Throw
}
}
}
# テストを実行
Invoke-Pester -Path ./tests
Invoke-Pester -Path ./tests -OutputFormat NUnitXml -OutputFile TestResults.xml
# コードカバレッジ
Invoke-Pester -Path ./tests -CodeCoverage ./src/*.ps1
📝 スクリプト要件とバージョン管理
# 特定の PowerShell バージョンが必須
#Requires -Version 7.0
# モジュールが必須
#Requires -Modules Az.Accounts, Az.Compute
# 管理者/昇格特権が必須 (Windows)
#Requires -RunAsAdministrator
# 複数の要件を結合
#Requires -Version 7.0
#Requires -Modules @{ModuleName='Pester'; ModuleVersion='5.0.0'}
# ストリクトモードを使用
Set-StrictMode -Version Latest
🎓 一般的なコマンドレットリファレンス
ファイルシステム
Get-ChildItem (gci, ls, dir)
Set-Location (cd, sl)
New-Item (ni)
Remove-Item (rm, del)
Copy-Item (cp, copy)
Move-Item (mv, move)
Rename-Item (rn, ren)
Get-Content (gc, cat, type)
Set-Content (sc)
Add-Content (ac)
プロセス管理
Get-Process (ps, gps)
Stop-Process (kill, spps)
Start-Process (start, saps)
Wait-Process
サービス管理
Get-Service (gsv)
Start-Service (sasv)
Stop-Service (spsv)
Restart-Service (srsv)
Set-Service
ネットワーク
Test-Connection (ping)
Test-NetConnection
Invoke-WebRequest (curl, wget, iwr)
Invoke-RestMethod (irm)
オブジェクト操作
Select-Object (select)
Where-Object (where, ?)
ForEach-Object (foreach, %)
Sort-Object (sort)
Group-Object (group)
Measure-Object (measure)
Compare-Object (compare, diff)
🌐 REST API と Web リクエスト
# GET リクエスト
$response = Invoke-RestMethod -Uri "https://api.example.com/data" -Method Get
# JSON 本体で POST
$body = @{
name = "John"
age = 30
} | ConvertTo-Json
$response = Invoke-RestMethod -Uri "https://api.example.com/users" `
-Method Post -Body $body -ContentType "application/json"
# ヘッダーと認証を含む
$headers = @{
"Authorization" = "Bearer $token"
"Accept" = "application/json"
}
$response = Invoke-RestMethod -Uri $url -Headers $headers
# ファイルをダウンロード
Invoke-WebRequest -Uri $url -OutFile "file.zip"
🏗️ スクリプト構造のベストプラクティス
<#
.SYNOPSIS
簡潔な説明
.DESCRIPTION
詳細な説明
.PARAMETER Name
パラメータの説明
.EXAMPLE
PS> .\script.ps1 -Name "John"
使用例
.NOTES
作成者: Your Name
バージョン: 1.0.0
日付: 2025-01-01
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string]$Name
)
# スクリプトレベルのエラー処理
$ErrorActionPreference = "Stop"
# ストリクトモードを使用
Set-StrictMode -Version Latest
try {
# メインスクリプトロジック
Write-Verbose "スクリプトを開始"
# ... スクリプトコード ...
Write-Verbose "スクリプトが正常に完了"
}
catch {
Write-Error "スクリプトが失敗しました: $_"
exit 1
}
finally {
# クリーンアップ
}
📚 追加リソース
公式ドキュメント
- PowerShell ドキュメント: https://learn.microsoft.com/powershell
- PowerShell ギャラリー: https://www.powershellgallery.com
- Az モジュールドキュメント: https://learn.microsoft.com/powershell/azure
- Microsoft Graph ドキュメント: https://learn.microsoft.com/graph/powershell
モジュール検出
# キーワード別にモジュールを検索
Find-Module -Tag "Azure"
Find-Module -Tag "Security"
# モジュール内のコマンドを参照
Get-Command -Module Az.Compute
Get-Command -Verb Get -Noun *VM*
# コマンドヘルプを表示
Get-Help Get-AzVM -Full
Get-Help Get-AzVM -Examples
Get-Help Get-AzVM -Online
ヘルプシステムを更新
# ヘルプファイルを更新 (インターネット接続が必須)
Update-Help -Force -ErrorAction SilentlyContinue
# 特定モジュール向けヘルプを更新
Update-Help -Module Az -Force
🎯 クイック判断ガイド
PowerShell 7+ を使用する場合:
- クロスプラットフォーム互換性が必須
- 新しいプロジェクトまたはスクリプト
- パフォーマンスが重要
- モダン言語機能が必要
Windows PowerShell 5.1 を使用する場合:
- Windows 固有モジュール必須 (WSUS、GroupPolicy レガシー)
- 企業環境で厳密なバージョン要件あり
- レガシースクリプト互換性が必須
Azure CLI を選択する場合:
- シンプルなワンライナーが必須
- JSON 出力が優先
- Bash スクリプト統合
PowerShell Az モジュールを選択する場合:
- 複雑な自動化が必須
- オブジェクト操作が必須
- PowerShell スクリプティング技術が利用可能
- 再利用可能なスクリプトやモジュールが必須
✅ スクリプト実行前チェックリスト
PowerShell スクリプトを実行する前に、以下を確認してください:
- ✅ プラットフォーム検出 -
$IsWindows、$IsLinux、$IsMacOSを使用 - ✅ バージョン確認 - 必要に応じて
#Requires -Version 7.0を指定 - ✅ モジュール要件 -
#Requires -Modulesを指定 - ✅ エラー処理 -
try/catchブロックが配置されている - ✅ 入力検証 - パラメータ検証属性を使用
- ✅ エイリアスなし - スクリプト内でフルコマンドレット名を使用
- ✅ パス処理 -
Join-Pathまたは[IO.Path]::Combine()を使用 - ✅ エンコーディング指定 - クロスプラットフォーム向けに UTF-8 を指定
- ✅ 認証情報セキュア - ハードコードなし
- ✅ 詳細ロギング - デバッグ用に
Write-Verboseを使用
🚨 一般的な落とし穴とソリューション
落とし穴: PowerShell 7.5 での Out-GridView 検索が機能しない
# 既知の問題: PowerShell 7.5 での Out-GridView 検索は .NET 9 の変更により非動作
# 回避策: Where-Object または Select-Object でフィルタリング
Get-Process | Where-Object CPU -gt 100 | Format-Table
# または CSV にエクスポートして外部ツールを使用
Get-Process | Export-Csv processes.csv -NoTypeInformation
落とし穴: 大文字小文字の区別
# Linux/macOS は大文字小文字を区別
# ファイルが "File.txt" の場合、これは失敗
Get-Content "file.txt"
# ソリューション: 正確な大文字小文字を使用するか、まず Test-Path を確認
if (Test-Path "file.txt") {
Get-Content "file.txt"
}
落とし穴: 実行ポリシー
# ソリューション: 現在のユーザーに対して設定
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# またはセッション用にバイパス
powershell.exe -ExecutionPolicy Bypass -File script.ps1
落とし穴: モジュールインポート失敗
# ソリューション: モジュール利用可能性を確認してインストール
if (-not (Get-Module -ListAvailable -Name Az)) {
Install-Module -Name Az -Force -Scope CurrentUser
}
Import-Module -Name Az
落とし穴: 配列連結パフォーマンス
# 悪い例: $array += $item (毎回配列を再作成)
# 良い例: ArrayList または List を使用
$list = [System.Collections.Generic.List[object]]::new()
$list.Add($item)
重要: PowerShell ドキュメントとモジュールバージョンを常に最新に保ってから実装してください。PowerShell エコシステムは急速に進化しており、ベストプラクティスは頻繁に更新されます。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- josiahsiegel
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/josiahsiegel/claude-plugin-marketplace / ライセンス: MIT
関連スキル
superpowers-streamer-cli
SuperPowers デスクトップストリーマーの npm パッケージをインストール、ログイン、実行、トラブルシューティングできます。ユーザーが npm から `superpowers-ai` をセットアップしたい場合、メールまたは電話でサインインもしくはアカウント作成を行いたい場合、ストリーマーを起動したい場合、表示されたコントロールリンクを開きたい場合、後で停止したい場合、またはソースコードへのアクセスなしに npm やランタイムの一般的な問題から復旧したい場合に使用します。
catc-client-ops
Catalyst Centerのクライアント操作・監視機能 - 有線・無線クライアントのリスト表示・フィルタリング、MACアドレスによる詳細なクライアント検索、クライアント数分析、時間軸での分析、SSIDおよび周波数帯によるフィルタリング、無線トラブルシューティング機能を提供します。MACアドレスやIPアドレスでのクライアント検索、サイト別やSSID別のクライアント数集計、無線周波数帯の分布分析、Wi-Fi信号の問題調査が必要な場合に活用できます。
ci-cd-and-automation
CI/CDパイプラインの設定を自動化します。ビルドおよびデプロイメントパイプラインの構築または変更時に使用できます。品質ゲートの自動化、CI内のテストランナー設定、またはデプロイメント戦略の確立が必要な場合に活用します。
shipping-and-launch
本番環境へのリリース準備を行います。本番環境へのデプロイ準備が必要な場合、リリース前チェックリストが必要な場合、監視機能の設定を行う場合、段階的なロールアウトを計画する場合、またはロールバック戦略が必要な場合に使用します。
linear-release-setup
Linear Releaseに向けたCI/CD設定を生成します。リリース追跡の設定、LinearのCIパイプライン構築、またはLinearリリースとのデプロイメント連携を実施する際に利用できます。GitHub Actions、GitLab CI、CircleCIなど複数のプラットフォームに対応しています。
tracking-application-response-times
API エンドポイント、データベースクエリ、サービスコール全体にわたるアプリケーションのレスポンスタイムを追跡・最適化できます。パフォーマンス監視やボトルネック特定の際に活用してください。「レスポンスタイムを追跡する」「API パフォーマンスを監視する」「遅延を分析する」といった表現で呼び出せます。