「毎日同じフォルダ整理をしている…」
「大量のファイル名を変更するのが面倒…」
「定期的なバックアップを忘れてしまう…」
こんな繰り返し作業に時間を取られていませんか?
**PowerShell(パワーシェル)**を使えば、これらの作業をすべて自動化できるんです!
「でもプログラミングなんてできない…」と思った方も大丈夫。PowerShellは、コマンドをコピペするだけでも使える優しいツールです。
今回は、PowerShellの基本から、今すぐ使える実用的な自動化スクリプトまで、初心者でも理解できるように解説します。
この記事を読み終わる頃には、あなたも自動化マスターになれるはずです!
PowerShellとは:Windowsの最強自動化ツール

PowerShellって何?
PowerShellは、Microsoftが開発した強力な自動化ツールです。
Windows 7以降のすべてのWindowsに標準搭載されており、追加インストール不要で使えます。
コマンドプロンプトとの違い
PowerShellの方が圧倒的に高機能!
機能 | コマンドプロンプト | PowerShell |
---|---|---|
基本コマンド | 約280個 | 1500個以上 |
オブジェクト処理 | × | ◯ |
.NET連携 | × | ◯ |
リモート操作 | △ | ◎ |
スクリプト機能 | 限定的 | 高機能 |
身近な例で理解しよう
PowerShellは「魔法の呪文」みたいなもの
# 例:デスクトップの全てのテキストファイルを一瞬でDocumentsフォルダに移動
Get-ChildItem "$env:USERPROFILE\Desktop\*.txt" | Move-Item -Destination "$env:USERPROFILE\Documents"
たった1行で、手作業なら5分かかることが1秒で完了!
PowerShellの起動と基本操作
3つの起動方法
方法1:スタートメニューから
- Windowsキーを押す
- 「powershell」と入力
- Windows PowerShell を選択
方法2:右クリックメニューから
- Windowsキー + X
- 「Windows PowerShell」を選択
方法3:ファイル名を指定して実行
- Win + R
- 「powershell」と入力
- Enter
管理者権限での起動
より高度な操作には管理者権限が必要
- スタートメニューで「powershell」検索
- 右クリック → 「管理者として実行」
- ユーザーアカウント制御で「はい」
基本的な画面の見方
PS C:\Users\YourName>
- PS:PowerShellの印
- C:\Users\YourName:現在の場所(カレントディレクトリ)
- >:コマンド入力待ちの印
今すぐ使える!実用的な自動化スクリプト10選
1. ファイル整理の自動化
デスクトップを種類別に整理
# デスクトップのファイルを拡張子別にフォルダ分け
$desktop = "$env:USERPROFILE\Desktop"
# 画像ファイルを「画像」フォルダに移動
$imageFolder = "$desktop\画像"
if (!(Test-Path $imageFolder)) { New-Item -ItemType Directory -Path $imageFolder }
Get-ChildItem "$desktop\*.jpg", "$desktop\*.png", "$desktop\*.gif" |
Move-Item -Destination $imageFolder
# 文書ファイルを「文書」フォルダに移動
$docFolder = "$desktop\文書"
if (!(Test-Path $docFolder)) { New-Item -ItemType Directory -Path $docFolder }
Get-ChildItem "$desktop\*.docx", "$desktop\*.xlsx", "$desktop\*.pdf" |
Move-Item -Destination $docFolder
Write-Host "デスクトップの整理が完了しました!" -ForegroundColor Green
2. 一括ファイル名変更
連番付きでファイル名を変更
# フォルダ内のすべての画像に連番を付ける
$folder = "C:\Photos"
$counter = 1
Get-ChildItem "$folder\*.jpg" | ForEach-Object {
$newName = "Photo_{0:D3}.jpg" -f $counter
Rename-Item $_.FullName -NewName $newName
Write-Host "$($_.Name) → $newName"
$counter++
}
日付を付けてファイル名変更
# ファイル名に作成日を追加
Get-ChildItem "C:\Documents\*.pdf" | ForEach-Object {
$date = $_.CreationTime.ToString("yyyyMMdd")
$newName = "$date_$($_.Name)"
Rename-Item $_.FullName -NewName $newName
}
3. 自動バックアップ
重要フォルダの定期バックアップ
# バックアップスクリプト
$source = "C:\重要データ"
$destination = "D:\バックアップ\$(Get-Date -Format 'yyyy-MM-dd')"
# バックアップ先フォルダ作成
New-Item -ItemType Directory -Path $destination -Force
# ファイルをコピー(新しいファイルのみ)
robocopy $source $destination /E /XO /R:3 /W:10
# ログ記録
$logFile = "D:\バックアップ\backup_log.txt"
"バックアップ完了: $(Get-Date)" | Out-File $logFile -Append
Write-Host "バックアップが完了しました!" -ForegroundColor Green
4. 不要ファイルの自動削除
一時ファイルとゴミファイルを削除
# 30日以上古いファイルを削除
$targetFolder = "C:\Temp"
$daysOld = 30
Get-ChildItem $targetFolder -Recurse |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$daysOld) } |
Remove-Item -Force -Recurse
# Windowsの一時ファイルをクリア
Remove-Item "$env:TEMP\*" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "C:\Windows\Temp\*" -Recurse -Force -ErrorAction SilentlyContinue
# ごみ箱を空にする
Clear-RecycleBin -Force -ErrorAction SilentlyContinue
Write-Host "クリーンアップ完了!" -ForegroundColor Green
5. システム情報の自動収集
PCの状態を定期的にレポート
# システム情報レポート生成
$reportPath = "C:\Reports\SystemInfo_$(Get-Date -Format 'yyyyMMdd').html"
$html = @"
<html>
<head>
<title>システム情報レポート</title>
<style>
body { font-family: Arial; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #4CAF50; color: white; }
</style>
</head>
<body>
<h1>システム情報レポート - $(Get-Date)</h1>
"@
# CPU情報
$html += "<h2>CPU使用率</h2>"
$cpu = Get-Counter "\Processor(_Total)\% Processor Time" | Select-Object -ExpandProperty CounterSamples
$html += "<p>現在のCPU使用率: $([math]::Round($cpu.CookedValue, 2))%</p>"
# メモリ情報
$html += "<h2>メモリ使用状況</h2>"
$memory = Get-CimInstance Win32_OperatingSystem
$totalMem = [math]::Round($memory.TotalVisibleMemorySize / 1MB, 2)
$freeMem = [math]::Round($memory.FreePhysicalMemory / 1MB, 2)
$usedMem = $totalMem - $freeMem
$html += "<p>総メモリ: ${totalMem}GB / 使用中: ${usedMem}GB / 空き: ${freeMem}GB</p>"
# ディスク情報
$html += "<h2>ディスク使用状況</h2><table>"
$html += "<tr><th>ドライブ</th><th>総容量</th><th>使用容量</th><th>空き容量</th><th>使用率</th></tr>"
Get-PSDrive -PSProvider FileSystem | Where-Object {$_.Used -gt 0} | ForEach-Object {
$total = [math]::Round($_.Used + $_.Free, 2) / 1GB
$used = [math]::Round($_.Used / 1GB, 2)
$free = [math]::Round($_.Free / 1GB, 2)
$percent = [math]::Round(($used / $total) * 100, 2)
$html += "<tr><td>$($_.Name):</td><td>$total GB</td><td>$used GB</td><td>$free GB</td><td>$percent%</td></tr>"
}
$html += "</table></body></html>"
# レポート保存
$html | Out-File $reportPath -Encoding UTF8
Write-Host "レポートを生成しました: $reportPath" -ForegroundColor Green
6. ネットワーク監視
インターネット接続を定期チェック
# ネットワーク監視スクリプト
$logFile = "C:\Logs\network_monitor.log"
$checkInterval = 60 # 秒
while ($true) {
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
# Google DNSにping
$ping = Test-Connection 8.8.8.8 -Count 1 -ErrorAction SilentlyContinue
if ($ping) {
$status = "接続OK - 応答時間: $($ping.ResponseTime)ms"
Write-Host "[$timestamp] $status" -ForegroundColor Green
} else {
$status = "接続エラー"
Write-Host "[$timestamp] $status" -ForegroundColor Red
# エラー時は通知(例:音を鳴らす)
[System.Media.SystemSounds]::Exclamation.Play()
}
# ログ記録
"[$timestamp] $status" | Out-File $logFile -Append
Start-Sleep -Seconds $checkInterval
}
7. アプリケーション自動起動
作業開始時のアプリ一括起動
# 仕事開始時の環境構築スクリプト
Write-Host "作業環境を準備しています..." -ForegroundColor Yellow
# メールソフト起動
Start-Process "outlook"
# ブラウザ起動(複数タブ)
Start-Process "chrome.exe" -ArgumentList "https://gmail.com", "https://calendar.google.com"
# エディタ起動
Start-Process "notepad++"
# 特定フォルダを開く
Start-Process "explorer.exe" -ArgumentList "C:\Projects"
# Slackなどのコミュニケーションツール
Start-Process "slack"
Write-Host "すべてのアプリケーションを起動しました!" -ForegroundColor Green
8. PDFファイル結合
複数PDFを1つに結合(要:iTextSharp)
# PDFSharpライブラリを使用(事前にインストール必要)
# Install-Package PdfSharp -Source nuget.org
Add-Type -Path "C:\path\to\PdfSharp.dll"
function Merge-PDFs {
param(
[string]$OutputPath,
[string[]]$InputPaths
)
$output = New-Object PdfSharp.Pdf.PdfDocument
foreach ($inputPath in $InputPaths) {
$input = [PdfSharp.Pdf.IO.PdfReader]::Open($inputPath, [PdfSharp.Pdf.IO.PdfDocumentOpenMode]::Import)
for ($i = 0; $i -lt $input.PageCount; $i++) {
$output.AddPage($input.Pages[$i])
}
}
$output.Save($OutputPath)
$output.Close()
}
# 使用例
$pdfs = Get-ChildItem "C:\PDFs\*.pdf" | Select-Object -ExpandProperty FullName
Merge-PDFs -OutputPath "C:\PDFs\merged.pdf" -InputPaths $pdfs
9. Excelファイル自動処理
複数のExcelファイルを統合
# Excel操作スクリプト
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
# 新しいワークブック作成
$workbook = $excel.Workbooks.Add()
$worksheet = $workbook.Worksheets.Item(1)
$row = 1
# フォルダ内のすべてのCSVを結合
Get-ChildItem "C:\Data\*.csv" | ForEach-Object {
$data = Import-Csv $_.FullName
# ヘッダーを最初の行にのみ追加
if ($row -eq 1) {
$col = 1
$data[0].PSObject.Properties.Name | ForEach-Object {
$worksheet.Cells.Item($row, $col) = $_
$col++
}
$row++
}
# データを追加
foreach ($item in $data) {
$col = 1
$item.PSObject.Properties.Value | ForEach-Object {
$worksheet.Cells.Item($row, $col) = $_
$col++
}
$row++
}
}
# 保存して閉じる
$workbook.SaveAs("C:\Data\combined.xlsx")
$workbook.Close()
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
10. メール自動送信
定期レポートメール送信
# メール送信設定
$from = "your-email@gmail.com"
$to = "recipient@example.com"
$subject = "日次レポート - $(Get-Date -Format 'yyyy/MM/dd')"
$body = @"
お疲れ様です。
本日の自動レポートをお送りします。
システム状態:正常
バックアップ:完了
エラー件数:0
詳細は添付ファイルをご確認ください。
"@
$attachment = "C:\Reports\daily_report.pdf"
# SMTP設定(Gmail例)
$smtp = "smtp.gmail.com"
$port = 587
# 認証情報(実際はセキュアに保存)
$password = ConvertTo-SecureString "your-password" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($from, $password)
# メール送信
Send-MailMessage -From $from -To $to -Subject $subject -Body $body `
-Attachments $attachment -SmtpServer $smtp -Port $port `
-UseSsl -Credential $credential
Write-Host "メールを送信しました!" -ForegroundColor Green
タスクスケジューラと連携した完全自動化

PowerShellスクリプトの定期実行設定
タスクスケジューラでの設定手順
- スクリプトファイルの準備
# daily_backup.ps1 として保存
$source = "C:\重要データ"
$destination = "D:\バックアップ\$(Get-Date -Format 'yyyy-MM-dd')"
robocopy $source $destination /E /XO
- タスクスケジューラ設定
1. タスクスケジューラを開く(taskschd.msc)
2. 「基本タスクの作成」
3. 名前:「日次バックアップ」
4. トリガー:毎日 22:00
5. 操作:プログラムの開始
- プログラム:powershell.exe
- 引数:-ExecutionPolicy Bypass -File "C:\Scripts\daily_backup.ps1"
実行ポリシーの設定
スクリプト実行を許可する
# 現在の実行ポリシーを確認
Get-ExecutionPolicy
# 実行ポリシーを変更(管理者権限必要)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
# 一時的に実行ポリシーを回避
powershell.exe -ExecutionPolicy Bypass -File "script.ps1"
PowerShellスクリプトの作成と保存
スクリプトファイルの作成
基本的な作成手順
- メモ帳を開く
- スクリプトを記述
- 拡張子 .ps1 で保存
VSCodeでの作成(推奨)
# VSCodeインストール後
code my_script.ps1
スクリプトの構造
基本テンプレート
# ==================================
# スクリプト名:自動化スクリプト
# 作成日:2024/01/01
# 作成者:Your Name
# 説明:ファイル整理を自動化
# ==================================
# パラメータ定義
param(
[string]$TargetPath = "C:\Target",
[int]$DaysOld = 30
)
# エラー処理設定
$ErrorActionPreference = "Stop"
try {
# メイン処理
Write-Host "処理を開始します..." -ForegroundColor Yellow
# ここに処理を記述
Write-Host "処理が完了しました!" -ForegroundColor Green
}
catch {
Write-Error "エラーが発生しました: $_"
exit 1
}
デバッグとエラー対処
よくあるエラーと解決法
「このシステムではスクリプトの実行が無効」
# 解決法
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
「アクセスが拒否されました」
# 管理者権限で実行
Start-Process powershell -Verb RunAs
「コマンドレットが見つかりません」
# モジュールの確認とインストール
Get-Module -ListAvailable
Install-Module ModuleName
デバッグテクニック
変数の内容を確認
# デバッグ出力
Write-Debug "変数の値: $variable"
# デバッグモードで実行
$DebugPreference = "Continue"
ステップ実行
# ブレークポイント設定
Set-PSBreakpoint -Script "script.ps1" -Line 10
セキュリティのベストプラクティス
パスワードの安全な管理
資格情報の暗号化保存
# パスワードを暗号化して保存
$securePassword = Read-Host "パスワードを入力" -AsSecureString
$encryptedPassword = ConvertFrom-SecureString $securePassword
$encryptedPassword | Out-File "C:\Secure\password.txt"
# 暗号化パスワードの読み込み
$encryptedPassword = Get-Content "C:\Secure\password.txt"
$securePassword = ConvertTo-SecureString $encryptedPassword
安全なスクリプト実行
署名付きスクリプト
# スクリプトに署名
Set-AuthenticodeSignature -FilePath "script.ps1" -Certificate $cert
よくある質問
Q1. PowerShellとコマンドプロンプトどっちを使うべき?
A. 新しく始めるならPowerShell一択です!
PowerShellはコマンドプロンプトの上位互換で、より多くのことができます。
Q2. スクリプトが動かない
A. 以下を確認してください:
- 実行ポリシーの設定
- 管理者権限での実行
- パスに日本語が含まれていないか
- 文字コードがUTF-8 with BOMになっているか
Q3. 学習に時間はかかる?
A. 基本的なコマンドなら1日で使えるようになります!
まずはコピペで動かして、徐々に理解を深めていけばOKです。
Q4. Mac/Linuxでも使える?
A. PowerShell Core(PowerShell 7)なら使えます!
クロスプラットフォーム対応で、Mac/Linuxでも動作します。
まとめ:PowerShellで自動化の世界へ!
今回はWindows PowerShellでの自動化について詳しく解説しました。
押さえておきたいポイント
📌 PowerShellの基本
- Windows標準搭載の強力ツール
- コマンドプロンプトの上位互換
- オブジェクト指向で直感的
📌 すぐ使える自動化
- ファイル整理
- 一括名前変更
- 自動バックアップ
- システム監視
- レポート生成
📌 スクリプト作成
- .ps1ファイルで保存
- 実行ポリシーの設定が必要
- タスクスケジューラと連携
📌 学習のコツ
- まずはコピペから始める
- 少しずつカスタマイズ
- エラーを恐れない
- 公式ドキュメントを活用
📌 セキュリティ
- パスワードは暗号化
- 実行ポリシーは適切に
- 管理者権限は必要時のみ
PowerShellの自動化は、最初は難しく感じるかもしれません。
でも、1つでも自動化に成功すれば、その便利さに驚くはずです。
毎日の繰り返し作業から解放され、もっと創造的な仕事に時間を使えるようになります。
まずは簡単なファイル整理から始めて、徐々にステップアップしていきましょう!
あなたの仕事が、PowerShellで劇的に効率化されることを願っています。
コメント