PowerShell実用コマンド集 ── 日常作業でよく使う小さな機能を増やす

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

更新履歴(3件・最終更新 2026年08月02日)

この記事に加えた変更の記録です。アーカイブした更新前のバージョンは、DOI付きの固定URLから読めます。

記事の冒頭に「この記事の知識マップ」節を追加しました。本文で扱っている概念とその関係を、要約・図・詳細ページへのリンクにまとめたものです。本文の主張は変えていません。
外部レビュー(1283件)への対応として本文を更新しました。個々の変更内容は、この下の履歴を参照してください。
フラットに並んでいたレシピを目的別に分類した地図の表を追加し、章番号との対応を付けました。あわせて前の記事との違いの整理、いくつかのレシピの出力例と使いどころ、1ページのチートシートを追加しています。
初版公開
この記事を引用する(DOI(登録済みアーカイブ): 10.5281/zenodo.21589824)

以下のDOIは過去に登録されたアーカイブを指しており、現在の本文とは一致しない場合があります。現在の本文を参照するときは、このページのURLを使用してください。

小村 豪(2026)「PowerShell実用コマンド集 ── 日常作業でよく使う小さな機能を増やす」合同会社小村ソフト. https://comcomponent.com/blog/2026/06/01/002-powershell-practical-command-recipes/

DOI(登録済みアーカイブ)
10.5281/zenodo.21589824
DOI(前回登録した版)
10.5281/zenodo.21732837

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

PowerShell の基本を覚えたら、次は「取り出した結果を、数える・まとめる・比べる・残す」ための部品を増やすと、日常作業で使いやすくなります。この記事は、そのためのコマンドと短い実務レシピをまとめたものです。

全部を順番に覚える必要はありません。やりたい作業から探すなら3章の目的別索引、組み合わせた例を使うなら33章の実務レシピ、書き方を思い出すだけなら35章のチートシートへ進んでください。削除・停止・設定変更を行う場合は、先に2章の考え方と34章の確認手順を押さえます。

ここでいう小さな機能とは、短いエイリアスのことではありません。この記事では、ls や cat のような省略形ではなく、Get-ChildItem、Get-Content、Select-String のような正式なコマンド名を使います。

そのうえで、次のような作業を、1行または数行のコマンドでできるようにします。

件数を数える
合計サイズを調べる
重複を消す
種類ごとに集計する
必要な値だけ取り出す
2つの結果を比較する
ログの前後行を見る
クリップボードへ送る
実行結果を保存しながら画面にも出す
環境変数やネットワークを確認する

PowerShell は、長いスクリプトを書かなくても便利です。まずは「よく使う部品」を増やして、日常作業の中で少しずつ組み合わせられるようにしていきます。

コマンドを暗記するよりも、「こういう時はこの部品が使える」と思い出せることが大事です。

なお、この記事に登場するコードは、章立てに沿ってテーマ別に整理した実行できるサンプル一式(レシピスクリプトと Pester テスト)として GitHub で公開しています。

powershell-practical-command-recipes - komurasoft-blog-samples (GitHub)

前の記事との違い

この記事は PowerShellコマンドの基本 ── まず覚える操作と安全な使い方 の続きです。役割は次のように分けています。

  PowerShellコマンドの基本 この記事
ねらい PowerShell を触れるようになる 取り出した結果を、数える・まとめる・比べる・残せるようになる
中心 文法とパイプライン、コマンドの探し方 集計、比較、抽出、出力の部品
CSV / JSON 読み書きの基本 読み込んだ結果を条件で絞って集計する側
プロセス / サービス / イベントログ 一覧を取得する基本 取得した一覧を種類ごとに数え、差分を取る側
変更系コマンド 安全に実行する順番そのもの その順番に組み込む調査・証跡のコマンド

つまり、前の記事が「値を取り出せるようにする」ところまでで、この記事は「取り出した値をどう扱うか」です。

Get-ChildItem、Get-Content、Import-Csv、Get-Service のような取得コマンドの基本や、実行ポリシー、.ps1 の書き方、エラー処理は前の記事にあります。この記事では、それらを前提にして先へ進みます。Format 系を最後に使うことや Export-Csv -Encoding UTF8 のように、両方に出てくる話もありますが、この記事では「集計や比較に持ち込むときにどうするか」という角度で扱います。

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

2. 今回の考え方

このページは、先頭からすべてのコードを連続実行する手順書ではありません。 目的に合うレシピを選び、対象と出力先を確認しながら使います。前提は、次の3つです。

  1. コマンド名は正式名で書く
  2. 読み取り系のコマンドを中心にする
  3. 変更系のコマンドは、必ず対象確認や -WhatIf と一緒に考える

変更する前に、読み取り系で確かめる

たとえば、ファイルを削除するコマンドをいきなり覚えるよりも、先に次の流れを身につける方が安全です。

対象を見る
  → 条件で絞る
  → 件数を数える
  → 必要なら CSV に残す
  → 変更予定を確認する
  → 実行する

この記事では、削除や停止のような強い操作よりも、調査・集計・比較・出力を中心に扱います。コード中のパスやファイル名は、調べたい対象と保存先に合わせて読み替えてください。

次に渡す「結果の形」で選ぶ

同じ一覧でも、次に何をしたいかで使うコマンドが変わります。6章と11章で詳しく扱う違いを、先に整理しておきます。

次にしたいこと 結果の形と使う部品
件数や合計を知る Measure-Object で集計し、Count や Sum を見る
名前などの値だけを渡す Select-Object -ExpandProperty で値そのものを取り出す
列を持つデータとして加工・保存する Select-Object で列を選び、CSV なら Export-Csv へ渡す
画面で見やすくする Format-Table / Format-List を最後に使う

画面用の整形と、後で加工できるデータの出力は別です。 CSV に出す前に Format 系を挟まないことが、レシピを組み合わせるときの要点です。

3. よく使うコマンドの地図

目的別の章の地図

4〜35章のレシピと早見表を、目的別に整理しています。36章はまとめです。まず下の表から、必要なかたまりを選んでください。

