PowerShellで始める自動化入門：面倒な作業を一瞬で終わらせる技

## はじめに
こんにちは！今回は、PowerShellを使って日々の面倒な作業を自動化する方法をご紹介します。PowerShellは強力なスクリプト言語で、Windows環境での作業を劇的に効率化できるツールです。では、具体的な例を通じて自動化の世界に飛び込んでみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/cf24d10f-0aa5-10e0-7556-c741459f6666.png)

## 1. ファイル操作の自動化

### 例：日付ごとにファイルを整理する

毎日大量のログファイルが生成され、それを日付ごとのフォルダに整理する必要があるとしましょう。以下のスクリプトで自動化できます。

```powershell
# 整理するフォルダのパス
$sourceFolder = "C:\Logs"
# 整理先のルートフォルダ
$destinationRoot = "C:\SortedLogs"

# ソースフォルダ内のすべてのファイルを取得
Get-ChildItem -Path $sourceFolder -File | ForEach-Object {
    # ファイルの作成日を取得
    $creationDate = $_.CreationTime.ToString("yyyy-MM-dd")
    # 整理先のフォルダパスを作成
    $destinationFolder = Join-Path -Path $destinationRoot -ChildPath $creationDate
    
    # フォルダが存在しない場合は作成
    if (!(Test-Path $destinationFolder)) {
        New-Item -ItemType Directory -Path $destinationFolder
    }
    
    # ファイルを移動
    Move-Item -Path $_.FullName -Destination $destinationFolder
}

Write-Host "ファイルの整理が完了しました。"
```

このスクリプトを実行するだけで、ログファイルが自動的に日付ごとのフォルダに整理されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/e2f7cc96-ef85-3b44-a168-11c925a250fc.png)


## 2. システム管理タスクの自動化

### 例：定期的なシステムチェックとレポート生成

システムの状態を定期的にチェックし、レポートを生成する作業を自動化してみましょう。

```powershell
# レポートの保存先
$reportPath = "C:\Reports\SystemCheck_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt"

# システム情報を取得
$systemInfo = Get-ComputerInfo | Select-Object WindowsProductName, OsVersion, OsArchitecture

# ディスク使用量を取得
$diskInfo = Get-WmiObject Win32_LogicalDisk | Where-Object { $_.DriveType -eq 3 } |
    Select-Object DeviceID, @{Name="Size(GB)";Expression={[math]::Round($_.Size/1GB, 2)}},
                  @{Name="FreeSpace(GB)";Expression={[math]::Round($_.FreeSpace/1GB, 2)}}

# メモリ使用量を取得
$memoryInfo = Get-WmiObject Win32_OperatingSystem | Select-Object @{Name="TotalMemory(GB)";Expression={[math]::Round($_.TotalVisibleMemorySize/1MB, 2)}},
    @{Name="FreeMemory(GB)";Expression={[math]::Round($_.FreePhysicalMemory/1MB, 2)}}

# レポートを生成
"システムチェックレポート - $(Get-Date)" | Out-File $reportPath
"" | Out-File $reportPath -Append
"1. システム情報:" | Out-File $reportPath -Append
$systemInfo | Format-Table | Out-File $reportPath -Append
"" | Out-File $reportPath -Append
"2. ディスク使用量:" | Out-File $reportPath -Append
$diskInfo | Format-Table | Out-File $reportPath -Append
"" | Out-File $reportPath -Append
"3. メモリ使用量:" | Out-File $reportPath -Append
$memoryInfo | Format-Table | Out-File $reportPath -Append

Write-Host "システムチェックレポートが生成されました: $reportPath"
```

このスクリプトを定期的に実行するようにスケジュールすれば、システムの状態を常に把握できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/05792676-ce27-b341-5c7a-e372ae3cfc49.png)


## 3. ネットワーク関連タスクの自動化

### 例：複数サーバーの稼働状況チェック

複数のサーバーの稼働状況を一度にチェックする作業も自動化できます。

```powershell
# チェックするサーバーのリスト
$servers = @("server1", "server2", "server3", "server4")

# 結果を格納する配列
$results = @()

foreach ($server in $servers) {
    $result = Test-Connection -ComputerName $server -Count 1 -Quiet
    $status = if ($result) { "稼働中" } else { "停止" }
    
    $results += [PSCustomObject]@{
        サーバー名 = $server
        状態 = $status
    }
}

# 結果を表示
$results | Format-Table -AutoSize

# 結果をCSVファイルに出力
$results | Export-Csv -Path "C:\ServerStatus_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv" -NoTypeInformation -Encoding UTF8

Write-Host "サーバーの稼働状況チェックが完了しました。"
```

このスクリプトを実行すると、指定したサーバーの稼働状況が一目で分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/35c4ebc0-be38-8870-45ca-466e5b3e021c.png)


## 4. 自動化のためのスケジューリング

作成したスクリプトを定期的に実行するには、Windowsのタスクスケジューラーを使用します。

1. タスクスケジューラーを開きます。
2. 「基本タスクの作成」を選択します。
3. タスクの名前と説明を入力します。
4. トリガー（実行するタイミング）を設定します。
5. アクションで「プログラムの開始」を選択し、以下のように設定します：
   - プログラム/スクリプト: `powershell.exe`
   - 引数の追加: `-ExecutionPolicy Bypass -File "C:\Path\To\Your\Script.ps1"`

これで、指定したスケジュールでスクリプトが自動実行されるようになります。

## まとめ

PowerShellを使った自動化の基本を紹介しました。これらの例を参考に、自分の日常業務で自動化できそうな作業を探してみてください。最初は小さな作業から始めて、徐々に複雑なタスクにチャレンジしていくのがおすすめです。

自動化のコツは、繰り返し行う作業を特定し、それをステップバイステップで分解することです。そして、各ステップをPowerShellコマンドに置き換えていくのです。

これらの技を磨いていけば、面倒な作業が一瞬で終わるようになり、より創造的で価値のある業務に時間を使えるようになるでしょう。

PowerShellで自動化の第一歩を踏み出してみませんか？Happy scripting!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/796cd8b4-af18-3235-cb25-7f406ecf7993.png)