PowerShellコマンドの基本 ── まず覚える操作と安全な使い方

· 更新日: · · PowerShell, Windows, コマンドライン, 自動化, 既存資産活用

更新履歴(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つです。

  1. Get-Command と Get-Help でコマンドを調べられること
  2. | パイプラインで結果を次のコマンドへ渡せること
  3. 削除・停止・変更の前に -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-* の注意点は両方に出てきます。この記事では「なぜその形で書くのか」を、実用コマンド集では「その場面で使う部品」を扱っています。

PowerShellで調査から変更へ進む順序コマンドを調べ、対象を取得して加工し、保存した結果を確認した後に必要な変更だけを実行する流れを示す。いいえはいコマンドと使い方を調べる対象を見る・絞る列を整え、結果を保存変更が必要か調査結果を共有予行・確認の後に実行

図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 の文字コードと改行コードを整理するで扱っています。

実行環境を確認してからサンプルを使うpowershell.exeとpwsh.exeの実行環境を確認して、既存資産の前提と出力文字コードを照合してからサンプルを使う流れを示す。実行ファイルと版を確認既存スクリプトの前提を確認出力列・文字コードを照合対象環境でサンプルを試す

図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章で確認します。

画面に見える表とオブジェクトのプロパティGet-ChildItemで取得したファイルオブジェクトは画面では表として表示される一方、パイプラインではNameやLengthなどのプロパティを条件や出力に使えることを示す。Get-ChildItemで取得ファイルのオブジェクト画面では一覧表として表示Name・Lengthなどを利用条件で絞り、並べる

図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 でプロパティ名を確認します。

コマンド名からプロパティまで調べるGet-Commandで候補を探し、Get-Helpで引数や使用例を調べ、Get-Memberで絞り込みに使うプロパティを確認する流れを示す。名前が分からないGet-Commandで探すGet-Helpで例・引数を確認Get系で対象を取得Get-Memberで中身を確認使うプロパティを決める

図4: コマンド名、引数、プロパティ名は、それぞれ対応する調査コマンドで確かめる。

4. パイプラインで絞る・並べる・出力する

PowerShell の | は、左のコマンドの結果を右のコマンドへ渡します。

Get-Process | Sort-Object CPU -Descending | Select-Object -First 10

この例は、次の処理を左から右へ行います。下のブロックは処理の説明です。なお、ここで並べているCPUは累積のプロセッサ時間であり、その瞬間のCPU使用率ではありません。

プロセス一覧を取得
  → CPU 使用量で降順に並べる
  → 上位10件だけ表示
パイプラインで処理の責任を分ける取得したオブジェクトを条件で絞り、順番を整えてから必要な列や件数を選ぶことで、各段階の結果を確認できることを示す。Get系で取得Where-Objectで絞るSort-Objectで並べるSelect-Objectで列・件数を選ぶ結果を確認・保存

図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-* は「最後に画面へ見せるため」と覚えると事故が減ります。

加工用データと表示用データを分ける元のオブジェクトから必要なプロパティを選び、保存するときはCSVやJSONへ、画面を見るときは最後にFormat系へ渡す分岐を示す。保存・後続処理画面表示元のオブジェクト必要なプロパティを選ぶ用途を選ぶCSV・JSONへ渡す最後に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章の確認手順を読んでください。

ファイル検索は対象範囲を狭めてから広げる現在の場所と対象フォルダーを確かめ、ファイル種別を絞ってから必要な場合にだけサブフォルダーを再帰検索する流れを示す。はいいいえ現在の場所・パスを確認対象フォルダーを限定File・Filterで絞る下位フォルダーも必要かRecurseを付けて確認現在の範囲で結果を確認

図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
ログのファイル情報から行の検索へ進むファイルの一覧を取得する段階と、Get-Contentで内容を読む段階、Select-Stringで該当行を検索して証跡をCSV化する段階を分けて示す。内容・末尾条件に合う行調べるログファイルを決める何を確認するかGet-Contentで読むSelect-Stringで検索Path・LineNumber・Lineを選ぶ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 のような書き方を「スプラッティング」と呼びます。パラメーターが増えたときに読みやすくなります。

変数とスプラッティングで変更箇所をまとめるパスや期限を変数に置き、複数の引数をハッシュテーブルへまとめてコマンドに渡すことで、後から条件を変える場所を明確にする流れを示す。パス・期限・検索条件変数やハッシュテーブルに置くコマンドへ渡す取得結果を加工する条件変更は値の側で行う

図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
調査結果を自分の列に整えるファイルごとに名前やサイズなどの値を取り出してPSCustomObjectを作り、同じ列を持つ結果をCSVへ出力する流れを示す。ファイルなどの取得結果ForEach-Objectで各要素を処理PSCustomObjectに列と値を作るそろえた列を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
CSVの列を使って対象を抽出するCSVを列付きのオブジェクトとして読み込み、文字列である値の意味を確認して条件で絞り、表示用のFormat系を挟まずにCSVへ戻す流れを示す。Import-Csvで読み込む列名をプロパティとして使う値の型を確認して絞る必要な列を選ぶ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を参照してください。

JSONの文字列とオブジェクトを変換する設定ファイル全体を読み込んでJSONからオブジェクトへ変換し、加工後は必要な階層を指定してJSONへ戻して保存する流れを示す。JSONファイルをRawで読むConvertFrom-Jsonオブジェクトとして扱うConvertTo-Jsonで戻す階層と文字コードを確認し保存

図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
調査対象と出力の読み方を分けるプロセスやサービスは現在の状態として調べ、イベントログは期間や件数を絞って読み、長いメッセージは一件を詳細表示して、共有用の結果はCSVへ保存する流れを示す。長い内容を読む記録・共有調査する対象を決める対象名・期間・件数で絞る結果の使い道1件をFormat-Listで確認必要な列を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

この順番にすると、「何を消したのか分からない」という事故を減らせます。

同じ対象を確認してから変更するGet系で取得し条件を絞った対象を変数に保持して一覧と証跡を確認し、WhatIfの結果に問題がなければ本実行する流れを示す。問題あり問題なしGet系で取得し条件を絞るtargetsに対象を保持一覧を確認してCSVに記録WhatIfで予行対象・影響に問題はないか本実行

図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

サービス操作は業務影響が出やすいため、本番環境では手順書、メンテナンス時間、復旧方法を先に確認します。

変更コマンドを実行する前の確認作成やコピー、移動や削除、プロセス停止やサービス操作の前に対象と既存データへの影響を確認し、予行と復旧手順をそろえてから実行する流れを示す。対象と操作を特定する保存先・上書き・業務影響を確認記録・予行・復旧手順を用意必要な変更だけ実行

図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、権限管理、ログ監査と組み合わせて考える必要があります。

スクリプト実行の前提を確認するスクリプトの実行環境と引数を確認し、実行ポリシーで止まる場合はスコープごとの設定と組織のルールを確認して、無理に回避しない判断を示す。はいいいえ実行環境と引数を確認実行ポリシーで止まるかListで各スコープを確認管理者・運用ルールを確認対象と処理結果を確認

図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
成功と失敗を結果のデータとして残す重要な処理ではErrorAction Stopでエラーを停止として扱い、tryとcatchで成功と失敗の結果を作り、最後に記録を出力する流れを示す。はいStopで停止重要な処理をtryで実行成功したかOKの結果を作るcatchでNGと理由を作る結果をCSVに記録

図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
ログ調査を段階的にスクリプトへまとめるログファイルを探し更新日時で絞ってから該当行を検索し、必要な列をCSVに出す処理を確認して、最後に引数付きスクリプトへまとめる流れを示す。ログファイルを探す更新日時で絞るERRORなどの行を検索パス・行番号・内容をCSVへ確認済みの処理を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

ファイル名重複があり得る場合は、このままだと失敗します。実務では、年月フォルダーを分ける、移動先ファイル名に日時を付ける、既存ファイルがあればスキップする、といったルールを先に決めます。

アーカイブ先の競合を確認してから移動する古いファイルを抽出し、移動先と同名ファイルの扱いを決めて、対象一覧を保存し、WhatIfで予行してから移動する流れを示す。期限より古い対象を抽出移動先を確認・作成同名ファイルの扱いを決める対象をCSVに記録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 に保存した
  • 本番環境ではバックアップまたは復旧手順を確認した
  • スクリプトの実行ポリシーと社内ルールを確認した
  • エラー時のログ出力を用意した
  • 共有するスクリプトではエイリアスではなく正式なコマンド名を使った
学習の順番を実行前の確認につなげる読み取りと調査から始め、結果の加工と保存に慣れてから変更系を学び、業務では実行環境や証跡、復旧手順を確認して実行する流れを示す。見る・探す絞る・整える入出力する確認系とセットで変更を学ぶ業務のチェックリストで確認

図20: 変更系を最後に学び、業務で使うときは環境・証跡・復旧手順まで確認する。

16. まとめ

PowerShellの基本は、調べ方を覚え、取得したオブジェクトを加工し、対象を確認してから変更することです。 実務で使う型を最後にまとめます。下のブロックはコマンドの役割を並べた説明です。

Get-Command で探す
Get-Help で使い方を見る
Get-Member でプロパティを確認する
Get-* で対象を見る
Where-Object で絞る
Select-Object で列を整える
Export-Csv で証跡を残す
-WhatIf で変更予定を確認する
最後に実行する

特に、PowerShell はファイル削除、サービス停止、プロセス終了、レジストリ操作までできる強力な環境です。だからこそ、最初に覚えるべきなのは「危ないコマンド」ではなく、「安全に対象を確認する手順」です。

見る → 絞る → 記録する → 予行する → 実行する

この順番を守れば、PowerShell は単なる黒い画面ではなく、Windows 業務を整理・調査・自動化するための実用的な道具になります。

参考リンク

関連する記事

このテーマがつながるサービス

Windowsアプリ開発

業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。

サービスを見る / お問い合わせ

既存資産活用・移行支援

古いバッチ、VBScript、VBA、PowerShell、COM / ActiveX を含む既存資産の棚卸し、改修、移行を支援します。

お問い合わせ

同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。

このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。

この記事は次のサービスページにつながります。近い入口からご覧ください。

よくある質問

この記事のテーマについて、相談時によくある質問をまとめています。

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は調査と変更を同じ画面で実行できるため、読み取り専用の確認から始める癖が重要です。

著者プロフィール

記事の著者プロフィールページです。

小村 豪

合同会社小村ソフト 代表

Windows ソフト開発、技術相談、不具合調査を中心に、既存資産が残る案件や原因が見えにくい障害調査に強みがあります。

ブログ一覧に戻る