はじめに
VBScriptの非推奨化や社内自動化資産の見直しをきっかけに、VBSやBATで作ってきた小さな自動化をPowerShellへ移行したいと考える場面が増えています。
しかし、PowerShellは「VBSの文法違い」ではありません。
ファイル操作、CSV処理、ログ出力、タスクスケジューラ実行、エラー処理、パイプライン、文字コード、Excel COM自動化など、実務で使うには押さえるべき考え方があります。
この連載では、VBS/BATを少し使ったことがある人を対象に、PowerShellを体系的に学べるように記事を整理しました。
目的は、高度なスクリプト職人になることではなく、社内の定型処理を安全に作り、運用し、トラブル時に切り分けられるようになることです。
1. PowerShellでまず覚える基本コマンド10選
PowerShellを初めて触る人向けに、最初に覚えるべき基本コマンドを整理した記事です。
Get-ChildItem、New-Item、Copy-Item、Move-Item、Remove-Item、Get-Content、Set-Content など、ファイル操作の基礎になるコマンドを扱います。
単にコマンドを並べるのではなく、検証用フォルダと検証用ファイルを作成し、それを確認・コピー・移動・削除する流れで学べる構成にしています。
VBS/BAT利用者が「PowerShellで何ができるのか」を最初につかむための記事です。
2. PowerShellスクリプトファイル(.ps1)の作り方と実行方法
PowerShellのコマンドを画面に直接入力する段階から、.ps1 ファイルとして保存して実行する段階へ進むための記事です。
メモ帳やVS Codeで .ps1 を作る方法、.\sample.ps1 のように実行する方法、ダブルクリック実行を避ける理由などを整理しています。
また、$PSScriptRoot を使ってスクリプトの配置場所を基準にする考え方も扱います。
タスクスケジューラや社内運用に進む前に、PowerShellを「単発コマンド」ではなく「再利用できるスクリプト」として扱うための入口になる記事です。
3. PowerShell実行ポリシー入門――ps1が実行できないときに確認すること
.ps1 ファイルを実行しようとしたときに、実行ポリシーで止まる場合の確認ポイントを整理した記事です。
Get-ExecutionPolicy、Get-ExecutionPolicy -List、Set-ExecutionPolicy RemoteSigned -Scope CurrentUser など、基本的な確認と設定方法を扱います。
また、タスクスケジューラや一時実行で使われる -ExecutionPolicy Bypass の意味も説明します。
単に「Bypassを付ければよい」ではなく、会社PCではグループポリシーや社内ルールが優先されることも含めて、実務上の注意点を整理しています。
4. PowerShellのパス指定入門――相対パス・絶対パス・$PSScriptRoot
PowerShellでつまずきやすいパス指定について整理する記事です。
相対パス、絶対パス、カレントディレクトリ、$PSScriptRoot、Join-Path の違いを扱い、手動実行とタスクスケジューラ実行で参照先がズレる理由を説明します。
VBS/BATから移行すると、つい .\file.txt のような相対パスに頼りがちです。
しかし、定期実行や他ユーザー実行では想定外の場所を参照することがあります。
PowerShellスクリプトを安定して運用するための基礎になる記事です。
5. PowerShellでファイルをコピー・移動・削除する
Copy-Item、Move-Item、Remove-Item を使って、ファイルのコピー・移動・削除を行う記事です。
コピー先や移動先のフォルダを事前に作る、上書き時には -Force を使う、削除前には -WhatIf で対象を確認する、といった実務的な注意点を扱います。
特に削除処理は、PowerShellで自動化すると影響が大きくなります。
そのため、いきなり削除するのではなく、対象確認、CSV出力、-WhatIf による事前確認を入れる考え方を重視しています。
6. PowerShellで月次フォルダ・日次フォルダを自動作成する
Get-Date と New-Item を使って、日次フォルダや月次フォルダを自動作成する記事です。
yyyyMMdd、yyyyMM、yyyy-MM-dd など、フォルダ名やログ名に使いやすい日付形式を整理しています。
日次バックアップ、月次処理、CSV出力先の作成、ログ保存先の作成など、実務でよく使う基本パターンを扱います。
また、.ps1 と同じ場所を基準にするために $PSScriptRoot と Join-Path を使う構成にしており、タスクスケジューラ実行にもつながる内容です。
7. PowerShellでファイル一覧をCSV出力する
Get-ChildItem、Select-Object、Export-Csv を使って、フォルダ内のファイル一覧をCSV出力する記事です。
ファイル名、フルパス、拡張子、サイズ、作成日時、更新日時などを一覧化する方法を扱います。
共有フォルダの棚卸し、古いファイルの洗い出し、バックアップ対象の確認、VBS資産調査などに使える基本パターンです。
また、ファイルサイズをMBで表示する列の追加や、日付付きCSVファイル名、文字コード指定にも触れています。
8. PowerShellでCSVを読み込んで一括処理する
Import-Csv を使ってCSVを読み込み、その内容をもとに一括処理する記事です。
CSVの列名を使って値を取り出し、ForEach-Object で1行ずつ処理し、フォルダ作成やファイル作成につなげる方法を扱います。
VBS/BATでは文字列処理になりがちなCSVも、PowerShellでは列名を持ったオブジェクトとして扱えます。
この記事では、CSVを「処理対象台帳」として使い、空欄チェック、ファイル名に使えない文字の置換、ログ出力まで含めて整理しています。
9. PowerShellでログを出力する
Add-Content、Set-Content、Out-File、Start-Transcript を使ってログを出力する記事です。
手動実行では画面を見れば結果が分かりますが、タスクスケジューラで実行する場合はログがないと成功・失敗を追えません。
この記事では、処理開始、処理終了、成功、失敗、処理件数、エラー内容をログに残す基本形を扱います。
また、ログ関数 Write-Log を作り、日時付きで記録するテンプレートも紹介しています。
10. タスクスケジューラでPowerShellを実行する
.ps1 ファイルをWindowsのタスクスケジューラで実行する基本設定を整理した記事です。
「プログラムまたはスクリプト」に powershell.exe を指定し、「引数の追加」に -NoProfile -ExecutionPolicy Bypass -File "..." を指定する基本形を扱います。
また、「開始場所」を空欄にしないこと、$PSScriptRoot を使うこと、手動実行で動作確認してから登録することも説明しています。
PowerShellを定期実行するための実務上の入口になる記事です。
11. タスクスケジューラでPowerShellが動かないときの確認ポイント10選
タスクスケジューラに登録したPowerShellが動かないときの切り分け記事です。
手動実行で動くか、タスクと同じコマンドで動くか、.ps1 を直接指定していないか、開始場所が空欄でないか、実行ユーザーが想定通りか、といった確認ポイントを整理しています。
特に、タスクスケジューラではネットワークドライブ、共有フォルダ権限、ログオン条件、実行ポリシーが原因になることが多いです。
「手動では動くのにタスクでは動かない」場合の実務的な確認リストとして使える記事です。
12. タスクスケジューラ実行時のログ設計――失敗に気づけるPowerShellを書く
タスクスケジューラでPowerShellを動かすときに、どのようなログを残すべきかを整理した記事です。
開始ログ、終了ログ、実行ユーザー、PSScriptRoot、カレントディレクトリ、対象件数、成功件数、失敗件数、終了コードなどを扱います。
重要なのは、単に「ログを出す」ことではなく、「失敗に気づけるログ」にすることです。
この記事では、try/catch/finally、-ErrorAction Stop、exit 0 / exit 1 を組み合わせた実務向けテンプレートを紹介しています。
13. VBSのFileSystemObjectをPowerShellに置き換える基本パターン
VBSでよく使われる FileSystemObject を、PowerShellの標準コマンドに置き換える考え方を整理する記事です。
ファイル存在確認、フォルダ作成、コピー、移動、削除、ファイル一覧取得などを、Test-Path、New-Item、Copy-Item、Move-Item、Remove-Item、Get-ChildItem に対応させます。
単なる文法変換ではなく、PowerShellではファイルをオブジェクトとして扱える点が重要です。
VBS資産をPowerShellへ移行する際の基本対応表として使える記事です。
14. MsgBox / InputBoxをPowerShellではどう扱うか
VBSの MsgBox や InputBox をPowerShellではどう扱うべきかを整理した記事です。
Write-Host、Read-Host、Windows FormsのMessageBoxなど、PowerShellで似たことを実現する方法を紹介しています。
ただし、記事の中心は「対話処理をそのまま移植しないこと」です。
タスクスケジューラや無人実行では、入力待ちやメッセージボックス表示が原因で処理が止まることがあります。
CSV、設定ファイル、引数、ログに置き換える考え方を扱っています。
15. On Error Resume NextをPowerShellのtry/catchに置き換える
VBSの On Error Resume Next を、PowerShellの try/catch/finally に置き換える考え方を整理した記事です。
VBSではエラーを流して後から Err.Number を見ることがありますが、PowerShellではエラーを検知し、ログに記録し、必要に応じて終了コードを返す発想が重要です。
また、PowerShellではすべてのエラーが自動的に catch に入るわけではないため、重要な処理では -ErrorAction Stop を使います。
エラーを握りつぶさない運用向けの移行記事です。
16. PowerShellで文字コード・日本語ファイル名を扱うときの注意点
CSV、ログ、日本語ファイル名を扱うときに起きやすい文字コード問題を整理した記事です。
Windows PowerShell 5.1 と PowerShell 7 では文字コードの既定値が異なるため、-Encoding UTF8、utf8BOM、Default などを明示する考え方を扱います。
また、日本語ファイル名そのものよりも、パス指定、Join-Path、-LiteralPath、ファイル名に使えない文字の置換が重要であることも説明しています。
VBS移行時に見落としやすい実務上の注意点をまとめた記事です。
17. PowerShellのパイプライン入門――Get-ChildItem | Where-Object | Select-Objectを理解する
PowerShellらしい書き方であるパイプラインを理解するための記事です。
Get-ChildItem | Where-Object | Select-Object | Export-Csv の流れを使い、「集める、絞る、整える、出力する」という考え方を説明しています。
BATのパイプは文字列を渡すイメージですが、PowerShellではオブジェクトを次の処理に渡します。
この違いを理解すると、ファイル一覧、条件抽出、CSV出力、ログ調査などの処理がかなり書きやすくなります。
18. Where-Objectで条件抽出する――更新日時・拡張子・サイズでファイルを絞り込む
Where-Object を使って、条件に合うファイルだけを抽出する記事です。
拡張子、ファイル名、サイズ、更新日時、作成日時、複数条件、配列による条件指定などを扱います。
たとえば、30日以上更新されていないファイル、10MB以上のファイル、.log かつ古いファイルなどを抽出できます。
削除や移動と組み合わせる前に、まずCSV出力や -WhatIf で対象を確認する考え方も重視しています。
19. Select-Object / Sort-Object / Group-Objectで一覧を整形する
取得したファイル一覧を、見やすく整形するための記事です。
Select-Object で必要な項目だけ選び、Sort-Object で更新日時やサイズ順に並べ、Group-Object で拡張子別・フォルダ別に件数を集計します。
共有フォルダ調査や不要ファイル調査では、単に一覧を出すだけでなく、サイズ順に並べたり、拡張子別に集計したりすることが重要です。
調査結果をCSVにして、棚卸し資料として使うための記事です。
20. PowerShellでExcel COM自動化をするときに注意すべきこと
VBS移行で事故りやすいExcel COM自動化について、注意点を整理した記事です。
New-Object -ComObject Excel.Application を使えばPowerShellからExcelを操作できますが、無人実行、タスクスケジューラ、共有ファイル、プロセス残り、COM解放などでトラブルが起きやすい領域です。
この記事では、CSV処理にExcel COMを使わない、相対パスで開かない、try/catch/finally で終了処理を書く、ReleaseComObject() を意識する、といった実務上の注意点を整理しています。
Excel COMは「できるから使う」のではなく、Excelでなければできない処理に限定して使うべきだという位置づけです。
おわりに
この連載で扱っている内容は、PowerShellのすべてではありません。
高度な関数化、モジュール化、クラス、リモート管理、Active Directory操作、Microsoft Graph連携などは、さらに先のテーマです。
しかし、情シスや現場部門の小さな自動化を安全に運用するうえでは、まず次の内容が重要です。
ファイルを扱えること
CSVを読み書きできること
ログを残せること
タスクスケジューラで実行できること
エラーを検知できること
パイプラインで一覧を加工できること
文字コードや日本語ファイル名で詰まらないこと
Excel COMを安易に使わないこと
VBSやBATで作られた社内スクリプトは、単なる古い技術ではなく、現場業務を支えてきた小さな自動化資産です。
PowerShellへの移行では、文法を置き換えるだけでは不十分です。
誰が実行するのか、どこにログを残すのか、失敗したときにどう気づくのか、タスクスケジューラで安定して動くのか、という運用面まで含めて考える必要があります。
この連載が、VBS/BATからPowerShellへ移行する際の実務的な入口になれば幸いです。