カテゴリ 章 扱うこと
集計・整形 4〜11 件数、合計、最大・平均、値の取り出し、重複除去、種類別集計、計算列、並べ替え、Format 系の位置づけ
テキスト・ログ調査 12〜14 文字列の検索と前後行、置換、2つの一覧の比較
ファイル・データの中身 15、19、20 ハッシュ値の確認、CSV の絞り込み、JSON の設定値
出力・証跡 16〜18 クリップボードへ送る、画面とファイルの同時出力、作業ログ
システム調査 21〜25、31 環境変数、プロファイル、プロセス、サービス、イベントログ、エラーの詳細
ネットワーク 26、27 疎通確認、Web の応答
実行のしかた 28〜30 実行時間の計測、バックグラウンド実行、コマンド履歴
文法の確認 32 比較演算子
そのまま使えるレシピ 33、34 11個の実務レシピと、変更系コマンドと組み合わせるときの注意
早見表 35 目的から思い出すためのチートシート

「調べたいことは決まっているが、どのコマンドか思い出せない」という状態なら、35章の早見表から入るのが最短です。

コマンド名から探す

コマンド名から探す場合はこちらです。右端の章で、出力の読み方と組み合わせ方を説明しています。

やりたいこと コマンド 章
件数や合計を調べる Measure-Object 4、5
必要な値だけ取り出す Select-Object -ExpandProperty 6
重複を整理する Sort-Object -Unique 7
種類ごとに集計する Group-Object 8
必要な列だけ出す・計算列を作る Select-Object 9
並べ替える Sort-Object 10
文字列を検索する Select-String 12
2つの結果を比較する Compare-Object 14
ハッシュ値を計算する Get-FileHash 15
クリップボードを使う Set-Clipboard / Get-Clipboard 16
画面とファイルの両方に出す Tee-Object 17
作業ログを残す Start-Transcript 18
ネットワーク疎通を確認する Test-Connection / Test-NetConnection 26
処理時間を測る Measure-Command 28
エラー詳細を見る Get-Error 31
各要素を処理する ForEach-Object 各章で随時

全部を一度に覚える必要はありません。「数えるなら Measure-Object」「まとめるなら Group-Object」「比べるなら Compare-Object」のように、目的とセットで覚えるのがおすすめです。

4. 件数を数える ── Measure-Object

まずよく使うのが、件数を数える操作です。

件数は Count を読む

現在のフォルダーにあるファイル数を数えます。

Get-ChildItem . -File | Measure-Object

サブフォルダーも含めて数える場合です。

Get-ChildItem . -File -Recurse | Measure-Object

Measure-Object の結果にある Count が件数です。

合計サイズは Length を集計する

ファイルサイズの合計を見たい場合は、Length を集計します。

Get-ChildItem . -File -Recurse |
  Measure-Object -Property Length -Sum

ただし、このままだとバイト数で人間には少し読みにくいので、GB 単位に直します。

$size = Get-ChildItem . -File -Recurse |
  Measure-Object -Property Length -Sum

[math]::Round($size.Sum / 1GB, 2)

これは、フォルダー全体のサイズをざっくり見たいときに便利です。

5. 最大・平均も調べる

サイズのばらつきを見る

Measure-Object は、合計だけでなく、最大値や平均値も出せます。

Get-ChildItem . -File |
  Measure-Object -Property Length -Sum -Average -Maximum -Minimum

ファイルサイズのばらつきを見るときに使えます。

CPU 使用率と累積時間を混同しない

プロセスの累積 CPU 時間を合計することもできます。Get-Process の CPU は使用率ではなく、プロセス起動以降に使った CPU 時間の秒数です。

Get-Process |
  Measure-Object -Property CPU -Sum

ただし、この値は瞬間的な CPU 使用率ではなく累積値なので、実行タイミングやプロセスの稼働時間によって変わります。

調査用として見る場合は十分ですが、厳密な監視をしたい場合は専用の監視ツールやログの設計も必要です。

6. 値だけ取り出す ── Select-Object -ExpandProperty

列を持つオブジェクトを残す

Select-Object は、列を選ぶときによく使います。

Get-Process |
  Select-Object Name, Id, CPU

これは「Name、Id、CPU という列を持ったオブジェクト」を出します。

値そのものを取り出す

一方で、値だけを取り出したい場合は -ExpandProperty を使います。

Get-Process -Name notepad -ErrorAction SilentlyContinue |
  Select-Object -ExpandProperty Id

ファイル名だけを取り出す場合も同じです。

Get-ChildItem . -File |
  Select-Object -ExpandProperty Name

コマンドの結果を、別のコマンドやテキストファイルに渡したいときは、-ExpandProperty が便利です。

値だけの一覧をテキストに保存する

たとえば、ファイル名一覧だけを保存します。

Get-ChildItem . -File |
  Select-Object -ExpandProperty Name |
  Set-Content .\file-names.txt -Encoding UTF8

Select-Object Name と Select-Object -ExpandProperty Name は似ていますが、結果の形が違います。

Select-Object Name
  → Name という列を持つ表

Select-Object -ExpandProperty Name
  → Name の値そのもの

CSV にしたいなら列として残す方がよく、別の文字列処理に渡したいなら値だけの方が扱いやすいです。

7. 重複を消す ── Sort-Object -Unique

ファイルの拡張子だけを一覧にしたい場合です。

Get-ChildItem . -File |
  Select-Object -ExpandProperty Extension |
  Sort-Object -Unique

実行すると、.txt、.log、.csv のように、重複を除いた拡張子だけが表示されます。

プロセス名の種類だけを見ることもできます。

Get-Process |
  Select-Object -ExpandProperty ProcessName |
  Sort-Object -Unique

ユーザー一覧 CSV から部署名の一覧だけを取り出す例です。

Import-Csv .\users.csv |
  Select-Object -ExpandProperty Department |
  Sort-Object -Unique

「一覧に同じ値がたくさん出て見づらい」というときは、まず Sort-Object -Unique を思い出すと便利です。

8. 種類ごとに集計する ── Group-Object

重複を消すだけでなく、「何が何件あるか」を見たい場合は Group-Object を使います。

Count と Name で分布を見る

拡張子ごとにファイル数を数えます。

Get-ChildItem . -File |
  Group-Object -Property Extension -NoElement |
  Sort-Object -Property Count -Descending

