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)

この記事はZenodoにアーカイブされています。常に最新版へ解決されるDOIと、いま表示している版に固定されたDOIの両方を下に示します。

小村 豪(2026)「PowerShellコマンドの基本 ── まず覚える操作と安全な使い方」合同会社小村ソフト. https://doi.org/10.5281/zenodo.21589819 https://staging.comcomponent.com/blog/2026/05/29/powershell-command-basics/

DOI(最新版)
10.5281/zenodo.21589819
DOI(この版)
10.5281/zenodo.21732831

1. 最初に押さえるべきこと

PowerShell は、Windows の設定確認、ファイル整理、ログ調査、CSV 加工、サービス操作、定型作業の自動化に使えるコマンド環境です。

ただし、最初から複雑なスクリプトを書く必要はありません。まずは次の流れだけ覚えると、実務でかなり使えるようになります。

探す  見る  絞る  並べる  出力する  必要なら変更する

PowerShell の基本は「長いコマンドを暗記すること」ではありません。重要なのは、次の3つです。

  1. Get-CommandGet-Help でコマンドを調べられること
  2. | パイプラインで結果を次のコマンドへ渡せること
  3. 削除・停止・変更の前に -WhatIf-Confirm で影響を確認すること

PowerShell は「調査」と「変更」を同じ画面で実行できます。便利な反面、削除や停止もすぐ実行できるため、読み取り専用の確認から始める癖が重要です。

なお、この記事に登場するコードは、章立てに沿ったテーマ別スクリプト集(一時フォルダーに練習用ワークスペースを作って安全に試せる構成)と Pester テストを含むサンプル一式として GitHub で公開しています。

powershell-command-basics - komurasoft-blog-samples (GitHub)

この記事の読み方

この記事は26章あります。最初から通しで読む必要はありません。目的別に、次の章から読むと迷いにくくなります。

目的 読む章
これから PowerShell を触る 1〜8章(考え方、調べ方、パイプライン、ファイル操作)と 24章(覚える順番)
ログや設定を調査したい 9章(テキスト)、12章(プロセス・サービス)、13章(イベントログ)、21章(調査サンプル)
CSV や JSON を加工したい 10章、11章、15章
処理をスクリプトにまとめたい 14章、16章、17章、18章
削除・移動を安全に実行したい 19章、22章、25章
コマンドを引きたいだけ 20章(基本コマンド一覧)、23章(よくあるつまずき)

覚える順番そのものは 24章「コマンドを覚える順番」にまとめています。最初に手を動かすときは、24章の第1段階(Get-CommandGet-HelpGet-MemberGet-LocationSet-LocationGet-ChildItemGet-ContentSelect-String)だけを手元に置いて、本文を追ってください。この8つが分かれば、残りは必要になったときに調べれば済みます。

「実用コマンド集」との読み分け

PowerShell の記事はもう1本あります。役割が違うので、次のように使い分けてください。

記事 扱う内容 読むタイミング
この記事(基本) 操作体系。コマンドの探し方、パイプラインの考え方、変更系を安全に実行する順番 最初に読む
PowerShell実用コマンド集 目的別の部品。件数や合計の集計(Measure-Object)、種類ごとの集計(Group-Object)、差分比較(Compare-Object)、作業ログの記録(Start-Transcript)など 実作業で「これをやりたい」が出てきたとき

CSV、プロセス、サービス、イベントログ、Format-* の注意点は両方に出てきます。この記事では「なぜその形で書くのか」を、実用コマンド集では「その場面で使う部品」を扱っています。

この記事の知識マップ

PowerShellはコマンド結果を文字列ではなくオブジェクトとして扱うシェルで、Get-Command・Get-Help・Get-Memberによる調べ方と、Where-Object・Select-Objectを組み合わせたパイプラインが基本になる。画面表示用のFormat-*系コマンドレットは最後に使うべきもので、これをExport-CsvやConvertTo-Jsonの前に挟むとCSV・JSON出力に表示用の情報が混ざってしまう。.ps1スクリプトの実行には実行ポリシーの許可が必要で、会社PCではグループポリシーによって制御されていることがある。削除・停止・変更のような変更系コマンドは、対象をWhere-Objectで絞り込みExport-Csvで証跡を残したうえで、-WhatIfによる予行を経てから実行するという安全な手順を徹底することが、この記事全体の結論になっている。

