Windows PowerShellで自動化!繰り返し作業から解放される完全ガイド

Windows

「毎日同じフォルダ整理をしている…」

「大量のファイル名を変更するのが面倒…」

「定期的なバックアップを忘れてしまう…」

こんな繰り返し作業に時間を取られていませんか?

**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:スタートメニューから

  1. Windowsキーを押す
  2. 「powershell」と入力
  3. Windows PowerShell を選択

方法2:右クリックメニューから

  1. Windowsキー + X
  2. 「Windows PowerShell」を選択

方法3:ファイル名を指定して実行

  1. Win + R
  2. 「powershell」と入力
  3. Enter

管理者権限での起動

より高度な操作には管理者権限が必要

  1. スタートメニューで「powershell」検索
  2. 右クリック → 「管理者として実行」
  3. ユーザーアカウント制御で「はい」

基本的な画面の見方

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スクリプトの定期実行設定

タスクスケジューラでの設定手順

  1. スクリプトファイルの準備
# daily_backup.ps1 として保存
$source = "C:\重要データ"
$destination = "D:\バックアップ\$(Get-Date -Format 'yyyy-MM-dd')"
robocopy $source $destination /E /XO
  1. タスクスケジューラ設定
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スクリプトの作成と保存

スクリプトファイルの作成

基本的な作成手順

  1. メモ帳を開く
  2. スクリプトを記述
  3. 拡張子 .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. 以下を確認してください:

  1. 実行ポリシーの設定
  2. 管理者権限での実行
  3. パスに日本語が含まれていないか
  4. 文字コードが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で劇的に効率化されることを願っています。

コメント

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