PowerShellで業務効率化|ファイル整理・CSV自動化

PowerShellで業務効率化|ファイル整理・CSV自動化 業務改善

「PowerShellは会社PCでも使える」「実行ポリシーの仕組みも分かった」——PowerShellの始め方まで読んだ方は多いと思います。そんな方が次に気になるのは、「で、実際に何ができるの?」という点でしょう。ここまでは準備運動のようなものです。

この記事は、PowerShellとAIを組み合わせた業務効率化を「頼む→動かす→直す」の流れでそのまま追体験できるように構成しています。題材は「ダウンロードフォルダの自動整理」と「複数CSVの結合・集計」。事務系の仕事で、誰もが一度はぶつかったことのある作業ではないでしょうか。読み終える頃には、自分の業務に置き換えて同じ流れを試せるようになっているはずです。まだシリーズを読んでいない方はPowerShellでバイブコーディング入門から目を通しておくと理解が早いと思います。

バイブコーディングの基本の型——AIへの伝え方3ステップ

本題に入る前に、この記事全体で使う「型」を先に共有しておきます。難しいものではなく、たった3つです。

  1. やりたいことを具体的に伝える(対象フォルダ・条件・欲しい結果を明示する)
  2. コードを実行する前に「このコードは何をするか、箇条書きで説明して」とAIに聞く
  3. 本番データではなく、コピーしたテストフォルダやテストデータで先に試す

このうち一番おろそかにされがちなのは1番目。「いい感じに整理して」ではAIも困ってしまいます。「ダウンロードフォルダの中身を拡張子ごとにサブフォルダへ分けて」のように、対象と結果を言葉にするだけで精度はぐっと上がります。

2と3は、いわば保険です。中身を理解せずに実行しない、いきなり本物のデータで試さない。この2つを徹底するだけで、あとで困る事態の大半は避けられます。次の記事でセキュリティの話をもう少し詳しく扱いますが、正直なところ、この3ステップを守っているだけで防げるリスクはかなり多いです。

具体例1——ダウンロードフォルダをファイル種類ごとに自動整理する

ダウンロードフォルダの中身が、PDF・画像・Excelファイルでごちゃまぜになっている。心当たりのある方は多いはずです。私自身、放置すると数百件たまってから後悔するタイプなので、この作業は毎回AIに任せています。

まず、AIへの指示文はこうです。

ダウンロードフォルダの中のファイルを、拡張子ごとに
PDF・画像・Excelというサブフォルダに移動する
PowerShellのコードを書いてください。

これに対して、たとえば次のようなコードが返ってきます。

$downloadPath = "$env:USERPROFILE\Downloads"

$folders = @{
    ".pdf"  = "PDF"
    ".jpg"  = "画像"
    ".jpeg" = "画像"
    ".png"  = "画像"
    ".xlsx" = "Excel"
    ".xls"  = "Excel"
}

Get-ChildItem -Path $downloadPath -File | ForEach-Object {
    $ext = $_.Extension.ToLower()
    if ($folders.ContainsKey($ext)) {
        $destFolder = Join-Path $downloadPath $folders[$ext]
        if (-not (Test-Path $destFolder)) {
            New-Item -ItemType Directory -Path $destFolder | Out-Null
        }
        Move-Item -Path $_.FullName -Destination $destFolder
    }
}

Write-Host "整理が完了しました。"

使われている部品はシンプルです。Get-ChildItemでフォルダの中身を一覧にし、Move-Itemで移動させる。この2つが分かれば、コード全体の流れは大体つかめます。コマンドの細かい使い方まで覚える必要はありません。

ファイル整理の具体例

ここで基本の型③を思い出してください。いきなり本物のダウンロードフォルダで試すのはおすすめしません。まずは同じ構成のファイルを何個かコピーした「テストフォルダ」を作り、そこでパスを書き換えて動かしてみる。これだけで、思わぬファイルを移動してしまうリスクをほぼゼロにできます。

もう一つ、実行前に安心材料が欲しい方には-WhatIfという便利なオプションがあります。Move-Itemの末尾に付けるだけで、実際には何も動かさず「これを移動する予定です」というシミュレーション結果だけを表示してくれます。

先ほどのスクリプトのMove-Itemの行だけを書き換えると、次のようになります。$_はループの中でしか値を持たないため、この行だけを単独でコンソールに貼り付けても動きません。必ずスクリプト全体をこの形にしてから実行してください。

$downloadPath = "$env:USERPROFILE\Downloads"

$folders = @{
    ".pdf"  = "PDF"
    ".jpg"  = "画像"
    ".jpeg" = "画像"
    ".png"  = "画像"
    ".xlsx" = "Excel"
    ".xls"  = "Excel"
}

Get-ChildItem -Path $downloadPath -File | ForEach-Object {
    $ext = $_.Extension.ToLower()
    if ($folders.ContainsKey($ext)) {
        $destFolder = Join-Path $downloadPath $folders[$ext]
        if (-not (Test-Path $destFolder)) {
            New-Item -ItemType Directory -Path $destFolder | Out-Null
        }
        Move-Item -Path $_.FullName -Destination $destFolder -WhatIf
    }
}