PowerShellコマンドの基本の知識マップPowerShellのオブジェクト指向パイプライン、Get-Command・Get-Help・Get-Memberによる調べ方、Format系コマンドレットとCSV・JSON出力の関係、実行ポリシーとグループポリシーの関係、安全な変更手順における-WhatIfの位置付けを示す図利用する利用する利用する利用するより先に行うべきより先に行うべき用いるのは非推奨利用する利用する利用するで構成できる前提とする利用する利用する利用する利用する利用する利用する利用する利用するPowerShellパイプライン安全な変更手順(見る→絞る→記録する→予行する→実行する)Where-ObjectSelect-ObjectGet-MemberGet-CommandGet-HelpFormat-*系コマンドレットImport-Csv/Export-CsvConvertTo-Json/ConvertFrom-JsonPowerShell実行ポリシーグループポリシー.ps1スクリプトファイル-WhatIfパラメーターGet-WinEvent

図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全20件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle

2. PowerShell とコマンドプロンプトの違い

PowerShell は、従来のコマンドプロンプト(cmd.exe)と似て見えますが、内部の考え方が違います。

観点 コマンドプロンプト PowerShell
主な出力 文字列 オブジェクト
コマンド名 dircopy など Get-ChildItemCopy-Item など
結果の加工 文字列処理が中心 プロパティを使って絞り込み・並べ替え
自動化 バッチファイル .ps1 スクリプト
得意分野 古いコマンド資産との互換 Windows 管理、CSV、JSON、API、定型作業

たとえば、ファイル一覧を取得する場合、cmd.exe では dir の表示結果を文字列として眺めることが多くなります。PowerShell では、ファイルが NameLengthLastWriteTime などのプロパティを持つオブジェクトとして扱われます。

Get-ChildItem

この違いが分かると、次のように「7日以内に更新されたファイルだけを、更新日時の新しい順に表示する」といった処理が自然に書けます。

Get-ChildItem -File |
  Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) } |
  Sort-Object LastWriteTime -Descending |
  Select-Object Name, Length, LastWriteTime

3. Windows PowerShell 5.1 と PowerShell 7.x

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

この記事のサンプルはどちらで動くか

以降のサンプルは、特に断りがない限り Windows PowerShell 5.1 と PowerShell 7.x のどちらでもそのまま動く範囲で書いています。ただし、同じコマンドでも次の点は結果が変わるので、写す前に確認してください。

