PowerShellは単なる黒い画面ではなく、.NETを核にしたオブジェクト指向シェルです。ぼくたちが普段触るエクスプローラーやコントロール パネルの操作を“文字列”ではなく“オブジェクト”として扱うため、従来のバッチファイルよりずっと強力に自動化が行えます。

PowerShell誕生の背景
PowerShellは2006年、Windows XP時代に「管理者のための統合シェル」として登場しました。古典的なcmd.exeやバッチファイルでは限界だった複雑な管理タスクを安全に、しかも再利用しやすくスクリプト化する目的で生まれました。
オブジェクトが生む三つのメリット
- 型安全性:数値や日付が文字列に化けず、思わぬ変換バグが減少
- 強力なパイプライン:パイプで渡るのは“文字列”ではなく“.NETオブジェクト”。情報を欠損なく受け渡せます
- クロスプラットフォーム:PowerShell 7以降はmacOS、Linuxにも対応し、多様な環境で同じ操作感が得られます
PowerShellを始める前に押さえておくべき基礎設定
見出しの前置きとして、まず安全に実行するためのポリシーや起動方法を整理しましょう。
実行ポリシーを理解する
PowerShellは悪意あるスクリプトの誤実行を防ぐため、初期状態で .ps1
を実行できません。管理者として以下を実行するとローカル署名スクリプトを許可できます。

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
注意:会社PCではポリシー変更が規約違反になる場合があります。必ず担当部署に確認しましょう。
起動とプロファイル
- Windowsキー → 検索欄に「PowerShell」。青いアイコンがクラシック版、黒いアイコンがPowerShell 7です
- プロファイルは起動時に毎回読み込まれる初期化ファイル。
$Profile
と打つとパスが分かるので、エディタで開きエイリアスや関数を登録しましょう。
基本コマンドとファイル操作の“感覚”を身につける
ここでは日常的に使うGet系、Set系コマンドを中心に紹介します。リード文として、まず“cmd.exeのls感覚”から一歩進んだ世界に触れてください。
Get-ChildItem(ls)でディレクトリを覗く
Get-ChildItem C:\Logs -File -Recurse | Where-Object Length -gt 10MB
上記は C:\Logs
内の10 MB超えファイルをサブフォルダー含め抽出する例です。結果はFileInfoオブジェクトなので、| Select-Object Name, Length
で列抽出だけも簡単です。
Copy-Item と Remove-Item
バッチの copy
/del
に相当しますが、パラメーターで排他制御やフィルターコピーも自在。-Recurse
と -Filter
の組み合わせは大量ファイル管理に便利です。
変数とパイプライン
$big = Get-ChildItem . -Recurse | Sort-Object Length -Descending | Select-Object -First 5
$big | Format-Table Name, @{N='MB';E={[math]::Round($_.Length/1MB,2)}}
“5番目に大きいファイル”のように複数パイプを経ても型が保持されるため、バッチより可読性と保守性が高いのが分かります。
バッチファイルとの機能比較
バッチとPowerShell、どちらを使うか迷ったときは“必要機能”で判断しましょう。リード文代わりに「作る苦労 vs 使う便利さ」を天秤にかける視点を示します。
観点 | バッチファイル(.bat/.cmd) | PowerShell(.ps1) |
---|---|---|
主な利用シーン | 単純コピーやアプリ呼び出し | 複雑な条件分岐・ログ集計 |
データ型 | 文字列のみ | オブジェクト |
エラー処理 | if errorlevel のみ | try{} catch{} で例外ハンドリング |
外部API呼び出し | cURL等を別途用意 | Invoke-RestMethod が標準搭載 |
クロスプラットフォーム | Windows限定 | v7以降はMac/Linux対応 |
スクリプト作成術:.ps1をプロジェクト化して再利用する
まず一文リード:小さなワンライナーから一歩進み、構造化スクリプトを書くコツを習得しましょう。
関数化とパラメーター受け渡し
function Compress-OldLogs {
param(
[string]$TargetPath = ".",
[int]$Days = 30
)
$limit = (Get-Date).AddDays(-$Days)
Get-ChildItem $TargetPath -File |
Where-Object LastWriteTime -lt $limit |
Compress-Archive -DestinationPath "$TargetPath\oldlogs.zip"
}
Compress-OldLogs -TargetPath C:\Logs -Days 7
のように呼び出せば、再配布もしやすい自己完結ツールになります。
モジュール化
多数の関数を /Modules/MyTools
に配置し、Import-Module MyTools
でプロジェクト横断利用。Publish-Module
すれば社内リポジトリにも配布できます。
実践例:REST API×JSONパーシングでタスクを自動化
リード文:社内外サービスと連携する際、PowerShellはJSONを標準オブジェクトとして扱えます。
GitHub APIからIssue一覧を取得
$headers = @{ Authorization = "Bearer $env:GITHUB_TOKEN" }
$response = Invoke-RestMethod -Uri "https://api.github.com/repos/owner/repo/issues" -Headers $headers
$response |
Select-Object number, title, state |
Format-Table
バッチではjq等を介す必要がありましたが、PowerShellならInvoke-RestMethod一発で済みます。
GUI操作の自動化:Windows UIAutomationとの出会い
短いリード:PowerShellはGUI操作もスクリプト化できます。ただし脱“なんちゃってRPA”の注意点があります。
UIAutomation三原則
- アクセシビリティツリーの把握:
Inspect.exe
で要素ID確認 - Wait-Process で対象アプリの起動完了を待つ
- Try/Catch で例外的なウィンドウ分岐を管理
コード例は割愛しますが、Add-Type -AssemblyName UIAutomationClient
でCLRクラスを呼び出せばクリック、要素検査、入力まで自動化可能です。
クロスプラットフォーム時代のPowerShell 7
リード:WSLやDockerの普及で“Windows専用”という縛りはもはや過去。PowerShell 7は開発者にも管理者にも同じ体験を提供します。
インストールと特徴
- Microsoft Store や winget:
winget install --id Microsoft.Powershell
- 可搬性:ZIP展開型はUSBからも実行可能
- 新コマンド:
pwsh
コマンドで起動し、ForEach-Object -Parallel
やチェーン演算子&&
||
も利用可能
よくあるエラーとデバッグ術
短いリード:エラーに強い=運用に強い。トラブルシュートの勘所を押さえましょう。
実行ポリシー関連
File X.ps1 cannot be loaded because running scripts is disabled...
→ ポリシー設定不足。Scopeを間違えるとドメインポリシー上書きのリスクがあるのでCurrentUser
推奨。
モジュールロード失敗
Import-Module : The specified module 'xxx' was not loaded because no valid module file...
→ モジュールパス確認。Install-Module -Scope CurrentUser
でユーザー環境に入れると事故が少ないです。
ステップ実行
Set-PSBreakpoint -Line 12
やVS CodeのPowerShell拡張を使い、変数ウォッチやコールスタックの確認が可能です。
まとめと次のステップ
PowerShellは「Windows自動化の最終回答」というより、クラウドも見据えた“統合スクリプト言語”です。小さなファイル操作からREST API、クロスプラットフォーム運用まで、一貫した文法で一気通貫できる点が最大の魅力。あなたの業務フローの中で「毎日繰り返す作業」を書き出し、1つずつPowerShellに置き換えてみてください。きっと“手が空く喜び”を味わえます。
コメント