いわば、本番前の下見のようなもの。使ってみて問題なさそうなら-WhatIfを外して本実行、という流れにしておくと、初めての作業でも気持ちに余裕が持てます。

具体例2——複数のCSVファイルを1つに結合して集計する

毎月の売上CSVがファイルごとに分かれていて、合計を出すのが面倒。これも中小企業の経理・総務でよく聞く話です。Excelで一つずつ開いてコピペする作業を、そのまま人力でやっている会社もまだ多いはずです。

指示文の例はこちらです。

同じフォルダにある複数のCSVファイルをすべて読み込んで1つに結合し、
商品カテゴリごとの合計金額を出すPowerShellのコードを書いてください。
CSVには「日付」「商品カテゴリ」「金額」の列があります。

返ってくるコードはこんな形になります。

$folderPath = "C:\売上データ"
$csvFiles = Get-ChildItem -Path $folderPath -Filter "*.csv"

$allData = foreach ($file in $csvFiles) {
    Import-Csv -Path $file.FullName -Encoding Default
}

$summary = $allData | Group-Object -Property 商品カテゴリ | ForEach-Object {
    [PSCustomObject]@{
        商品カテゴリ = $_.Name
        合計金額     = ($_.Group | Measure-Object -Property 金額 -Sum).Sum
    }
}

$summary | Export-Csv -Path "$folderPath\集計結果.csv" -NoTypeInformation -Encoding Default

Write-Host "集計が完了しました。"

Import-Csvでファイルを読み込み、Group-Objectでカテゴリごとにまとめ、Export-Csvで書き出す。この3つの流れさえイメージできれば十分です。なお、Excelで作ったCSVを読み書きする際は-Encoding Defaultを指定しておくと、日本語の文字化けを避けやすくなります。ただし、Excelで保存形式を「CSV UTF-8」にして作ったファイルの場合は、-Encoding Defaultを指定すると逆に文字化けすることがあります。保存形式が分からないときは、両方試して崩れない方を使う程度の気軽さで構いません。

CSV結合・集計の流れ

このCSVルートには、地味ながら実務上の強みがあります。Excelそのものがなくても、結合・集計まで完結する点です。

Excelファイル(xlsx)を直接操作する方法もありますが、その多くはExcel本体が入っている前提の仕組みです。会社PCによってはバージョンが古かったり、共有PCには入っていなかったりしますよね。CSVで完結させておけば、そうした環境差に左右されにくい。地味ですが、現場ではけっこう効いてきます。

エラーが出ても慌てない——最初の対処法

ここまで順調に読み進めた方でも、実際に自分の環境で試すと高確率で何かしらのエラーに当たります。赤い文字がずらっと表示されると身構えてしまいますが、あれは「敵」ではなく「原因を教えてくれるヒント」だと捉えてください。

よくある初心者エラーは、だいたい次の3つに集約されます。

  • パスの指定ミス(フォルダの場所が間違っている)
    Get-ChildItem : パス 'C:\Downloads' が存在しないため検出できません。
  • 対象ファイルが別のアプリで開いたままロックされている
    Move-Item : プロセスはファイル '...\売上.csv' にアクセスできません。 別のプロセスが使用中です。
  • 実行ポリシーの制限(.ps1ファイルとして保存して実行した場合)
    このシステムではスクリプトの実行が無効になっているため、 ファイル ...ps1 を読み込むことができません。
    この3つ目については、PowerShellの始め方で対処法を詳しく解説しています。

一番大事な対処法は、拍子抜けするほどシンプルです。エラーメッセージを丸ごとコピーして、AIに「このエラーが出ました。直してください」と貼り付けて聞き直すだけ。原因の推測も、対処法を自分で調べる必要もありません。

実行したら次のエラーが出ました。直してください。

Get-ChildItem : パス 'C:\Downloads' が存在しないため検出できません。

体系立てたトラブルシューティングまでは、この記事では扱いません。まずは「エラー=AIに聞き直せば大抵なんとかなる」という気楽さを持ってもらうことのほうが、実践段階では大切だと感じています。

まとめ

この記事のポイントを箇条書きにしておきます。

  • AIへの伝え方は「具体的に伝える→説明させる→テストで試す」の3ステップ
  • ファイル整理・CSV集計はどちらもコピペの指示文からすぐ試せる
  • エラーが出たら、そのままAIに貼り付けて聞き直せば大抵解決する

便利に使えるようになったら、次にやってほしいことがひとつあります。AIが提案したコードや外部ライブラリを、無条件に信じていないかどうか。この点はPowerShell×AIのセキュリティで詳しく扱っています。「便利に使う」の次は「安全に使い続ける」段階です。あわせて読んでおいてください。

「自分の業務のどこから手をつければいいか分からない」という方も少なくないと思います。そうした場合は、TechnoBridgeの無料相談で、日々の業務の中からバイブコーディングに向いている作業を一緒に洗い出すこともできます。神奈川・東京・山梨を中心に、商工会議所での勉強会や個別相談に対応していますので、気軽にお声がけください。

コメント

タイトルとURLをコピーしました