違いが出るところ Windows PowerShell 5.1 PowerShell 7.x
Get-Process の既定の表示列 HandlesNPM(K)PM(K)WS(K)CPU(s)IdSIProcessName NPM(K)PM(M)WS(M)CPU(s)IdSIProcessName(メモリが 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 の文字コードと改行コードを整理するで扱っています。

4. コマンドレットの名前は 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

dirlscatcd のような短い名前も使えますが、多くはエイリアスです。

Get-Command dir

スクリプトとして残す場合は、エイリアスではなく正式名を使う方が安全です。

# 読めるが、スクリプトでは避けたい
ls *.log

# 意図が明確
Get-ChildItem -Filter *.log

5. まず覚える3つの調査コマンド

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

たとえば、サービスには StatusName などのプロパティがあります。

Get-Service | Select-Object Name, Status

ファイルには NameLengthLastWriteTime などがあります。

Get-ChildItem -File | Select-Object Name, Length, LastWriteTime

「何で絞ればよいか分からない」ときは、まず Get-Member でプロパティ名を確認します。

6. パイプラインの基本

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

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

この例は、次の処理を左から右へ行います。

プロセス一覧を取得
   CPU 使用量で降順に並べる
   上位10件だけ表示

出力はどのように表示されるか

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-ObjectWhere-Object で指定するプロパティ名(CPUWorkingSetIdName など)は共通です。表示用の列名とプロパティ名は別物なので、絞り込みの条件が効かないときは Get-Process | Get-Member で本当のプロパティ名を確認します。

よく使う組み合わせは次の通りです。

コマンド 役割
Where-Object 条件で絞る 停止中のサービスだけ取得
Sort-Object 並べる 更新日時の新しい順に並べる
Select-Object 列や件数を選ぶ 名前とサイズだけ表示
ForEach-Object 各要素に処理する ファイルごとに処理する
Export-Csv CSV に出力する 調査結果を保存する

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" }

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

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

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

8. ファイル・フォルダー操作の基本

PowerShell で最もよく使うのは、ファイルやフォルダーの操作です。

やりたいこと コマンド
現在の場所を見る Get-Location
場所を移動する Set-Location
一覧を見る Get-ChildItem
ファイル・フォルダーを作る New-Item
コピーする Copy-Item
移動する Move-Item
名前を変える Rename-Item
削除する Remove-Item
存在確認する Test-Path

現在の場所を確認する

Get-Location

移動します。

Set-Location C:\Work

パスに空白が含まれる場合は引用符で囲みます。

Set-Location "C:\Work Files\Reports"

ファイル一覧を見る

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(サイズ)が空欄になります。ここに出ている LastWriteTimeLength が、そのまま Where-ObjectSort-Object で使えるプロパティ名です。

拡張子で絞る場合は -Filter が便利です。

Get-ChildItem -Filter *.log

サブフォルダーも含めて検索する場合は -Recurse を使います。

Get-ChildItem C:\Logs -Filter *.log -Recurse

大量のファイルがある場所では、いきなり -Recurse せず、対象フォルダーを限定してから実行します。

作成する

# フォルダー作成
New-Item -ItemType Directory -Path .\archive

# 空ファイル作成
New-Item -ItemType File -Path .\memo.txt

既に存在する可能性がある場合は、先に確認します。

if (-not (Test-Path .\archive)) {
  New-Item -ItemType Directory -Path .\archive
}

コピーする

Copy-Item .\report.xlsx .\backup\report.xlsx

フォルダーごとコピーする場合は -Recurse を使います。

Copy-Item .\data .\backup\data -Recurse

上書きが絡む場合は、事前に影響を確認します。

Copy-Item .\data .\backup\data -Recurse -WhatIf

移動する

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

削除する

削除は特に慎重に扱います。

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

9. テキストファイルを読む・探す・書く

ログ調査では、テキストファイル操作をよく使います。

ファイルを読む

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

ファイルへ書き込む

"hello" | Set-Content .\memo.txt -Encoding UTF8
"next line" | Add-Content .\memo.txt -Encoding UTF8

コマンド結果を保存する場合は、Out-File より Export-CsvConvertTo-Json の方が後で扱いやすいことがあります。

Get-Process |
  Select-Object Name, Id, CPU |
  Export-Csv .\process.csv -NoTypeInformation -Encoding UTF8

10. 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

11. 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

12. プロセスとサービスの基本

プロセスを見る

Get-Process

メモリ使用量の大きいプロセスを確認します。

Get-Process |
  Sort-Object WorkingSet -Descending |
  Select-Object -First 10 Name, Id, WorkingSet

名前で絞ります。

Get-Process -Name notepad

停止は慎重に行います。

Stop-Process -Name notepad -WhatIf

問題なければ実行します。

Stop-Process -Name notepad

サービスを見る

Get-Service

停止中のサービスだけ見る場合です。

Get-Service |
  Where-Object { $_.Status -eq "Stopped" }

名前で絞ります。

Get-Service -Name "Spooler"

再起動する場合も、対象確認を先に行います。

Get-Service -Name "Spooler"
Restart-Service -Name "Spooler" -WhatIf

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

13. イベントログの基本

Windows の調査ではイベントログが欠かせません。

最近のエラーを確認します。

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 には CriticalErrorWarningInformationVerbose が入ります。件数が多いログでは、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

14. 変数・配列・ハッシュテーブル

短いコマンドだけでも作業できますが、少し長くなると変数が便利です。

変数

$path = "C:\Logs"
Get-ChildItem $path

PowerShell の変数は $ で始まります。

$today = Get-Date
$limit = (Get-Date).AddDays(-30)

配列

$extensions = @("*.log", "*.txt", "*.csv")
foreach ($ext in $extensions) {
  Get-ChildItem C:\Work -Filter $ext
}

ハッシュテーブル

ハッシュテーブルは、キーと値の組み合わせです。

$params = @{
  Path = "C:\Logs"
  Filter = "*.log"
  Recurse = $true
}

Get-ChildItem @params

この @params のような書き方を「スプラッティング」と呼びます。パラメーターが増えたときに読みやすくなります。

15. 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

16. スクリプトファイル .ps1 の基本

よく使う処理は .ps1 ファイルにします。

例として、古いログを一覧化するスクリプトを作ります。

# 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() で受け取ると、後から条件を変えやすくなります。

17. 実行ポリシーの基本

.ps1 を実行しようとして、次のようなエラーが出ることがあります。

このシステムではスクリプトの実行が無効になっているため...

その場合は、現在の実行ポリシーを確認します。

Get-ExecutionPolicy
Get-ExecutionPolicy -List

個人の開発端末で、ローカル作成スクリプトを実行したいだけなら、現在ユーザーのスコープで RemoteSigned にすることが多いです。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

ただし、会社 PC ではグループポリシーで制御されている場合があります。無理に回避せず、管理者や運用ルールを確認します。

実行ポリシーは、PowerShell のスクリプト実行条件を制御する安全機能です。ただし、完全なセキュリティ境界ではありません。組織では署名、AppLocker、Microsoft Defender、権限管理、ログ監査と組み合わせて考える必要があります。

18. エラー処理の基本

PowerShell は、エラーが出ても処理を続ける場合があります。

重要な処理では、-ErrorAction Stoptry/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

19. 変更系コマンドを安全に実行する順番

PowerShell では、削除・移動・停止のような変更系コマンドを安全に扱う手順が重要です。

基本は次の順番です。

1. Get 系で対象を見る
2. Where-Object で絞る
3. Select-Object で対象一覧を確認する
4. Export-Csv で記録する
5. -WhatIf で変更予定を確認する
6. 本実行する

例として、30日より古い .tmp ファイルを削除する場合です。

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

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

20. よく使う基本コマンド一覧

場所・ファイル

目的 コマンド例
現在のフォルダーを表示 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

21. 実務サンプル: ログを調査してレポートを作る

次のような要件を考えます。

C:\App\Logs 以下の .log ファイルから、直近7日以内に更新され、ERROR を含む行を探し、CSV にまとめたい。

いきなり完成形を書かず、段階的に作ります。

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

22. 実務サンプル: 古いファイルをアーカイブする

次は、削除ではなく移動にする例です。

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

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

23. よくあるつまずき

症状 原因 対処
コマンドが長くて覚えられない 暗記しようとしている Get-CommandGet-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 と利用アプリを確認する

24. コマンドを覚える順番

最初からすべてのコマンドを覚える必要はありません。

次の順番がおすすめです。

第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

25. 現場での運用チェックリスト

PowerShell を業務で使う場合は、次の観点を確認しておくと安全です。

  • 実行する PowerShell が powershell.exe なのか pwsh.exe なのか確認した
  • $PSVersionTable でバージョンを確認した
  • 変更前に Get-* 系で対象を表示した
  • Where-Object の条件を画面で確認した
  • 削除・移動・停止の前に -WhatIf を使った
  • 実行前の対象一覧を CSV に保存した
  • 本番環境ではバックアップまたは復旧手順を確認した
  • スクリプトの実行ポリシーと社内ルールを確認した
  • エラー時のログ出力を用意した
  • 共有するスクリプトではエイリアスではなく正式なコマンド名を使った

26. まとめ

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

ブログ一覧に戻る