出力はこの形になります。件数と拡張子はフォルダーの中身によって変わりますが、列の並びは同じです。

Count Name
----- ----
   42 .log
   18 .csv
    7 .txt
    3

Name が空の行は、拡張子のないファイルです。

グループの中身も見るかを選ぶ

-NoElement を外すと、Group という列が増え、そのグループに入った要素そのものが表示されます。

Count Name  Group
----- ----  -----
   42 .log  {app-20260601.log, app-20260602.log, app-20260603.log...}
   18 .csv  {export-01.csv, export-02.csv, export-03.csv...}

件数だけを見たいときに Group 列があると画面が埋まるので、-NoElement を付けます。逆に、そのグループに何が入っているかを確認したいときは付けません。

サービスやイベントログにも応用する

サービスの状態ごとに数えます。

Get-Service |
  Group-Object -Property Status -NoElement

イベントログのレベルごとに数えます。

Get-WinEvent -LogName System -MaxEvents 500 |
  Group-Object -Property LevelDisplayName -NoElement

Group-Object は、調査の最初に全体像をつかむときに向いています。

どの拡張子が多いか
どの状態のサービスが多いか
どのエラーレベルが多いか
どの部署のデータが多いか

細かい中身を見る前に、まず分布を見たいときに使います。

9. 必要な列を作る ── 計算した列を追加する

バイト数を読みやすい列にする

ファイルサイズは Length で取れますが、単位はバイトです。毎回バイト数を見るのはつらいので、MB や KB に直した列を作ると便利です。

Get-ChildItem . -File |
  Select-Object Name, @{Name="SizeKB"; Expression={ [math]::Round($_.Length / 1KB, 1) }}, LastWriteTime

サブフォルダーも含めて、大きいファイル順に見る例です。

Get-ChildItem . -File -Recurse |
  Sort-Object -Property Length -Descending |
  Select-Object -First 20 FullName, @{Name="SizeMB"; Expression={ [math]::Round($_.Length / 1MB, 2) }}, LastWriteTime

@{Name="..."; Expression={ ... }} は、計算した列を作る書き方です。最初は少し長く見えますが、実務ではよく使います。

プロセスのメモリ使用量に応用する

たとえば、プロセスのメモリ使用量を MB で表示できます。

Get-Process |
  Sort-Object -Property WorkingSet -Descending |
  Select-Object -First 10 Name, Id, @{Name="MemoryMB"; Expression={ [math]::Round($_.WorkingSet / 1MB, 1) }}

レポートに出すときは、元の Length よりも SizeMB のような列の方が読みやすくなります。

10. 新しい順・古い順・大きい順に見る

PowerShell では、並べ替えは Sort-Object です。

最近更新されたファイルを見ます。

Get-ChildItem . -File |
  Sort-Object -Property LastWriteTime -Descending |
  Select-Object -First 10 Name, LastWriteTime

古いファイルを見ます。

Get-ChildItem . -File |
  Sort-Object -Property LastWriteTime |
  Select-Object -First 10 Name, LastWriteTime

大きいファイルを見ます。

Get-ChildItem . -File -Recurse |
  Sort-Object -Property Length -Descending |
  Select-Object -First 10 FullName, Length

この3つはよく使います。

新しい順 → LastWriteTime -Descending
古い順   → LastWriteTime
大きい順 → Length -Descending

ログ調査、不要ファイル整理、ディスク容量調査で出番が多い組み合わせです。

11. Format 系は画面表示の最後だけに使う

画面だけで見る場合

画面で見やすくしたいときは Format-Table や Format-List を使います。

Get-Process |
  Sort-Object -Property WorkingSet -Descending |
  Select-Object -First 10 Name, Id, WorkingSet |
  Format-Table -AutoSize

1件の詳細を見る場合は Format-List が便利です。

Get-Process -Id $PID |
  Format-List *

CSV や次のコマンドへ渡す場合

ただし、Format-Table や Format-List は「表示用」です。

CSV に出す前や、次のコマンドで加工する前には使わない方が安全です。

# 避ける
Get-Process |
  Format-Table Name, Id |
  Export-Csv .\process.csv -NoTypeInformation

CSV に出すなら、Select-Object で列を選びます。

# 正しい
Get-Process |
  Select-Object Name, Id |
  Export-Csv .\process.csv -NoTypeInformation -Encoding UTF8

迷ったら、次のように考えます。

画面で見るだけ → Format-Table / Format-List
後で使う      → Select-Object

12. ログ検索を少し便利にする ── Select-String

検索するパターンを決める

文字列検索には Select-String を使います。

Select-String -Path .\logs\*.log -Pattern "ERROR"

複数のパターンも指定できます。

Select-String -Path .\logs\*.log -Pattern "ERROR", "WARN", "FATAL"

前後行から状況をつかむ

前後の行も見たい場合は -Context を使います。

Select-String -Path .\logs\*.log -Pattern "ERROR" -Context 2

これは、該当行の前後2行も一緒に表示するので、エラーの前後関係を確認したいときに便利です。

記号や大文字・小文字をどう扱うか

単純な文字列として探したい場合は -SimpleMatch を使います。

Select-String -Path .\logs\*.log -Pattern "[ERROR]" -SimpleMatch

