更新履歴(3件・最終更新 2026年08月02日)
この記事に加えた変更の記録です。アーカイブした更新前のバージョンは、DOI付きの固定URLから読めます。
- 記事の冒頭に「この記事の知識マップ」節を追加しました。本文で扱っている概念とその関係を、要約・図・詳細ページへのリンクにまとめたものです。本文の主張は変えていません。
- 外部レビュー(1283件)への対応として本文を更新しました。個々の変更内容は、この下の履歴を参照してください。
- 目的別の読み方ガイドと、最初に覚える8コマンドの前倒し表を1章に追加しました。5.1と7.xの差異表、`Get-Process`・`Get-ChildItem`・`Get-WinEvent`の既定表示列とその読み方、実用コマンド集との読み分けを補い、参考リンクを3件足しました。
- 初版公開
この記事を引用する(DOI(登録済みアーカイブ): 10.5281/zenodo.21589819)
以下のDOIは過去に登録されたアーカイブを指しており、現在の本文とは一致しない場合があります。現在の本文を参照するときは、このページのURLを使用してください。
小村 豪(2026)「PowerShellコマンドの基本 ── まず覚える操作と安全な使い方」合同会社小村ソフト. https://comcomponent.com/blog/2026/05/29/powershell-command-basics/
- DOI(登録済みアーカイブ)
- 10.5281/zenodo.21589819
- DOI(前回登録した版)
- 10.5281/zenodo.21732831
1. まず結論 ── 暗記より「調べてから実行する」
「ログからエラーを探したい」「古いファイルを整理したい」「調査結果をCSVにまとめたい」。PowerShellは、こうしたWindowsの確認・整理・自動化を、同じ考え方で組み立てられるコマンド環境です。設定確認やサービス操作にも使えますが、最初から長いスクリプトを書く必要はありません。
まずは取得した結果を見る。その結果を絞り、必要な形で保存する。削除や停止などの変更は、対象を確認できてから行います。 基本の流れは次のとおりです。これは処理の順序を表す説明で、実行するコマンドではありません。
探す → 見る → 絞る → 並べる → 出力する → 必要なら変更する
PowerShell の基本は「長いコマンドを暗記すること」ではありません。重要なのは、次の3つです。
Get-CommandとGet-Helpでコマンドを調べられること|パイプラインで結果を次のコマンドへ渡せること- 削除・停止・変更の前に
-WhatIfや-Confirmで影響を確認すること
PowerShell は「調査」と「変更」を同じ画面で実行できます。便利な反面、削除や停止もすぐ実行できるため、読み取り専用の確認から始める癖が重要です。
本文のパスは例です。コピー・書き込み・移動・削除を試す際は、本番データではなく練習用のファイルを使ってください。コード例を上から一括実行するのではなく、各節で対象と出力を確かめながら進めます。
この記事のコードは、テーマ別スクリプト集とPesterテストを含むサンプル一式としてGitHubでも公開しています。一時フォルダーに練習用ワークスペースを作って試せる構成です。
powershell-command-basics - komurasoft-blog-samples (GitHub)
この記事の読み方
この記事は16章です。まず2〜5章で環境・調べ方・結果の加工・ファイルの読み取りを押さえ、必要な作業へ進んでください。変更系のコマンドを試す前には、9章の確認手順を読みます。
| 目的 | 読む章 |
|---|---|
| これからPowerShellを触る | 2〜5章(環境、調べ方、パイプライン、読み取り)と15章(覚える順番) |
| ログや設定を調査する | 5章(テキスト)、8章(Windowsの調査)、12章(ログ調査の実務例) |
| CSVやJSONを加工する | 6章(変数と結果の組み立て)、7章(CSV・JSON) |
| 処理をスクリプトにまとめる | 6章(変数)、11章(.ps1・実行ポリシー・エラー処理)、12章(完成例) |
| 削除・移動・停止を行う | 9章(確認手順)→10章(操作例)→13章(アーカイブ例)。実行前に15.2のチェックリストも確認する |
| コマンドや対処を引く | 14章(基本コマンド一覧・つまずき) |
最初に手元へ置くのは、Get-Command、Get-Help、Get-Member、Get-Location、Set-Location、Get-ChildItem、Get-Content、Select-Stringの8つで十分です。15章では「見る・探す → 絞る・整える → 入出力する → 変更する」の4段階に分けて、次に覚えるコマンドを整理しています。
「実用コマンド集」との読み分け
PowerShell の記事はもう1本あります。役割が違うので、次のように使い分けてください。
| 記事 | 扱う内容 | 読むタイミング |
|---|---|---|
| この記事(基本) | 操作体系。コマンドの探し方、パイプラインの考え方、変更系を安全に実行する順番 | 最初に読む |
| PowerShell実用コマンド集 | 目的別の部品。件数や合計の集計(Measure-Object)、種類ごとの集計(Group-Object)、差分比較(Compare-Object)、作業ログの記録(Start-Transcript)など |
実作業で「これをやりたい」が出てきたとき |
CSV、プロセス、サービス、イベントログ、Format-* の注意点は両方に出てきます。この記事では「なぜその形で書くのか」を、実用コマンド集では「その場面で使う部品」を扱っています。
flowchart TB
accTitle: PowerShellで調査から変更へ進む順序
accDescr: コマンドを調べ、対象を取得して加工し、保存した結果を確認した後に必要な変更だけを実行する流れを示す。
a["コマンドと使い方を調べる"] --> b["対象を見る・絞る"]
b --> c["列を整え、結果を保存"]
c --> d{"変更が必要か"}
d -->|"いいえ"| e["調査結果を共有"]
d -->|"はい"| f["予行・確認の後に実行"]
図1: 読み取りと変更を分け、変更は対象を確認してから行う。
図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全20件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle
2. 実行環境と「オブジェクト」を押さえる
Windows には、昔から入っている Windows PowerShell 5.1 と、新しい系統の PowerShell 7.x があります。
実務では、次のように考えると分かりやすいです。
| 種類 | 実行ファイル | 主な用途 |
|---|---|---|
| Windows PowerShell 5.1 | powershell.exe |
古い Windows 専用モジュール、既存スクリプト、社内資産の保守 |
| PowerShell 7.x | pwsh.exe |
新規スクリプト、クロスプラットフォーム、継続的な機能改善 |
新しく学ぶ場合は PowerShell 7.x を基準にして問題ありません。ただし、社内の古い管理スクリプトや Windows 固有のモジュールは、Windows PowerShell 5.1 前提で作られていることがあります。
そのため、実務では最初にバージョンを確認します。
$PSVersionTable
特定バージョン以上で動かしたいスクリプトには、先頭に条件を書いておくと事故を減らせます。
#Requires -Version 7.0
2.1 バージョンと文字コードの違い
以降のサンプルは、特に断りがない限り Windows PowerShell 5.1 と PowerShell 7.x のどちらでもそのまま動く範囲で書いています。ただし、同じコマンドでも次の点は結果が変わるので、写す前に確認してください。
| 違いが出るところ | Windows PowerShell 5.1 | PowerShell 7.x |
|---|---|---|
Get-Process の既定の表示列 |
Handles、NPM(K)、PM(K)、WS(K)、CPU(s)、Id、SI、ProcessName |
NPM(K)、PM(M)、WS(M)、CPU(s)、Id、SI、ProcessName(メモリが MB 単位) |
-Encoding UTF8 の意味 |
UTF-8(BOM あり) | UTF-8(BOM なし)。BOM を付けたいときは utf8BOM を指定する |
-Encoding を省略したとき |
コマンドごとに異なる(Out-File は UTF-16LE、Set-Content は ANSI、Export-Csv は ASCII) |
すべて utf8NoBOM |
この記事のサンプルでは、意図しない文字コードを避けるために、書き出し系のコマンドには -Encoding UTF8 を明示しています。BOM の有無と改行コードの考え方そのものは、Windows の文字コードと改行コードを整理するで扱っています。
flowchart TB
accTitle: 実行環境を確認してからサンプルを使う
accDescr: powershell.exeとpwsh.exeの実行環境を確認して、既存資産の前提と出力文字コードを照合してからサンプルを使う流れを示す。
a["実行ファイルと版を確認"] --> b["既存スクリプトの前提を確認"]
b --> c["出力列・文字コードを照合"]
c --> d["対象環境でサンプルを試す"]
図2: 同じコマンドでも表示や文字コードは異なるので、先に実行環境を確認する。
2.2 コマンドプロンプトとの違いは、結果の扱い方
PowerShell は、従来のコマンドプロンプト(cmd.exe)と似て見えますが、内部の考え方が違います。
| 観点 | コマンドプロンプト | PowerShell |
|---|---|---|
| 主な出力 | 文字列 | オブジェクト |
| コマンド名 | dir、copy など |
Get-ChildItem、Copy-Item など |
| 結果の加工 | 文字列処理が中心 | プロパティを使って絞り込み・並べ替え |
| 自動化 | バッチファイル | .ps1 スクリプト |
| 得意分野 | 古いコマンド資産との互換 | Windows 管理、CSV、JSON、API、定型作業 |
たとえば、ファイル一覧を取得する場合、cmd.exe では dir の表示結果を文字列として眺めることが多くなります。PowerShell では、ファイルが Name、Length、LastWriteTime などのプロパティを持つオブジェクトとして扱われます。
Get-ChildItem
この違いが分かると、次のように「7日以内に更新されたファイルだけを、更新日時の新しい順に表示する」といった処理が自然に書けます。
Get-ChildItem -File |
Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) } |
Sort-Object LastWriteTime -Descending |
Select-Object Name, Length, LastWriteTime
この時点では長いパイプラインを覚えなくて構いません。「ファイル名などの文字を読み取って加工する」のではなく、「オブジェクトのプロパティを選んで加工する」と押さえ、具体的なつなぎ方は4章で確認します。
flowchart TB
accTitle: 画面に見える表とオブジェクトのプロパティ
accDescr: Get-ChildItemで取得したファイルオブジェクトは画面では表として表示される一方、パイプラインではNameやLengthなどのプロパティを条件や出力に使えることを示す。
a["Get-ChildItemで取得"] --> b["ファイルのオブジェクト"]
b --> c["画面では一覧表として表示"]
b --> d["Name・Lengthなどを利用"]
d --> e["条件で絞り、並べる"]
図3: 表示される文字列だけでなく、元のオブジェクトのプロパティを使う。
3. コマンドを探し、使い方と中身を調べる
3.1 名前の形はVerb-Noun、保存するスクリプトでは正式名を使う
PowerShellの標準コマンドは、基本的に動詞-名詞の形です。まず名前から目的を推測し、正確な使い方はヘルプで確かめます。
Get-Process
Get-Service
Get-ChildItem
Copy-Item
Remove-Item
Export-Csv
この形を覚えると、未知のコマンドも探しやすくなります。
| 動詞 | 意味 | 例 |
|---|---|---|
Get |
取得する | Get-Process |
Set |
設定する | Set-Location |
New |
作成する | New-Item |
Copy |
コピーする | Copy-Item |
Move |
移動する | Move-Item |
Remove |
削除する | Remove-Item |
Start |
開始する | Start-Service |
Stop |
停止する | Stop-Process |
Import |
読み込む | Import-Csv |
Export |
書き出す | Export-Csv |
dir、ls、cat、cd のような短い名前も使えますが、多くはエイリアスです。
Get-Command dir
スクリプトとして残す場合は、エイリアスではなく正式名を使う方が安全です。
# 読めるが、スクリプトでは避けたい
ls *.log
# 意図が明確
Get-ChildItem -Filter *.log
3.2 調査の入口はGet-Command・Get-Help・Get-Member
PowerShell はコマンドの数が多いため、暗記よりも「調べ方」を覚える方が実務的です。
1. Get-Command ── 使えるコマンドを探す
Get-Command は、インストールされているコマンド、関数、エイリアス、アプリケーションを探すためのコマンドです。
# Process という名詞を持つコマンドを探す
Get-Command -Noun Process
# Service 関連のコマンドを探す
Get-Command *Service*
# CSV 関連のコマンドを探す
Get-Command *Csv*
コマンド名がうろ覚えのときは、ワイルドカードを使います。
Get-Command *Item*
Get-Command *Content*
Get-Command *Json*
2. Get-Help ── 使い方を見る
Get-Help は、コマンドの説明、パラメーター、例を確認するためのコマンドです。
Get-Help Get-ChildItem
Get-Help Get-ChildItem -Examples
Get-Help Get-ChildItem -Full
Get-Help Get-ChildItem -Online
最初は -Examples が便利です。
Get-Help Where-Object -Examples
ヘルプが古い、または不足している場合は、管理者権限の PowerShell でヘルプを更新します。
Update-Help
環境によってはインターネット接続や権限が必要です。会社 PC では、プロキシや管理ポリシーにより失敗することもあります。
3. Get-Member ── オブジェクトの中身を見る
PowerShell の出力は、多くの場合「文字列」ではなく「オブジェクト」です。Get-Member を使うと、そのオブジェクトがどのようなプロパティやメソッドを持っているか確認できます。
Get-Process | Get-Member
Get-Service | Get-Member
Get-ChildItem | Get-Member
たとえば、サービスには Status や Name などのプロパティがあります。
Get-Service | Select-Object Name, Status
ファイルには Name、Length、LastWriteTime などがあります。
Get-ChildItem -File | Select-Object Name, Length, LastWriteTime
「何で絞ればよいか分からない」ときは、まず
Get-Memberでプロパティ名を確認します。
flowchart TB
accTitle: コマンド名からプロパティまで調べる
accDescr: Get-Commandで候補を探し、Get-Helpで引数や使用例を調べ、Get-Memberで絞り込みに使うプロパティを確認する流れを示す。
a["名前が分からない"] --> b["Get-Commandで探す"]
b --> c["Get-Helpで例・引数を確認"]
c --> d["Get系で対象を取得"]
d --> e["Get-Memberで中身を確認"]
e --> f["使うプロパティを決める"]
図4: コマンド名、引数、プロパティ名は、それぞれ対応する調査コマンドで確かめる。
4. パイプラインで絞る・並べる・出力する
PowerShell の | は、左のコマンドの結果を右のコマンドへ渡します。
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10
この例は、次の処理を左から右へ行います。下のブロックは処理の説明です。なお、ここで並べているCPUは累積のプロセッサ時間であり、その瞬間のCPU使用率ではありません。
プロセス一覧を取得
→ CPU 使用量で降順に並べる
→ 上位10件だけ表示
flowchart TB
accTitle: パイプラインで処理の責任を分ける
accDescr: 取得したオブジェクトを条件で絞り、順番を整えてから必要な列や件数を選ぶことで、各段階の結果を確認できることを示す。
a["Get系で取得"] --> b["Where-Objectで絞る"]
b --> c["Sort-Objectで並べる"]
c --> d["Select-Objectで列・件数を選ぶ"]
d --> e["結果を確認・保存"]
図5: 長いコマンドは、取得・条件・順序・出力に分けて読む。
4.1 画面の列名とプロパティ名を区別する
Get-Process の結果は、既定では次の列を持つ表として表示されます。値は環境ごとに違うので、確認するのは「列の並び」です。
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
| 列 | 意味 |
|---|---|
NPM(K) |
非ページプールのメモリ使用量(KB) |
PM(M) |
ページング可能なメモリ使用量(MB) |
WS(M) |
ワーキングセット(最近参照されたメモリページ)のサイズ(MB) |
CPU(s) |
全プロセッサで使用したプロセッサ時間(秒) |
Id |
プロセス ID |
SI |
セッション ID |
ProcessName |
プロセス名 |
これは PowerShell 7.x の既定表示です。Windows PowerShell 5.1 では先頭に Handles(開いているハンドル数)が付き、メモリの列が PM(K)・WS(K) と KB 単位になります。列名が違っても、Sort-Object や Where-Object で指定するプロパティ名(CPU、WorkingSet、Id、Name など)は共通です。表示用の列名とプロパティ名は別物なので、絞り込みの条件が効かないときは Get-Process | Get-Member で本当のプロパティ名を確認します。
よく使う組み合わせは次の通りです。
| コマンド | 役割 | 例 |
|---|---|---|
Where-Object |
条件で絞る | 停止中のサービスだけ取得 |
Sort-Object |
並べる | 更新日時の新しい順に並べる |
Select-Object |
列や件数を選ぶ | 名前とサイズだけ表示 |
ForEach-Object |
各要素に処理する | ファイルごとに処理する |
Export-Csv |
CSV に出力する | 調査結果を保存する |
4.2 Where-Objectで絞る
# 停止中のサービスだけ表示
Get-Service | Where-Object { $_.Status -eq "Stopped" }
# 100MB を超えるファイルだけ表示
Get-ChildItem -File |
Where-Object { $_.Length -gt 100MB }
# 名前に backup を含むファイルだけ表示
Get-ChildItem -File |
Where-Object { $_.Name -like "*backup*" }
$_ は、パイプラインで流れてきた現在のオブジェクトを表します。
Where-Object { $_.Length -gt 100MB }
これは「現在見ているファイルの Length が 100MB より大きいか」を判定しています。
PowerShell 3.0 以降では、簡略構文も使えます。
Get-Service | Where-Object Status -EQ "Stopped"
ただし、初心者のうちは scriptblock 構文の方が意味を追いやすいです。
Get-Service | Where-Object { $_.Status -eq "Stopped" }
4.3 Sort-Objectで並べる
# メモリ使用量の大きい順
Get-Process |
Sort-Object WorkingSet -Descending |
Select-Object -First 10 Name, Id, WorkingSet
# 更新日時の新しい順
Get-ChildItem -File |
Sort-Object LastWriteTime -Descending |
Select-Object -First 20 Name, LastWriteTime
4.4 Select-Objectで列と件数を選ぶ
Get-Process |
Select-Object Name, Id, CPU, WorkingSet
件数を絞るときにも使います。
Get-Process | Select-Object -First 5
Get-Process | Select-Object -Last 5
CSV に出す前は、Select-Object で必要な列だけに整理しておくと扱いやすくなります。
Get-Service |
Select-Object Name, DisplayName, Status, StartType |
Export-Csv .\services.csv -NoTypeInformation -Encoding UTF8
4.5 Format系は画面表示の最後に置く
PowerShell には、表示を整えるためのコマンドがあります。
Format-Table
Format-List
Format-Wide
これらは「画面表示用」です。CSV に出力する前や、後続処理に渡す前に使うと、元のプロパティではなく表示用オブジェクトになってしまいます。
# 避ける: CSV に表示用情報が混ざる
Get-Process |
Format-Table Name, CPU |
Export-Csv .\process.csv -NoTypeInformation
# 正しい: 先にプロパティを選んで CSV 出力
Get-Process |
Select-Object Name, CPU |
Export-Csv .\process.csv -NoTypeInformation -Encoding UTF8
Format-*は「最後に画面へ見せるため」と覚えると事故が減ります。
flowchart TB
accTitle: 加工用データと表示用データを分ける
accDescr: 元のオブジェクトから必要なプロパティを選び、保存するときはCSVやJSONへ、画面を見るときは最後にFormat系へ渡す分岐を示す。
a["元のオブジェクト"] --> b["必要なプロパティを選ぶ"]
b --> c{"用途を選ぶ"}
c -->|"保存・後続処理"| d["CSV・JSONへ渡す"]
c -->|"画面表示"| e["最後にFormat系を使う"]
図6: Format系を挟む前に、保存や後続処理へ渡すデータを用意する。
5. ファイルとテキストを読み取る
PowerShell で最もよく使うのは、ファイルやフォルダーの操作です。
| やりたいこと | コマンド |
|---|---|
| 現在の場所を見る | Get-Location |
| 場所を移動する | Set-Location |
| 一覧を見る | Get-ChildItem |
| ファイル・フォルダーを作る | New-Item |
| コピーする | Copy-Item |
| 移動する | Move-Item |
| 名前を変える | Rename-Item |
| 削除する | Remove-Item |
| 存在確認する | Test-Path |
5.1 現在の場所とパスを確認する
Get-Location
移動します。
Set-Location C:\Work
パスに空白が含まれる場合は引用符で囲みます。
Set-Location "C:\Work Files\Reports"
5.2 範囲を限定してファイルを探す
Get-ChildItem
Get-ChildItem -File
Get-ChildItem -Directory
Get-ChildItem -Recurse
実行すると、対象フォルダーの見出しの下に、次の列の表が表示されます。
Directory: C:\Work
Mode LastWriteTime Length Name
---- ------------- ------ ----
Mode は属性を表す文字で、d がディレクトリ、a がアーカイブ属性、r が読み取り専用、h が隠し、s がシステム、l がリンクです。ディレクトリの行では Length(サイズ)が空欄になります。ここに出ている LastWriteTime や Length が、そのまま Where-Object や Sort-Object で使えるプロパティ名です。
拡張子で絞る場合は -Filter が便利です。
Get-ChildItem -Filter *.log
サブフォルダーも含めて検索する場合は -Recurse を使います。
Get-ChildItem C:\Logs -Filter *.log -Recurse
大量のファイルがある場所では、いきなり -Recurse せず、対象フォルダーを限定してから実行します。
一覧の取得に慣れてから、10章の作成・コピー・移動・削除へ進みます。表にある変更系コマンドを試す際は、先に9章の確認手順を読んでください。
flowchart TB
accTitle: ファイル検索は対象範囲を狭めてから広げる
accDescr: 現在の場所と対象フォルダーを確かめ、ファイル種別を絞ってから必要な場合にだけサブフォルダーを再帰検索する流れを示す。
a["現在の場所・パスを確認"] --> b["対象フォルダーを限定"]
b --> c["File・Filterで絞る"]
c --> d{"下位フォルダーも必要か"}
d -->|"はい"| e["Recurseを付けて確認"]
d -->|"いいえ"| f["現在の範囲で結果を確認"]
図7: 再帰検索は最初から広げず、対象フォルダーと条件を決めてから使う。
5.3 テキストを読む・必要な行を探す
ログ調査では、テキストファイル操作をよく使います。
ファイルを読む
Get-Content .\app.log
末尾だけ見る場合は -Tail を使います。
Get-Content .\app.log -Tail 50
追記されるログを眺める場合は -Wait を使います。
Get-Content .\app.log -Tail 20 -Wait
文字列を検索する
Select-String -Path .\app.log -Pattern "ERROR"
複数ファイルを対象にできます。
Select-String -Path .\logs\*.log -Pattern "ERROR", "WARN"
検索結果から、ファイル名・行番号・内容を取り出して CSV にすることもできます。
Select-String -Path .\logs\*.log -Pattern "ERROR" |
Select-Object Path, LineNumber, Line |
Export-Csv .\error-lines.csv -NoTypeInformation -Encoding UTF8
flowchart TB
accTitle: ログのファイル情報から行の検索へ進む
accDescr: ファイルの一覧を取得する段階と、Get-Contentで内容を読む段階、Select-Stringで該当行を検索して証跡をCSV化する段階を分けて示す。
a["調べるログファイルを決める"] --> b{"何を確認するか"}
b -->|"内容・末尾"| c["Get-Contentで読む"]
b -->|"条件に合う行"| d["Select-Stringで検索"]
d --> e["Path・LineNumber・Lineを選ぶ"]
e --> f["CSVで調査結果を保存"]
図8: ファイルの情報とファイル内の行を分け、必要な段階で検索する。
6. 変数を使い、結果のオブジェクトを組み立てる
短いコマンドだけでも作業できますが、少し長くなると変数が便利です。
6.1 変数に条件や結果を置く
$path = "C:\Logs"
Get-ChildItem $path
PowerShell の変数は $ で始まります。
$today = Get-Date
$limit = (Get-Date).AddDays(-30)
6.2 配列の各要素を処理する
$extensions = @("*.log", "*.txt", "*.csv")
foreach ($ext in $extensions) {
Get-ChildItem C:\Work -Filter $ext
}
6.3 ハッシュテーブルでパラメーターをまとめる
ハッシュテーブルは、キーと値の組み合わせです。
$params = @{
Path = "C:\Logs"
Filter = "*.log"
Recurse = $true
}
Get-ChildItem @params
この @params のような書き方を「スプラッティング」と呼びます。パラメーターが増えたときに読みやすくなります。
flowchart TB
accTitle: 変数とスプラッティングで変更箇所をまとめる
accDescr: パスや期限を変数に置き、複数の引数をハッシュテーブルへまとめてコマンドに渡すことで、後から条件を変える場所を明確にする流れを示す。
a["パス・期限・検索条件"] --> b["変数やハッシュテーブルに置く"]
b --> c["コマンドへ渡す"]
c --> d["取得結果を加工する"]
a -.-> e["条件変更は値の側で行う"]
図9: 条件を値として分けると、コマンドの構造を保ったまま変更しやすくなる。
6.4 PSCustomObjectで出力する列を作る
調査結果を表形式でまとめたいときは、[pscustomobject] が便利です。
[pscustomobject]@{
ComputerName = $env:COMPUTERNAME
UserName = $env:USERNAME
CheckedAt = Get-Date
}
複数の結果を作って CSV にできます。
Get-ChildItem C:\Logs -Filter *.log |
ForEach-Object {
[pscustomobject]@{
Name = $_.Name
FullName = $_.FullName
SizeMB = [math]::Round($_.Length / 1MB, 2)
LastWriteTime = $_.LastWriteTime
}
} |
Export-Csv .\log-files.csv -NoTypeInformation -Encoding UTF8
flowchart TB
accTitle: 調査結果を自分の列に整える
accDescr: ファイルごとに名前やサイズなどの値を取り出してPSCustomObjectを作り、同じ列を持つ結果をCSVへ出力する流れを示す。
a["ファイルなどの取得結果"] --> b["ForEach-Objectで各要素を処理"]
b --> c["PSCustomObjectに列と値を作る"]
c --> d["そろえた列をCSVへ出力"]
図10: 既存の列を選ぶだけでは足りないときは、必要な結果のオブジェクトを作る。
7. CSVとJSONを読み込み、加工して保存する
7.1 CSVは列名をプロパティとして扱う
業務自動化では、CSVは非常によく出てきます。PowerShell では、CSV を文字列ではなく「列を持ったオブジェクト」として扱えます。
CSV を読み込む
たとえば、次のような users.csv があるとします。
Name,Department,Enabled
Suzuki,Sales,true
Tanaka,Accounting,false
Sato,Sales,true
読み込みます。
$users = Import-Csv .\users.csv
$users
列名がプロパティになります。
$users | Select-Object Name, Department
条件で絞る
$users |
Where-Object { $_.Department -eq "Sales" }
CSV の値は文字列として入ることが多いため、true / false や数値を扱う場合は注意します。
$users |
Where-Object { $_.Enabled -eq "true" }
CSV に出力する
$users |
Where-Object { $_.Department -eq "Sales" } |
Export-Csv .\sales-users.csv -NoTypeInformation -Encoding UTF8
Export-Csv の前に Format-Table を入れないのが鉄則です。
# 避ける
$users | Format-Table | Export-Csv .\out.csv -NoTypeInformation
# 正しい
$users | Select-Object Name, Department, Enabled | Export-Csv .\out.csv -NoTypeInformation -Encoding UTF8
flowchart TB
accTitle: CSVの列を使って対象を抽出する
accDescr: CSVを列付きのオブジェクトとして読み込み、文字列である値の意味を確認して条件で絞り、表示用のFormat系を挟まずにCSVへ戻す流れを示す。
a["Import-Csvで読み込む"] --> b["列名をプロパティとして使う"]
b --> c["値の型を確認して絞る"]
c --> d["必要な列を選ぶ"]
d --> e["Export-Csvで保存"]
図11: 列名で参照し、文字列のtrueやfalseを値の意味と取り違えない。
7.2 JSONは変換の向きと階層を確認する
設定ファイルや Web API では JSON もよく使います。
$data = Get-Content .\settings.json -Raw | ConvertFrom-Json
$data
オブジェクトを JSON に変換します。
[pscustomobject]@{
Name = "BatchJob"
Enabled = $true
Retry = 3
} | ConvertTo-Json
深い階層を含む場合は -Depth を指定します。
$config | ConvertTo-Json -Depth 10 | Set-Content .\settings.json -Encoding UTF8
CSV・JSONの書き出しもファイルへの変更です。保存先と文字コードを確認し、画面の表示だけを整えたい場合とは分けて扱います。文字コードの差は2.1、テキストの書き込み例は10.5を参照してください。
flowchart TB
accTitle: JSONの文字列とオブジェクトを変換する
accDescr: 設定ファイル全体を読み込んでJSONからオブジェクトへ変換し、加工後は必要な階層を指定してJSONへ戻して保存する流れを示す。
a["JSONファイルをRawで読む"] --> b["ConvertFrom-Json"]
b --> c["オブジェクトとして扱う"]
c --> d["ConvertTo-Jsonで戻す"]
d --> e["階層と文字コードを確認し保存"]
図12: 読み込む向きと書き出す向きを分け、深い階層にはDepthを指定する。
8. プロセス・サービス・イベントログを調べる
実行中のプログラム、サービスの状態、過去に記録されたイベントは、別の対象として調べます。この章では読み取りと結果の保存を扱い、プロセス停止・サービス再起動は10.6で扱います。
8.1 プロセスの状態を見る
Get-Process
メモリ使用量の大きいプロセスを確認します。
Get-Process |
Sort-Object WorkingSet -Descending |
Select-Object -First 10 Name, Id, WorkingSet
名前で絞ります。
Get-Process -Name notepad
8.2 サービスの状態を見る
Get-Service
停止中のサービスだけ見る場合です。
Get-Service |
Where-Object { $_.Status -eq "Stopped" }
名前で絞ります。
Get-Service -Name "Spooler"
8.3 イベントログを絞り、詳細を読む
Windows の調査ではイベントログが欠かせません。
まず、Systemログの直近100件を取得し、その中からエラーを絞る例です。「エラーを100件取得する」という意味ではない点に注意します。以下のLevelDisplayNameの文字列条件は、表示名が英語の環境を前提にした例です。
Get-WinEvent -LogName System -MaxEvents 100 |
Where-Object { $_.LevelDisplayName -eq "Error" } |
Select-Object TimeCreated, ProviderName, Id, Message
出力はどのように表示されるか
Get-WinEvent の結果は、既定ではログの提供元(ProviderName)ごとに見出しが付き、その下に次の列の表が並びます。
ProviderName: PowerShell
TimeCreated Id LevelDisplayName Message
----------- -- ---------------- -------
上の例のように Select-Object で列を選ぶと、この提供元の見出しは付かず、選んだ列だけの表になります。Message は長いため画面では途中で切れます。1件を最後まで読みたいときは、対象を1件に絞ってから Format-List で表示します。
Get-WinEvent -LogName System -MaxEvents 1 | Format-List *
英語環境のLevelDisplayNameには、Critical、Error、Warning、Information、Verboseなどが入ります。表示名はローカライズされるため、日本語などの環境では実際の値を確認してください。件数が多いログでは、Where-Object で絞るより -FilterHashtable に条件を渡す方が速くなります(Level = 3 が警告、Level = 4 が情報です)。
アプリケーションログの直近50件を見ます。
Get-WinEvent -LogName Application -MaxEvents 50 |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message
期間で絞る場合です。
$start = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{
LogName = "System"
StartTime = $start
} |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message
調査結果は CSV に残しておくと、後で共有しやすくなります。
Get-WinEvent -LogName System -MaxEvents 500 |
Where-Object { $_.LevelDisplayName -in @("Error", "Warning") } |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Export-Csv .\system-events.csv -NoTypeInformation -Encoding UTF8
flowchart TB
accTitle: 調査対象と出力の読み方を分ける
accDescr: プロセスやサービスは現在の状態として調べ、イベントログは期間や件数を絞って読み、長いメッセージは一件を詳細表示して、共有用の結果はCSVへ保存する流れを示す。
a["調査する対象を決める"] --> b["対象名・期間・件数で絞る"]
b --> c{"結果の使い道"}
c -->|"長い内容を読む"| d["1件をFormat-Listで確認"]
c -->|"記録・共有"| e["必要な列をCSVへ保存"]
図13: 現在の状態とイベントの記録を分け、表示と保存も使い分ける。
9. 変更は「見る・絞る・記録・予行・実行」の順に進める
PowerShell では、削除・移動・停止のような変更系コマンドを安全に扱う手順が重要です。
基本は次の順番です。下のブロックは手順の説明であり、まとめて実行するコードではありません。
1. Get 系で対象を見る
2. Where-Object で絞る
3. Select-Object で対象一覧を確認する
4. Export-Csv で記録する
5. -WhatIf で変更予定を確認する
6. 本実行する
以下は30日より古い.tmpファイルを削除する例です。C:\Tempをそのまま実行対象にせず、練習用のフォルダーで各段階を確認してください。最後の実行例は実際に削除します。
-WhatIfは変更予定の確認、-Confirmは実行時の確認に使います。対応するコマンドのパラメーターをGet-Helpで確認し、どのコマンドにも無条件に付けられるものとは扱わないでください。
Step 1: 対象を見る
Get-ChildItem C:\Temp -Filter *.tmp -File -Recurse
Step 2: 条件で絞る
$limit = (Get-Date).AddDays(-30)
Get-ChildItem C:\Temp -Filter *.tmp -File -Recurse |
Where-Object { $_.LastWriteTime -lt $limit }
Step 3: 必要な列だけ表示する
$targets = Get-ChildItem C:\Temp -Filter *.tmp -File -Recurse |
Where-Object { $_.LastWriteTime -lt $limit }
$targets |
Select-Object FullName, Length, LastWriteTime
Step 4: 証跡を残す
$targets |
Select-Object FullName, Length, LastWriteTime |
Export-Csv .\delete-targets.csv -NoTypeInformation -Encoding UTF8
Step 5: WhatIf で確認する
$targets | Remove-Item -WhatIf
Step 6: 実行する
$targets | Remove-Item
この順番にすると、「何を消したのか分からない」という事故を減らせます。
flowchart TB
accTitle: 同じ対象を確認してから変更する
accDescr: Get系で取得し条件を絞った対象を変数に保持して一覧と証跡を確認し、WhatIfの結果に問題がなければ本実行する流れを示す。
a["Get系で取得し条件を絞る"] --> b["targetsに対象を保持"]
b --> c["一覧を確認してCSVに記録"]
c --> d["WhatIfで予行"]
d --> e{"対象・影響に問題はないか"}
e -->|"問題あり"| a
e -->|"問題なし"| f["本実行"]
図14: 対象を画面と記録で確かめ、予行の結果に問題があれば実行せず条件へ戻る。
10. ファイルの変更とプロセス・サービスの操作
この章は状態を変える操作です。 9章の確認手順を前提に、練習用の対象で試してください。コードを読む順序と実行する順序を混同せず、本実行は対象・保存先・影響を確認した後に行います。
10.1 存在を確認して作成する
# フォルダー作成
New-Item -ItemType Directory -Path .\archive
# 空ファイル作成
New-Item -ItemType File -Path .\memo.txt
既に存在する可能性がある場合は、先に確認します。
if (-not (Test-Path .\archive)) {
New-Item -ItemType Directory -Path .\archive
}
10.2 保存先と上書きを確認してコピーする
Copy-Item .\report.xlsx .\backup\report.xlsx
フォルダーごとコピーする場合は -Recurse を使います。
Copy-Item .\data .\backup\data -Recurse
上書きが絡む場合は、事前に影響を確認します。
Copy-Item .\data .\backup\data -Recurse -WhatIf
10.3 予行してから移動する
Move-Item .\old.log .\archive\old.log
複数ファイルを条件で移動する場合は、最初に -WhatIf を付けます。
Get-ChildItem .\logs -Filter *.log |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Move-Item -Destination .\archive -WhatIf
問題なければ -WhatIf を外します。
Get-ChildItem .\logs -Filter *.log |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Move-Item -Destination .\archive
10.4 対象を確かめて削除する
削除は特に慎重に扱います。
Remove-Item .\old.log -WhatIf
対象が正しいことを確認してから実行します。
Remove-Item .\old.log
ワイルドカードと -Recurse の組み合わせは強力です。最初から本番フォルダーで実行せず、一覧表示で確認します。
# まず対象を確認
Get-ChildItem C:\Logs -Filter *.tmp -Recurse |
Select-Object FullName, Length, LastWriteTime
# 次に削除予定を確認
Get-ChildItem C:\Logs -Filter *.tmp -Recurse |
Remove-Item -WhatIf
# 最後に実行
Get-ChildItem C:\Logs -Filter *.tmp -Recurse |
Remove-Item
10.5 テキストを書き込む・追記する
Set-Contentは内容の書き込み、Add-Contentは追記に使います。既存ファイルを残す必要があるか、どこへ書き込むかを確認してから実行します。
"hello" | Set-Content .\memo.txt -Encoding UTF8
"next line" | Add-Content .\memo.txt -Encoding UTF8
コマンド結果を保存する場合は、Out-File より Export-Csv や ConvertTo-Json の方が後で扱いやすいことがあります。
Get-Process |
Select-Object Name, Id, CPU |
Export-Csv .\process.csv -NoTypeInformation -Encoding UTF8
10.6 プロセス停止・サービス再起動も、対象確認を先にする
8章で現在の状態を調べた後に、変更が本当に必要かを判断します。
停止は慎重に行います。
Stop-Process -Name notepad -WhatIf
問題なければ実行します。
Stop-Process -Name notepad
再起動する場合も、対象確認を先に行います。
Get-Service -Name "Spooler"
Restart-Service -Name "Spooler" -WhatIf
サービス操作は業務影響が出やすいため、本番環境では手順書、メンテナンス時間、復旧方法を先に確認します。
flowchart TB
accTitle: 変更コマンドを実行する前の確認
accDescr: 作成やコピー、移動や削除、プロセス停止やサービス操作の前に対象と既存データへの影響を確認し、予行と復旧手順をそろえてから実行する流れを示す。
a["対象と操作を特定する"] --> b["保存先・上書き・業務影響を確認"]
b --> c["記録・予行・復旧手順を用意"]
c --> d["必要な変更だけ実行"]
図15: ファイル操作もサービス操作も、対象だけでなく変更先と復旧方法まで確認する。
11. 処理を.ps1にまとめ、実行条件とエラーを扱う
11.1 paramで入力を受け取る
短いコマンドで結果を確かめたら、よく使う処理を.ps1ファイルにまとめます。パス・日数・出力先をparam()で受け取り、条件だけを変えて再利用できる形にします。
例として、古いログを一覧化するスクリプトを作ります。
# Find-OldLogs.ps1
param(
[string]$Path = "C:\Logs",
[int]$Days = 30,
[string]$OutputPath = ".\old-logs.csv"
)
$limit = (Get-Date).AddDays(-$Days)
Get-ChildItem -Path $Path -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -lt $limit } |
Select-Object FullName, Length, LastWriteTime |
Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8
Write-Host "Exported: $OutputPath"
実行例です。
.\Find-OldLogs.ps1 -Path C:\Logs -Days 60 -OutputPath .\old-logs.csv
引数を param() で受け取ると、後から条件を変えやすくなります。
11.2 実行できないときはポリシーと組織のルールを確認する
.ps1 を実行しようとして、次のようなエラーが出ることがあります。
このシステムではスクリプトの実行が無効になっているため...
その場合は、現在の実行ポリシーを確認します。
Get-ExecutionPolicy
Get-ExecutionPolicy -List
個人の開発端末で、ローカル作成スクリプトを実行したいだけなら、現在ユーザーのスコープで RemoteSigned にすることが多いです。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
ただし、会社 PC ではグループポリシーで制御されている場合があります。無理に回避せず、管理者や運用ルールを確認します。
実行ポリシーは、PowerShell のスクリプト実行条件を制御する安全機能です。ただし、完全なセキュリティ境界ではありません。組織では署名、AppLocker、Microsoft Defender、権限管理、ログ監査と組み合わせて考える必要があります。
flowchart TB
accTitle: スクリプト実行の前提を確認する
accDescr: スクリプトの実行環境と引数を確認し、実行ポリシーで止まる場合はスコープごとの設定と組織のルールを確認して、無理に回避しない判断を示す。
a["実行環境と引数を確認"] --> b{"実行ポリシーで止まるか"}
b -->|"はい"| c["Listで各スコープを確認"]
c --> d["管理者・運用ルールを確認"]
b -->|"いいえ"| e["対象と処理結果を確認"]
図16: 実行ポリシーを変更する前に、誰がどのスコープで管理しているかを確認する。
11.3 ErrorAction Stopとtry/catchで失敗を記録する
PowerShell は、エラーが出ても処理を続ける場合があります。
重要な処理では、-ErrorAction Stop と try/catch を使います。
try {
Copy-Item .\source.txt .\backup\source.txt -ErrorAction Stop
Write-Host "Copy succeeded"
}
catch {
Write-Error "Copy failed: $($_.Exception.Message)"
}
複数のファイルを処理する場合も、失敗を記録すると後で追跡できます。
$results = foreach ($file in Get-ChildItem .\input -File) {
try {
Copy-Item $file.FullName .\backup -ErrorAction Stop
[pscustomobject]@{
FileName = $file.Name
Status = "OK"
Message = ""
}
}
catch {
[pscustomobject]@{
FileName = $file.Name
Status = "NG"
Message = $_.Exception.Message
}
}
}
$results | Export-Csv .\copy-result.csv -NoTypeInformation -Encoding UTF8
flowchart TB
accTitle: 成功と失敗を結果のデータとして残す
accDescr: 重要な処理ではErrorAction Stopでエラーを停止として扱い、tryとcatchで成功と失敗の結果を作り、最後に記録を出力する流れを示す。
a["重要な処理をtryで実行"] --> b{"成功したか"}
b -->|"はい"| c["OKの結果を作る"]
b -->|"Stopで停止"| d["catchでNGと理由を作る"]
c --> e["結果をCSVに記録"]
d --> e
図17: 処理が続いたかどうかだけでなく、各対象の成功・失敗と理由を記録する。
12. 実務例 ── ログからエラー行を集めてレポートにする
次のような要件を考えます。
C:\App\Logs 以下の .log ファイルから、直近7日以内に更新され、ERROR を含む行を探し、CSV にまとめたい。
いきなり完成形を書かず、ファイルの範囲、更新日時、行の検索、出力列を一段ずつ確認します。Select-StringのPatternは正規表現なので、末尾の実行例ではERROR|FATALでいずれかの語を含む行を探しています。
Step 1: ログファイルを探す
Get-ChildItem C:\App\Logs -Filter *.log -File -Recurse
Step 2: 直近7日以内に絞る
$since = (Get-Date).AddDays(-7)
Get-ChildItem C:\App\Logs -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since }
Step 3: ERROR を検索する
$since = (Get-Date).AddDays(-7)
Get-ChildItem C:\App\Logs -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since } |
Select-String -Pattern "ERROR"
Step 4: CSV に出力する
$since = (Get-Date).AddDays(-7)
Get-ChildItem C:\App\Logs -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since } |
Select-String -Pattern "ERROR" |
Select-Object Path, LineNumber, Line |
Export-Csv .\error-report.csv -NoTypeInformation -Encoding UTF8
Step 5: スクリプト化する
# Export-ErrorReport.ps1
param(
[string]$LogPath = "C:\App\Logs",
[int]$Days = 7,
[string]$Pattern = "ERROR",
[string]$OutputPath = ".\error-report.csv"
)
$since = (Get-Date).AddDays(-$Days)
Get-ChildItem $LogPath -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since } |
Select-String -Pattern $Pattern |
Select-Object Path, LineNumber, Line |
Export-Csv $OutputPath -NoTypeInformation -Encoding UTF8
Write-Host "Exported: $OutputPath"
実行例です。
.\Export-ErrorReport.ps1 -LogPath C:\App\Logs -Days 14 -Pattern "ERROR|FATAL" -OutputPath .\errors.csv
flowchart TB
accTitle: ログ調査を段階的にスクリプトへまとめる
accDescr: ログファイルを探し更新日時で絞ってから該当行を検索し、必要な列をCSVに出す処理を確認して、最後に引数付きスクリプトへまとめる流れを示す。
a["ログファイルを探す"] --> b["更新日時で絞る"]
b --> c["ERRORなどの行を検索"]
c --> d["パス・行番号・内容をCSVへ"]
d --> e["確認済みの処理をps1へまとめる"]
図18: 完成形を先に実行せず、各段階の出力を確かめてからスクリプトにする。
13. 実務例 ── 古いファイルをアーカイブする
次は、削除ではなく移動にする例です。移動も状態を変えるため、対象確認・証跡出力・予行を省略しません。移動先に同じ名前がある場合の扱いも、実行前に決めます。
C:\Work\Reports のうち、90日以上更新されていない .xlsx を C:\Work\Archive に移動する。
対象確認
$source = "C:\Work\Reports"
$dest = "C:\Work\Archive"
$limit = (Get-Date).AddDays(-90)
$targets = Get-ChildItem $source -Filter *.xlsx -File |
Where-Object { $_.LastWriteTime -lt $limit }
$targets | Select-Object FullName, Length, LastWriteTime
アーカイブ先作成
if (-not (Test-Path $dest)) {
New-Item -ItemType Directory -Path $dest
}
証跡出力
$targets |
Select-Object FullName, Length, LastWriteTime |
Export-Csv .\archive-targets.csv -NoTypeInformation -Encoding UTF8
WhatIf 確認
$targets | Move-Item -Destination $dest -WhatIf
実行
$targets | Move-Item -Destination $dest
ファイル名重複があり得る場合は、このままだと失敗します。実務では、年月フォルダーを分ける、移動先ファイル名に日時を付ける、既存ファイルがあればスキップする、といったルールを先に決めます。
flowchart TB
accTitle: アーカイブ先の競合を確認してから移動する
accDescr: 古いファイルを抽出し、移動先と同名ファイルの扱いを決めて、対象一覧を保存し、WhatIfで予行してから移動する流れを示す。
a["期限より古い対象を抽出"] --> b["移動先を確認・作成"]
b --> c["同名ファイルの扱いを決める"]
c --> d["対象をCSVに記録"]
d --> e["WhatIf確認後に移動"]
図19: アーカイブは削除の代わりになるが、移動先の名前の競合まで事前に確認する。
14. 基本コマンドの早見表と、よくあるつまずき
必要なコマンドを引くための一覧です。変更系の行をそのまま実行せず、9章の確認手順と組み合わせてください。
14.1 目的からコマンドを引く
場所・ファイル
| 目的 | コマンド例 |
|---|---|
| 現在のフォルダーを表示 | Get-Location |
| フォルダー移動 | Set-Location C:\Work |
| 一覧表示 | Get-ChildItem |
| ファイルだけ表示 | Get-ChildItem -File |
| フォルダーだけ表示 | Get-ChildItem -Directory |
| サブフォルダーも検索 | Get-ChildItem -Recurse |
| 存在確認 | Test-Path .\file.txt |
| フォルダー作成 | New-Item -ItemType Directory .\backup |
| コピー | Copy-Item .\a.txt .\backup\a.txt |
| 移動 | Move-Item .\a.txt .\archive\a.txt |
| 削除予定確認 | Remove-Item .\a.txt -WhatIf |
オブジェクト加工
| 目的 | コマンド例 |
|---|---|
| 条件で絞る | Where-Object { $_.Status -eq "Running" } |
| 並べる | Sort-Object LastWriteTime -Descending |
| 列を選ぶ | Select-Object Name, LastWriteTime |
| 上位だけ表示 | Select-Object -First 10 |
| 各要素を処理 | ForEach-Object { $_.Name } |
| 中身を調べる | Get-Member |
入出力
| 目的 | コマンド例 |
|---|---|
| テキストを読む | Get-Content .\app.log |
| 末尾を見る | Get-Content .\app.log -Tail 50 |
| 文字列検索 | Select-String -Path .\app.log -Pattern "ERROR" |
| CSV 読み込み | Import-Csv .\users.csv |
| CSV 出力 | Export-Csv .\out.csv -NoTypeInformation -Encoding UTF8 |
| JSON 読み込み | Get-Content .\a.json -Raw | ConvertFrom-Json |
| JSON 出力 | $obj | ConvertTo-Json -Depth 10 |
Windows 調査
| 目的 | コマンド例 |
|---|---|
| プロセス一覧 | Get-Process |
| サービス一覧 | Get-Service |
| イベントログ | Get-WinEvent -LogName System -MaxEvents 100 |
| 環境変数 | Get-ChildItem Env: |
| PowerShell バージョン | $PSVersionTable |
| 実行ポリシー | Get-ExecutionPolicy -List |
14.2 症状から確認箇所へ戻る
| 症状 | 原因 | 対処 |
|---|---|---|
| コマンドが長くて覚えられない | 暗記しようとしている | Get-Command、Get-Help -Examples で探す |
$_ が分からない |
パイプライン現在値の理解不足 | Where-Object { $_.Name -like "*log*" } の形で覚える |
| CSV が変な内容になる | Format-Table 後に Export-Csv している |
Select-Object 後に Export-Csv する |
| パスに空白があると失敗する | 引用符がない | "C:\Work Files\a.txt" のように囲む |
| スクリプトが実行できない | 実行ポリシー | Get-ExecutionPolicy -List で確認する |
| 削除対象が多すぎる | 条件が広すぎる | 先に Select-Object FullName と -WhatIf で確認する |
| プロパティ名が分からない | オブジェクト構造を見ていない | Get-Member を使う |
| 文字化けする | エンコーディングの前提が違う | 入出力の -Encoding と利用アプリを確認する |
15. 覚える順番と、実行前のチェックリスト
最初からすべてのコマンドを覚える必要はありません。
15.1 見る・整える・入出力・変更の4段階で覚える
次の順番がおすすめです。コマンド名の一覧は学習の目安であり、まとめて実行するスクリプトではありません。
第1段階: 見る・探す
Get-Command
Get-Help
Get-Member
Get-Location
Set-Location
Get-ChildItem
Get-Content
Select-String
第2段階: 絞る・整える
Where-Object
Sort-Object
Select-Object
ForEach-Object
Format-Table
Format-List
第3段階: 入出力する
Import-Csv
Export-Csv
ConvertFrom-Json
ConvertTo-Json
Set-Content
Add-Content
Out-File
第4段階: 変更する
New-Item
Copy-Item
Move-Item
Rename-Item
Remove-Item
Start-Service
Stop-Service
Restart-Service
Stop-Process
変更系は、必ず確認系のコマンドとセットで覚えます。
# 見る
Get-ChildItem .\logs -Filter *.tmp
# 削除予定を見る
Get-ChildItem .\logs -Filter *.tmp | Remove-Item -WhatIf
# 実行
Get-ChildItem .\logs -Filter *.tmp | Remove-Item
15.2 業務で実行する前に確認する
PowerShell を業務で使う場合は、次の観点を確認しておくと安全です。
- 実行する PowerShell が
powershell.exeなのかpwsh.exeなのか確認した $PSVersionTableでバージョンを確認した- 変更前に
Get-*系で対象を表示した Where-Objectの条件を画面で確認した- 削除・移動・停止の前に
-WhatIfを使った - 実行前の対象一覧を CSV に保存した
- 本番環境ではバックアップまたは復旧手順を確認した
- スクリプトの実行ポリシーと社内ルールを確認した
- エラー時のログ出力を用意した
- 共有するスクリプトではエイリアスではなく正式なコマンド名を使った
flowchart TB
accTitle: 学習の順番を実行前の確認につなげる
accDescr: 読み取りと調査から始め、結果の加工と保存に慣れてから変更系を学び、業務では実行環境や証跡、復旧手順を確認して実行する流れを示す。
a["見る・探す"] --> b["絞る・整える"]
b --> c["入出力する"]
c --> d["確認系とセットで変更を学ぶ"]
d --> e["業務のチェックリストで確認"]
図20: 変更系を最後に学び、業務で使うときは環境・証跡・復旧手順まで確認する。
16. まとめ
PowerShellの基本は、調べ方を覚え、取得したオブジェクトを加工し、対象を確認してから変更することです。 実務で使う型を最後にまとめます。下のブロックはコマンドの役割を並べた説明です。
Get-Command で探す
Get-Help で使い方を見る
Get-Member でプロパティを確認する
Get-* で対象を見る
Where-Object で絞る
Select-Object で列を整える
Export-Csv で証跡を残す
-WhatIf で変更予定を確認する
最後に実行する
特に、PowerShell はファイル削除、サービス停止、プロセス終了、レジストリ操作までできる強力な環境です。だからこそ、最初に覚えるべきなのは「危ないコマンド」ではなく、「安全に対象を確認する手順」です。
見る → 絞る → 記録する → 予行する → 実行する
この順番を守れば、PowerShell は単なる黒い画面ではなく、Windows 業務を整理・調査・自動化するための実用的な道具になります。
参考リンク
- この記事のサンプルコード一式(テーマ別スクリプト・Pester テスト) - komurasoft-blog-samples (GitHub)
- PowerShell Documentation - Microsoft Learn
- Windows に PowerShell 7 をインストールする - Microsoft Learn
- Windows PowerShell 5.1 と PowerShell 7.x の違い - Microsoft Learn
- Get-Command - Microsoft Learn
- Get-Help - Microsoft Learn
- Get-Member - Microsoft Learn
- about_Pipelines - Microsoft Learn
- Where-Object - Microsoft Learn
- Select-Object - Microsoft Learn
- Get-Process - Microsoft Learn(既定の表示列の説明あり)
- Get-WinEvent - Microsoft Learn
- about_Character_Encoding(Windows PowerShell 5.1) - Microsoft Learn
- Import-Csv - Microsoft Learn
- Export-Csv - Microsoft Learn
- about_Execution_Policies - Microsoft Learn
関連する記事
- PowerShell実用コマンド集 ── 日常作業でよく使う小さな機能を増やす
- Windows の文字コードと改行コードを整理する
- VBScript非推奨化に備える移行ガイド
- COM/OCX/ActiveX開発の落とし穴
このテーマがつながるサービス
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
既存資産活用・移行支援
古いバッチ、VBScript、VBA、PowerShell、COM / ActiveX を含む既存資産の棚卸し、改修、移行を支援します。
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
PowerShellスクリプトの引数設計とモジュール化 ── 「動くスクリプト」から「人に渡せるスクリプト」へ
PowerShellスクリプトを他人に渡せる品質に引き上げる手順を整理します。paramブロックと[CmdletBinding()]、入力検証、パイプライン入力、-WhatIf対応、.psm1モジュール化、社内共有とGit管理の勘所まで解説します。
PowerShell実用コマンド集 ── 日常作業でよく使う小さな機能を増やす
PowerShellで日常作業に使う実用コマンドとして、Measure-Object、Group-Object、Select-String、Compare-Object、Tee-Object、Start-Transcriptなどの使いどころを整理します。
PowerShellからCOMと.NETを呼ぶ実践 ── スクリプトの届く範囲を一気に広げる
PowerShellから.NETクラスを呼ぶ方法、Add-TypeによるC#とWin32 APIの組み込み、COM操作、Excelのプロセス残留と後始末、Officeの無人実行が非サポートである理由、5.1と7の違いまで実務目線で解説します。
Windows PowerShell 5.1とPowerShell 7の違い ── 社内スクリプト移行の実務ガイド
Windows PowerShell 5.1とPowerShell 7の関係(共存とpwsh.exe)、5.1は新機能追加なしという公式方針、エンコーディング差による文字化け、#Requiresでの防御、タスクスケジューラ更新まで移行手順を整理します。
PowerShellでExcel・CSV業務処理を自動化する ── 集計・突合・帳票出力の実務レシピ
PowerShellでCSVの集計・突合・Excel帳票出力を自動化する実務レシピ。Import-Csv/Export-Csvの文字コード既定(5.1と7の違い)、Group-Objectの集計、Compare-Objectとハッシュテーブルの突合、ImportExcelと...
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
既存資産活用・移行支援
COM / ActiveX / OCX、32bit / 64bit 制約を抱える既存資産の活用と移行を支援します。
よくある質問
この記事のテーマについて、相談時によくある質問をまとめています。
- PowerShellの学習はまず何から始めればよいですか?
- コマンドの暗記ではなく、調べ方を覚えることです。重要なのは3つで、Get-CommandとGet-Helpでコマンドを調べられること、パイプライン(|)で結果を次のコマンドへ渡せること、削除・停止・変更の前に-WhatIfや-Confirmで影響を確認することです。オブジェクトのプロパティ名が分からないときはGet-Memberで中身を確認します。基本の流れは「探す → 見る → 絞る → 並べる → 出力する → 必要なら変更する」です。
- PowerShellとコマンドプロンプトは何が違いますか?
- 一番大きな違いは、コマンドプロンプトの出力が文字列中心なのに対し、PowerShellの出力はオブジェクトである点です。たとえばファイルはName、Length、LastWriteTimeなどのプロパティを持つオブジェクトとして扱われるため、Where-Objectでの絞り込みやSort-Objectでの並べ替えが自然に書けます。コマンド名もGet-ChildItemやCopy-Itemのような動詞-名詞の形で統一されており、未知のコマンドも探しやすくなっています。
- Windows PowerShell 5.1とPowerShell 7.xのどちらを使えばよいですか?
- 新しく学ぶ場合はPowerShell 7.x(pwsh.exe)を基準にして問題ありません。ただし、社内の古い管理スクリプトやWindows固有のモジュールは、Windows PowerShell 5.1(powershell.exe)前提で作られていることがあります。実務では最初に$PSVersionTableでバージョンを確認し、特定バージョン以上で動かしたいスクリプトには先頭に#Requires -Version 7.0のような条件を書いておくと事故を減らせます。
- PowerShellで削除や変更を安全に実行するにはどうすればよいですか?
- 「見る → 絞る → 記録する → 予行する → 実行する」の順番を守ることです。具体的には、まずGet系コマンドで対象を表示し、Where-Objectで絞り、Select-Objectで対象一覧を確認し、Export-CsvでCSVに証跡を残し、-WhatIfで変更予定を確認してから本実行します。PowerShellは調査と変更を同じ画面で実行できるため、読み取り専用の確認から始める癖が重要です。