Select-String の -Pattern は、通常は正規表現として扱われます。[ や . のような記号をそのまま探したい場合は、-SimpleMatch を付けると分かりやすくなります。

大文字・小文字を区別したい場合です。

Select-String -Path .\logs\*.log -Pattern "Error" -CaseSensitive

検索結果を CSV に残す

検索結果を CSV に残すこともできます。

Select-String -Path .\logs\*.log -Pattern "ERROR" |
  Select-Object Path, LineNumber, Line |
  Export-Csv .\error-lines.csv -NoTypeInformation -Encoding UTF8

13. 文字列を置き換える

テキストの一部を置き換えるには -replace を使います。

"server01.example.com" -replace "\.example\.com$", ""

ファイルは「検索 → 別ファイルに出力 → 確認」の順に扱う

設定ファイルや一括置換では、置換対象が多すぎると事故になります。先に Select-String で対象を確認してから置換すると安全です。

Select-String -Path .\appsettings.json -Pattern "localhost" -SimpleMatch

ファイルの中身を置き換える場合は、いきなり元ファイルに上書きしない方が安全です。対象を確認したら、まず別ファイルに出します。

(Get-Content .\appsettings.json -Raw) -replace "localhost", "db01" |
  Set-Content .\appsettings.preview.json -Encoding UTF8

確認してから、必要なら元ファイルへ反映します。

14. 2つの結果を比較する ── Compare-Object

Compare-Object は、2つの一覧の違いを見るコマンドです。

いつ使うか: 作業前後で構成が変わっていないかを確認するとき、2台のPCで設定やインストール済みソフトの一覧を突き合わせるとき、本番と検証でサービス構成を比べるときに使います。「変わっていないはず」を確かめる用途で効きます。

変更前と変更後を左右に対応させる

たとえば、変更前後のファイル名一覧を比較します。

Compare-Object `
  -ReferenceObject (Get-Content .\before.txt) `
  -DifferenceObject (Get-Content .\after.txt)

before.txt に a.log、b.log、c.log が、after.txt に b.log、c.log、d.log が入っていた場合、出力はこうなります。

InputObject SideIndicator
----------- -------------
d.log       =>
a.log       <=

両方にある b.log と c.log は、既定では表示されません。表示されるのは違いだけです。

SideIndicator の読み方

SideIndicator の意味は次の通りです。

表示 意味
<= 左側、つまり ReferenceObject にだけある
=> 右側、つまり DifferenceObject にだけある
== 両方にある。-IncludeEqual を付けた場合に表示される

矢印の向きは、ReferenceObject(左)と DifferenceObject(右)のどちら側に寄っているか、と読むと覚えやすくなります。上の例なら、a.log は左(変更前)にしかないので消えたファイル、d.log は右(変更後)にしかないので増えたファイルです。

ファイル名一覧を保存して比較する

フォルダーのファイル名一覧を保存して比較する例です。

Get-ChildItem .\before -File |
  Select-Object -ExpandProperty Name |
  Set-Content .\before-list.txt -Encoding UTF8

Get-ChildItem .\after -File |
  Select-Object -ExpandProperty Name |
  Set-Content .\after-list.txt -Encoding UTF8

Compare-Object `
  -ReferenceObject (Get-Content .\before-list.txt) `
  -DifferenceObject (Get-Content .\after-list.txt)

サービス一覧は変更前と変更後に採取する

サービス一覧の変更を見ることもできます。

Get-Service |
  Select-Object Name, Status |
  Export-Csv .\services-before.csv -NoTypeInformation -Encoding UTF8

ここからは対象の作業を終えた後に実行します。 変更後の状態を、別の CSV に出します。

Get-Service |
  Select-Object Name, Status |
  Export-Csv .\services-after.csv -NoTypeInformation -Encoding UTF8

比較します。

Compare-Object `
  -ReferenceObject (Import-Csv .\services-before.csv) `
  -DifferenceObject (Import-Csv .\services-after.csv) `
  -Property Name, Status

作業前後の差分を残すと、調査や報告がしやすくなります。

15. ファイルのハッシュ値を確認する ── Get-FileHash

ダウンロードしたファイルや、配布ファイルが同じか確認したいときは、ハッシュ値を使います。

Get-FileHash .\installer.exe -Algorithm SHA256

フォルダー内のファイルをまとめて確認する場合です。

Get-ChildItem .\downloads -File |
  ForEach-Object { Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256 }

CSV に残すこともできます。

Get-ChildItem .\downloads -File |
  ForEach-Object { Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256 } |
  Select-Object Path, Hash |
  Export-Csv .\hashes.csv -NoTypeInformation -Encoding UTF8

ファイル名だけでは同じに見えても、中身が違うことがあります。配布物、バックアップ、移行作業では、ハッシュ値を残しておくと確認しやすくなります。

16. クリップボードへ送る ── Set-Clipboard

いつ使うか: 調査結果をそのまま問い合わせの返信や障害報告に貼るとき、Excel に貼って表にするときに使います。ファイルを作って開いて選択してコピー、という手順が丸ごと省けます。

メール・チャットへ貼る

コマンド結果をメールやチャットに貼りたいとき、クリップボードへ送ると便利です。

Get-Service |
  Select-Object Name, Status |
  ConvertTo-Csv -NoTypeInformation |
  Set-Clipboard

クリップボードの中身を見る場合です。

Get-Clipboard

Excel 向けにタブ区切りにする

Excel に貼るためにタブ区切りにしたい場合は、ConvertTo-Csv の区切り文字をタブにします。

Get-Process |
  Select-Object Name, Id, CPU |
  ConvertTo-Csv -NoTypeInformation -Delimiter "`t" |
  Set-Clipboard

一時的に結果を共有したいだけなら、毎回ファイルを作るより楽です。ただし、証跡として残したい場合は Export-Csv でファイルに保存します。

17. 画面にも出して、ファイルにも残す ── Tee-Object

結果を画面で見ながら、同時にファイルにも残したいときは Tee-Object を使います。

Get-Process |
  Sort-Object -Property WorkingSet -Descending |
  Select-Object -First 10 Name, Id, WorkingSet |
  Tee-Object -FilePath .\top-process.txt

Tee-Object は、パイプラインの結果を2方向に流します。

画面に出す
ファイルにも保存する

表データを残したいなら Export-Csv

調査中に「見ながら記録する」用途に向いています。ただし、後で Excel で開きたいなら Export-Csv の方が扱いやすいです。

Get-Process |
  Sort-Object -Property WorkingSet -Descending |
  Select-Object -First 10 Name, Id, WorkingSet |
  Export-Csv .\top-process.csv -NoTypeInformation -Encoding UTF8

画面用なら Tee-Object、表データとして残すなら Export-Csv と考えると分かりやすいです。

18. 作業ログを残す ── Start-Transcript

いつ使うか: 本番環境で作業するとき、あとから「何をどの順番で実行したか」を報告する必要がある場面で使います。障害対応やメンテナンス作業の証跡として、開始前に一度打っておくものです。

一連の操作を記録したいときは Start-Transcript を使います。パスワードやトークンなど、記録してはいけない情報が画面に出る作業では、開始前に記録内容を確認してください。

作業開始前に記録を始める

Start-Transcript -Path .\work-log.txt

この後に実行したコマンドや画面出力が記録されます。ここで、記録したい調査やメンテナンス作業を行います。

作業が終わったら記録を止める

作業後に終了します。

Stop-Transcript

調査作業では、あとから次のことを確認したくなります。

どのコマンドを実行したか
どのフォルダーで作業したか
どんな結果が出たか
エラーが出たか

Start-Transcript を使うと、作業メモを取り忘れたときの保険になります。結果の表だけを保存したい場合は Export-Csv、一連の操作を記録したい場合は transcript、と目的を分けて考えます。

19. CSV を読み込んで、条件で見る

業務データでは CSV がよく出てきます。

列名を確認し、条件で絞る

たとえば、次のような users.csv があるとします。

Name,Department,Enabled
Suzuki,Sales,true
Tanaka,Accounting,false
Sato,Sales,true

読み込みます。

Import-Csv .\users.csv

部署が Sales の人だけを見ます。

Import-Csv .\users.csv |
  Where-Object { $_.Department -eq "Sales" }

絞った結果を別 CSV に保存する

有効なユーザーだけを別 CSV に出します。

Import-Csv .\users.csv |
  Where-Object { $_.Enabled -eq "true" } |
  Export-Csv .\enabled-users.csv -NoTypeInformation -Encoding UTF8

数値の比較では型を確認する

CSV の値は文字列として扱われることが多いので、true / false や数値を比較するときは、必要に応じて型変換を考えます。

たとえば、点数が80以上の行だけを見る場合です。

Import-Csv .\scores.csv |
  Where-Object { [int]$_.Score -ge 80 }

20. JSON の設定値を見る

JSON は、設定ファイルや Web API でよく使われます。

読み込んで、必要な値を取り出す

JSON を扱うときは、Get-Content -Raw を使うことが多いです。-Raw を付けるとファイル全体を1つの文字列として読み込むので、複数行の JSON を扱うときはこの方が分かりやすくなります。

$config = Get-Content .\settings.json -Raw | ConvertFrom-Json
$config

特定の値だけを見ることもできます。

$config.Database.Host

変更結果は別ファイルに保存する

値を変更して、別ファイルに保存する例です。読み取りだけでよい場合は、この操作は不要です。

$config.Database.Host = "db01"
$config |
  ConvertTo-Json -Depth 10 |
  Set-Content .\settings.updated.json -Encoding UTF8

21. 環境変数を見る

環境変数は、アプリの設定やパス確認でよく使います。

現在の環境変数を読む

一覧を見ます。

Get-ChildItem Env:

現在のユーザー名を見ます。

$env:USERNAME

一時フォルダーを見ます。

$env:TEMP

PATH を見やすく分割します。

$env:PATH -split ";"

一時設定と永続設定を分ける

現在の PowerShell セッションだけで環境変数を設定します。

$env:APP_MODE = "Development"

この設定は、今開いている PowerShell の中だけで有効です。

ユーザー環境変数として保存する場合は、次のようにします。上の一時設定とは別の選択肢であり、続けて必ず実行する操作ではありません。

[Environment]::SetEnvironmentVariable("APP_MODE", "Development", "User")

これは環境を変更する操作なので、会社 PC や本番サーバーでは、影響範囲を確認してから行います。

22. プロファイルを確認する

PowerShell には、起動時に読み込まれるプロファイルがあります。

場所と存在を先に確認する

場所を確認します。

$PROFILE

存在するか確認します。

Test-Path $PROFILE

存在しない場合だけ、新しく作成する

上の Test-Path が False で、プロファイルが存在しない場合に作成します。すでに存在する場合は作成コマンドを飛ばし、次のメモ帳で開く操作へ進んでください。 New-Item -Force は既存ファイルを上書きするためです。1

New-Item -ItemType File -Path $PROFILE -Force

メモ帳で開きます。

notepad $PROFILE

よく使う設定や関数をプロファイルに書いておくと便利です。ただし、複雑な処理を書きすぎると、PowerShell の起動が遅くなったり、別の環境で再現しにくくなったりするので、最初はよく使うパスや表示設定くらいに留めるのがおすすめです。

23. プロセスを見る

プロセス調査では、まずメモリ使用量の大きい順に見ることが多いです。

Get-Process |
  Sort-Object -Property WorkingSet -Descending |
  Select-Object -First 10 Name, Id, @{Name="MemoryMB"; Expression={ [math]::Round($_.WorkingSet / 1MB, 1) }}

特定の名前で絞ります。

Get-Process -Name notepad -ErrorAction SilentlyContinue

停止は、対象確認と予行の後に行う

プロセスを停止する場合は、いきなり実行せず -WhatIf で確認します。

Stop-Process -Name notepad -WhatIf

本番環境では、先に対象、利用者、復旧方法を確認します。そのうえで問題なければ実行します。

Stop-Process -Name notepad

プロセス停止は業務影響につながることがあるため、一覧の取得とは分けて扱います。

24. サービスを見る

状態を調べる

サービスの一覧を見ます。

Get-Service

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

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

自動起動なのに停止しているサービスを探します。

Get-Service |
  Where-Object { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" } |
  Select-Object Name, DisplayName, Status, StartType

再起動の前に対象と影響を確認する

サービスを再起動する場合も、まず対象を確認します。

Get-Service -Name "Spooler"

予行します。

Restart-Service -Name "Spooler" -WhatIf

サービス操作は影響が大きいため、メンテナンス時間や復旧手順を確認してから実行します。

25. イベントログを見る

Windows の調査では、イベントログを見る場面がよくあります。

まず一覧を見て、取得範囲を決める

システムログの直近100件を見ます。

Get-WinEvent -LogName System -MaxEvents 100 |
  Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message

表示名でエラーと警告を絞る

以下の例は、LevelDisplayName が Error / Warning という表記の環境を前提にしています。まず上の一覧で、自分の環境に表示される値を確認してください。表記が異なる場合は、比較する文字列もその値に合わせます。LevelDisplayName はイベントのレベルの表示名です。2

エラーと警告だけに絞ります。

Get-WinEvent -LogName System -MaxEvents 500 |
  Where-Object { $_.LevelDisplayName -in @("Error", "Warning") } |
  Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message

期間で絞る

直近24時間のエラーだけを見ます。

$start = (Get-Date).AddHours(-24)

Get-WinEvent -FilterHashtable @{ LogName = "System"; StartTime = $start } |
  Where-Object { $_.LevelDisplayName -eq "Error" } |
  Select-Object TimeCreated, ProviderName, Id, 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

イベントログは件数が多くなりやすいため、-MaxEvents や期間指定で範囲を絞るのが大事です。

26. ネットワークを確認する

疎通・TCP ポート・名前解決を確認する

疎通確認には Test-Connection を使います。

Test-Connection example.com -Count 4

Windows で TCP ポートの疎通を確認する場合は、Test-NetConnection が便利です。

Test-NetConnection example.com -Port 443

DNS の解決を確認する場合です。

Resolve-DnsName example.com

結果は切り分けの入口として読む

ネットワーク調査では、次のように切り分けます。

名前解決できるか
IP へ届くか
目的のポートが開いているか
プロキシやファイアウォールの影響がないか

PowerShell だけで全部を判断するのではなく、切り分けの入口として使うと便利です。

27. Web の結果を見る

Web ページの応答を見る

Web ページの取得には Invoke-WebRequest を使います。

Invoke-WebRequest https://example.com |
  Select-Object StatusCode, StatusDescription

JSON API の結果を加工する

JSON API の結果を扱う場合は Invoke-RestMethod が便利です。

Invoke-RestMethod https://api.github.com/repos/PowerShell/PowerShell |
  Select-Object full_name, stargazers_count, forks_count

API の結果は最初から PowerShell のオブジェクトとして扱えることが多く、Select-Object や Where-Object と組み合わせやすいです。

社内 API を調べる場合も、まずは読み取り系の GET から始めます。

認証情報やトークンを扱う場合は、画面表示や transcript への記録に注意します。

28. 実行時間を測る ── Measure-Command

いつ使うか: 「この処理を夜間バッチに載せて大丈夫か」を判断するとき、書き方を変えて速くなったか比べるときに使います。感覚ではなく数字で決められるようになります。

処理時間を数値で受け取る

処理にどれくらい時間がかかるか知りたいときは Measure-Command を使います。

Measure-Command {
  Get-ChildItem C:\Windows -File -Recurse -ErrorAction SilentlyContinue |
    Measure-Object
}

結果には TotalSeconds や TotalMilliseconds が含まれます。

$result = Measure-Command {
  Get-ChildItem . -File -Recurse | Measure-Object
}

$result.TotalSeconds

1回の測定だけで判断しない

スクリプトを速くしたいときは、感覚ではなく時間を測るのが大事です。ただし、ファイル数、ディスク状態、ネットワーク状態によって結果は変わるので、1回の結果だけで判断せず、何度か確認します。

29. 時間のかかる処理を裏で動かす ── Start-Job

いつ使うか: 大きなフォルダーの全件走査やハッシュ計算のように数分かかる処理を流しつつ、その間に別の調査を進めたいときに使います。逆に、数秒で終わる処理をジョブ化しても、起動の手間の方が大きくなります。

ジョブを開始する

時間がかかる調査を、別ジョブとして実行したい場合は Start-Job を使います。

$job = Start-Job -ScriptBlock {
  Get-ChildItem C:\Windows -File -Recurse -ErrorAction SilentlyContinue |
    Measure-Object
}

状態を確認してから、結果を受け取る

ジョブの状態を見ます。

Get-Job

この例では、対象ジョブの State が Completed になったことを確認してから結果を受け取ります。Receive-Job はその時点で利用できる結果を取得するコマンドなので、実行中の受け取りを「すべて終わった」と読み替えないようにします。3

Receive-Job $job

結果を確認した後で後始末する

完了したジョブの結果を受け取り、不要になったジョブを削除します。

Remove-Job $job

Start-Job は便利ですが、最初から多用する必要はありません。まずは普通に実行し、時間がかかる処理だけジョブ化すると分かりやすくなります。

30. コマンド履歴を使う

いつ使うか: 試行錯誤しながら組み立てたコマンドを、うまくいったあとで手順書やスクリプトに写すときに使います。

履歴を確認する

過去に実行したコマンドを見るには Get-History を使います。

Get-History

コマンド行だけ見やすくします。

Get-History |
  Select-Object Id, CommandLine

内容を確認した履歴だけ再実行する

Invoke-History は表示ではなく再実行です。Remove-Item や Stop-Process のような変更系コマンドでないか、履歴の内容を確認してから使います。 特定の履歴を再実行する例です。

Invoke-History 12

履歴は、うまくいったコマンドを手順書やスクリプトに写すためにも使えます。再実行と、記録の取り出しを分けて考えてください。

31. エラーの詳細を見る ── Get-Error

PowerShell 7 では、直近のエラーを詳しく見るために Get-Error が使えます。

Get-Error

直近のエラーメッセージだけ見たい場合です。

$Error[0].Exception.Message

メッセージから対象と原因を絞る

エラーが発生したときは、画面の赤い文字だけを見るのではなく、次の点を確認します。

どのコマンドで失敗したか
どのパスや対象で失敗したか
権限の問題か
ファイルが存在しないのか
ネットワークやロックの問題か

調査結果を残したい場合は、Start-Transcript や Export-Csv と組み合わせます。

32. よく使う比較演算子

Where-Object では、比較演算子をよく使います。

演算子 意味 例
-eq 等しい $_.Status -eq "Running"
-ne 等しくない $_.Status -ne "Running"
-gt より大きい $_.Length -gt 10MB
-ge 以上 $_.Length -ge 10MB
-lt より小さい $_.Length -lt 10MB
-le 以下 $_.Length -le 10MB
-like ワイルドカード一致 $_.Name -like "*.log"
-match 正規表現一致 $_.Name -match "^app"
-in 値が一覧に含まれる $_.Status -in @("Running", "Paused")
-contains 一覧が値を含む @("a", "b") -contains "a"

例です。

Get-ChildItem . -File |
  Where-Object { $_.Length -gt 10MB }
Get-Service |
  Where-Object { $_.Status -in @("Running", "Paused") }
Get-ChildItem . -File |
  Where-Object { $_.Name -match "\.log$" }

最初は -eq、-ne、-gt、-lt、-like だけでも十分です。慣れてきたら、-match や -in を使うと条件を書きやすくなります。

33. ちょっとした実務レシピ

ここからは、実務でそのまま使いやすい形の例です。11個の独立したレシピなので、必要なものを選んで使います。 ファイル・ログ・プロセスやサービス・結果の共有と比較、という順に並んでいます。

パスと出力先を確認し、コマンドの意味を確かめたいときは3章の索引へ戻ってください。イベントログの文字列による絞り込みは25章の表示名の注意、削除や停止と組み合わせる場合は34章も確認します。

拡張子ごとのファイル数を見る

Get-ChildItem C:\Work -File -Recurse |
  Group-Object -Property Extension -NoElement |
  Sort-Object -Property Count -Descending

フォルダーの中身をざっくり把握したいときに使います。

大きいファイル上位20件を見る

Get-ChildItem C:\Work -File -Recurse |
  Sort-Object -Property Length -Descending |
  Select-Object -First 20 FullName, @{Name="SizeMB"; Expression={ [math]::Round($_.Length / 1MB, 2) }}

ディスク容量調査でよく使います。

直近24時間に更新されたファイルを見る

$since = (Get-Date).AddHours(-24)

Get-ChildItem C:\Work -File -Recurse |
  Where-Object { $_.LastWriteTime -ge $since } |
  Select-Object FullName, Length, LastWriteTime

障害発生後に、どのファイルが更新されたか見るときに使えます。

ERROR を含むログ行を CSV にする

Select-String -Path C:\App\Logs\*.log -Pattern "ERROR" |
  Select-Object Path, LineNumber, Line |
  Export-Csv .\error-lines.csv -NoTypeInformation -Encoding UTF8

調査結果を共有しやすくなります。

ERROR の前後2行を見る

Select-String -Path C:\App\Logs\*.log -Pattern "ERROR" -Context 2

原因の前後関係を見たいときに使います。

メモリ使用量の大きいプロセスを見る

Get-Process |
  Sort-Object -Property WorkingSet -Descending |
  Select-Object -First 10 Name, Id, @{Name="MemoryMB"; Expression={ [math]::Round($_.WorkingSet / 1MB, 1) }}

自動起動なのに止まっているサービスを見る

Get-Service |
  Where-Object { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" } |
  Select-Object Name, DisplayName, Status, StartType

システムログのエラーを CSV にする

Get-WinEvent -LogName System -MaxEvents 500 |
  Where-Object { $_.LevelDisplayName -eq "Error" } |
  Select-Object TimeCreated, ProviderName, Id, Message |
  Export-Csv .\system-errors.csv -NoTypeInformation -Encoding UTF8

コマンド結果をクリップボードへ送る

Get-Service |
  Select-Object Name, DisplayName, Status |
  ConvertTo-Csv -NoTypeInformation |
  Set-Clipboard

メールやチャットへ貼るときに便利です。

作業前後のファイル一覧を比較する

Get-ChildItem C:\Work -File |
  Select-Object -ExpandProperty Name |
  Set-Content .\before.txt -Encoding UTF8

ここからは対象の作業を終えた後に実行します。 作業後の一覧を別ファイルに取ります。

Get-ChildItem C:\Work -File |
  Select-Object -ExpandProperty Name |
  Set-Content .\after.txt -Encoding UTF8

比較します。

Compare-Object (Get-Content .\before.txt) (Get-Content .\after.txt)

フォルダーの合計サイズを GB で見る

$size = Get-ChildItem C:\Work -File -Recurse |
  Measure-Object -Property Length -Sum

[math]::Round($size.Sum / 1GB, 2)

34. 変更系コマンドと組み合わせるときの注意

ここまでの多くは読み取り系で、これらだけなら比較的気軽に試せます。 一方で、こちらは変更系のコマンドです。

操作 コマンド
コピー Copy-Item
移動 Move-Item
削除 Remove-Item
名前変更 Rename-Item
プロセス停止 Stop-Process
サービス再起動 Restart-Service
環境変数の永続設定 [Environment]::SetEnvironmentVariable()

確認から実行までを一組にする

変更系は、次の順番で使います。

1. Get 系で対象を見る
2. Where-Object で絞る
3. Select-Object で対象一覧を見る
4. Measure-Object で件数を数える
5. 必要なら Export-Csv で残す
6. -WhatIf が使える場合は予行する
7. 実行する

たとえば、古い .tmp ファイルを削除する場合です。

対象を絞り、一覧と件数を確認する

まず対象を見ます。

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

$targets = Get-ChildItem C:\Temp -Filter *.tmp -File -Recurse |
  Where-Object { $_.LastWriteTime -lt $limit }

$targets |
  Select-Object FullName, Length, LastWriteTime

件数を数えます。

$targets | Measure-Object

証跡を残して、変更予定を確認する

CSV に残します。

$targets |
  Select-Object FullName, Length, LastWriteTime |
  Export-Csv .\delete-targets.csv -NoTypeInformation -Encoding UTF8

削除予定を確認します。

$targets | Remove-Item -WhatIf

確認した対象にだけ実行する

対象一覧・件数・削除予定を確認し、問題なければ実行します。

$targets | Remove-Item

この流れを守るだけで、事故はかなり減らせます。

35. 覚え方

コマンドを個別に暗記しようとすると大変なので、目的ごとに覚える方が使いやすくなります。

目的 思い出すコマンド
数えたい Measure-Object
合計したい Measure-Object -Sum
種類ごとに見たい Group-Object
重複を消したい Sort-Object -Unique
必要な値だけ欲しい Select-Object -ExpandProperty
列を整えたい Select-Object
大きい順に見たい Sort-Object -Descending
文字列を探したい Select-String
前後を見たい Select-String -Context
2つを比べたい Compare-Object
証跡を残したい Export-Csv / Start-Transcript
画面にもファイルにも出したい Tee-Object
クリップボードに送りたい Set-Clipboard
時間を測りたい Measure-Command
エラーを詳しく見たい Get-Error

1ページのチートシート

印刷して手元に置く用に、書き方まで入れた早見表にします。日常作業を組み立てるときの入口として使ってください。Get-Error は31章で説明した PowerShell 7 のコマンドです。イベントログの表示名は25章、記録に機密を混ぜないための注意は18章を参照してください。

目的 そのまま使える形
ファイル数を数える Get-ChildItem . -File \| Measure-Object
合計サイズを GB で見る [math]::Round((Get-ChildItem . -File -Recurse \| Measure-Object -Property Length -Sum).Sum / 1GB, 2)
拡張子ごとの件数 Get-ChildItem . -File \| Group-Object -Property Extension -NoElement \| Sort-Object -Property Count -Descending
大きいファイル上位20件 Get-ChildItem . -File -Recurse \| Sort-Object Length -Descending \| Select-Object -First 20 FullName, Length
直近24時間に更新されたもの Get-ChildItem . -File -Recurse \| Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-1) }
値だけ取り出す Get-Service \| Select-Object -ExpandProperty Name
重複を消す Get-Content .\list.txt \| Sort-Object -Unique
ログから ERROR を探す Select-String -Path .\logs\*.log -Pattern "ERROR"
ERROR の前後2行を見る Select-String -Path .\logs\*.log -Pattern "ERROR" -Context 2
2つの一覧を比べる Compare-Object -ReferenceObject (Get-Content .\before.txt) -DifferenceObject (Get-Content .\after.txt)
ハッシュ値を確認する Get-FileHash .\installer.exe -Algorithm SHA256
結果をクリップボードへ Get-Service \| Select-Object Name, Status \| ConvertTo-Csv -NoTypeInformation \| Set-Clipboard
画面にもファイルにも出す Get-Process \| Tee-Object -FilePath .\out.txt
作業ログを取り始める Start-Transcript -Path .\work.log
CSV を条件で絞る Import-Csv .\data.csv \| Where-Object { $_.Status -eq "NG" }
CSV に残す ... \| Export-Csv .\out.csv -NoTypeInformation -Encoding UTF8
メモリの大きいプロセス Get-Process \| Sort-Object WorkingSet -Descending \| Select-Object -First 10 Name, Id, WorkingSet
止まっている自動起動サービス Get-Service \| Where-Object { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" }
イベントログのエラー Get-WinEvent -LogName System -MaxEvents 200 \| Where-Object { $_.LevelDisplayName -eq "Error" }
疎通を確認する Test-NetConnection -ComputerName example.local -Port 443
実行時間を測る Measure-Command { ... }
直前のエラーを詳しく見る Get-Error

忘れてはいけない順番

見る → 数える → 整える → 残す → 予行する → 実行する

Format-Table と Format-List は、この流れの一番最後、画面で見るときだけに使います。Export-Csv や次のコマンドへ渡す前に挟むと、そこから先が壊れます。

36. まとめ

PowerShell は、スクリプトを書けるようになると強力です。ただし、実務で一番よく使うのは、意外と小さなコマンドの組み合わせです。

数える
並べる
まとめる
比べる
探す
抜き出す
保存する
クリップボードへ送る
作業ログを残す

これらができるだけで、日常作業はかなり楽になります。最初から難しい自動化を目指す必要はありません。 まずは読み取り系のコマンドで状況を正確に見られるようにして、そのうえで、必要なときだけ Copy-Item、Move-Item、Remove-Item、Restart-Service などの変更系コマンドを使います。

PowerShell を安全に使うコツは、次の順番です。

見る → 数える → 整える → 残す → 予行する → 実行する

この型を身につけると、PowerShell は「黒い画面でコマンドを打つもの」ではなく、日々の調査、整理、報告を支える実用的な道具になります。

参考リンク

  1. Microsoft Learn, New-Item. プロファイルの作成例と、-Force で既存ファイルを上書きする動作について。 ↩

  2. Microsoft Learn, EventLogRecord.LevelDisplayName. イベントレベルの表示名を取得するプロパティについて。 ↩

  3. Microsoft Learn, Receive-Job. その時点で取得できるジョブの結果を受け取る動作について。 ↩

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

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

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

よくある質問

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

PowerShellでファイルの件数や合計サイズを調べるにはどうすればよいですか?
Get-ChildItemの結果をMeasure-Objectにパイプします。件数は結果のCountプロパティで確認でき、サブフォルダーも含める場合は-Recurseを付けます。合計サイズはMeasure-Object -Property Length -Sumで集計し、バイト数のままだと読みにくいので[math]::Round($size.Sum / 1GB, 2)のようにGB単位へ変換すると見やすくなります。-Averageや-Maximumを付ければ平均値・最大値も一度に出せます。
Select-Objectの-ExpandPropertyは通常の指定と何が違いますか?
Select-Object Nameは「Nameという列を持つ表(オブジェクト)」を返しますが、Select-Object -ExpandProperty Nameは「Nameの値そのもの」を返します。CSVに出力したいときは列として残す通常の指定が向いており、別のコマンドや文字列処理、テキストファイルへ値だけを渡したいときは-ExpandPropertyが扱いやすいです。目的によって使い分けます。
Format-TableをExport-Csvの前に使ってはいけないのはなぜですか?
Format-TableやFormat-Listは画面表示用のコマンドで、出力が表示用オブジェクトに変わってしまうため、その後のCSV出力や加工が正しく行えなくなるからです。CSVに出す場合や次のコマンドで加工する場合は、Select-Objectで列を選んでからExport-Csvに渡します。「画面で見るだけならFormat系、後で使うならSelect-Object」と覚えると迷いません。
Remove-Itemなどの変更系コマンドを安全に使う手順はありますか?
いきなり実行せず、まずGet系コマンドで対象を見て、Where-Objectで絞り、Select-Objectで対象一覧を確認し、Measure-Objectで件数を数え、必要ならExport-Csvで証跡を残します。そのうえで-WhatIfが使えるコマンドなら予行して削除・移動の予定を確認し、問題なければ実行します。この順番を守るだけで事故はかなり減らせます。

著者プロフィール

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

小村 豪

合同会社小村ソフト 代表

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

ブログ一覧に戻る