Windows PowerShellで日付を変更・操作する方法|ファイルタイムスタンプの書き換えや日時取得も解説

Windows

「ファイルの更新日付をまとめて変えたい」
「処理日時を自動でファイル名に入れたい」
「古いファイルの日付を整理したい」

ファイル管理やシステム運用で、こんなふうに思ったことはありませんか?

そんな時に便利なのがPowerShellの日付操作です。

PowerShellなら、ファイルの日付(タイムスタンプ)を書き換えたり、現在の日付を取得してログ名に付けたり、さまざまなことが簡単にできます。

この記事では、Windows PowerShellで日付を取得・変更・ファイルに反映する方法を初心者にもわかるように解説します。

読み終わるころには「PowerShellの日付操作って意外とシンプル!」と感じるはずです。

スポンサーリンク

PowerShellで現在の日付を取得する

Get-Dateコマンドの基本

現在の日付と時刻はGet-Dateコマンドレットで簡単に取得できます。

基本的な使い方

# 現在の日時を表示
Get-Date

実行結果例:

2025年7月5日 13:45:30

日付のみを取得

# 日付のみ(時刻なし)
Get-Date -DisplayHint Date

実行結果:

2025年7月5日

時刻のみを取得

# 時刻のみ(日付なし)
Get-Date -DisplayHint Time

実行結果:

13:45:30

日付フォーマットのカスタマイズ

よく使われるフォーマット例

フォーマットコマンド結果例
年月日(ハイフン)Get-Date -Format "yyyy-MM-dd"2025-07-05
年月日(スラッシュ)Get-Date -Format "yyyy/MM/dd"2025/07/05
年月日(日本語)Get-Date -Format "yyyy年MM月dd日"2025年07月05日
日時(標準)Get-Date -Format "yyyy-MM-dd HH:mm:ss"2025-07-05 13:45:30
ファイル名用Get-Date -Format "yyyyMMdd_HHmmss"20250705_134530
ISO 8601形式Get-Date -Format "yyyy-MM-ddTHH:mm:ss"2025-07-05T13:45:30

詳細なフォーマット指定子

指定子意味
yyyy4桁の年2025
yy2桁の年25
MM2桁の月07
M月(ゼロ埋めなし)7
dd2桁の日05
d日(ゼロ埋めなし)5
HH24時間制の時(2桁)13
hh12時間制の時(2桁)01
mm分(2桁)45
ss秒(2桁)30
ttAM/PMPM

実践的なフォーマット例

# ログファイル用のタイムスタンプ
$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
Write-Host "ログファイル: log_$timestamp.txt"

# 日本語形式
$jpDate = Get-Date -Format "yyyy年MM月dd日(ddd) HH時mm分"
Write-Host $jpDate

# ファイルバックアップ用
$backupSuffix = Get-Date -Format "yyyyMMdd"
Write-Host "backup_file_$backupSuffix.txt"

日付の計算と操作

日付の加算・減算

# 現在日時から計算
$now = Get-Date

# 7日後
$future = $now.AddDays(7)
Write-Host "7日後: $($future.ToString('yyyy-MM-dd'))"

# 3日前
$past = $now.AddDays(-3)
Write-Host "3日前: $($past.ToString('yyyy-MM-dd'))"

# 1時間後
$laterHour = $now.AddHours(1)
Write-Host "1時間後: $($laterHour.ToString('HH:mm:ss'))"

# 30日前
$monthAgo = $now.AddDays(-30)
Write-Host "30日前: $($monthAgo.ToString('yyyy-MM-dd'))"

より複雑な日付計算

# 月の加算・減算
$nextMonth = (Get-Date).AddMonths(1)
$lastYear = (Get-Date).AddYears(-1)

# 月初・月末の取得
$now = Get-Date
$monthStart = Get-Date -Day 1 -Hour 0 -Minute 0 -Second 0
$monthEnd = $monthStart.AddMonths(1).AddDays(-1)

Write-Host "今月の開始: $($monthStart.ToString('yyyy-MM-dd'))"
Write-Host "今月の終了: $($monthEnd.ToString('yyyy-MM-dd'))"

# 曜日の取得
$dayOfWeek = (Get-Date).DayOfWeek
Write-Host "今日は: $dayOfWeek"

PowerShellでファイルの日付(タイムスタンプ)を変更する

ファイルの日付情報の種類

Windowsのファイルには3つの重要な日付情報があります:

項目PowerShellプロパティ意味
作成日時CreationTimeファイルが作成された日時
更新日時LastWriteTimeファイルが最後に変更された日時
アクセス日時LastAccessTimeファイルが最後にアクセスされた日時

単一ファイルの日付変更

基本的な日付変更

# ファイルの更新日時を変更
$file = Get-Item "C:\example\test.txt"
$file.LastWriteTime = "2025-07-05 12:00:00"

# より簡潔な書き方
(Get-Item "C:\example\test.txt").LastWriteTime = "2025-07-05 12:00:00"

すべての日付情報を一度に変更

$targetDate = "2025-07-01 08:00:00"
$file = Get-Item "C:\example\test.txt"

$file.CreationTime = $targetDate
$file.LastWriteTime = $targetDate
$file.LastAccessTime = $targetDate

Write-Host "ファイルの日付を $targetDate に変更しました"

現在日時に更新

# 現在の日時を更新日時にセット
(Get-Item "C:\example\test.txt").LastWriteTime = Get-Date

# すべての日付を現在日時に
$now = Get-Date
$file = Get-Item "C:\example\test.txt"
$file.CreationTime = $now
$file.LastWriteTime = $now
$file.LastAccessTime = $now

複数ファイルの一括日付変更

特定の拡張子のファイルを一括変更

# .txtファイルをすべて変更
Get-ChildItem "C:\example\*.txt" | ForEach-Object {
    $_.LastWriteTime = "2025-07-01 00:00:00"
    Write-Host "変更済み: $($_.Name)"
}

フォルダ内のすべてのファイルを変更

# フォルダ内のすべてのファイルの日付を統一
$targetDate = "2025-01-01 09:00:00"
Get-ChildItem "C:\example" -File | ForEach-Object {
    $_.CreationTime = $targetDate
    $_.LastWriteTime = $targetDate
    $_.LastAccessTime = $targetDate
    Write-Host "処理完了: $($_.Name)"
}

条件を指定した一括変更

# 1週間以内に作成されたファイルのみ変更
$oneWeekAgo = (Get-Date).AddDays(-7)
$newDate = "2025-06-01 10:00:00"

Get-ChildItem "C:\example" -File | Where-Object {
    $_.CreationTime -gt $oneWeekAgo
} | ForEach-Object {
    $_.LastWriteTime = $newDate
    Write-Host "更新: $($_.Name) - $($_.CreationTime)"
}

サブフォルダも含めた再帰的な変更

# サブフォルダも含めてすべてのファイルを変更
$targetDate = Get-Date "2025-07-01 12:00:00"

Get-ChildItem "C:\example" -Recurse -File | ForEach-Object {
    $_.LastWriteTime = $targetDate
    Write-Host "変更: $($_.FullName)"
}

実践的な日付操作の応用例

ログファイルの自動生成

日付付きログファイルの作成

# 日次ログファイルの作成
function New-DailyLogFile {
    param(
        [string]$LogDirectory = "C:\logs",
        [string]$Prefix = "system"
    )
    
    # ディレクトリが存在しない場合は作成
    if (!(Test-Path $LogDirectory)) {
        New-Item -Path $LogDirectory -ItemType Directory -Force
    }
    
    # 日付付きファイル名を生成
    $dateString = Get-Date -Format "yyyy-MM-dd"
    $logFileName = "$Prefix`_$dateString.log"
    $logFilePath = Join-Path $LogDirectory $logFileName
    
    # ログファイルが存在しない場合は作成
    if (!(Test-Path $logFilePath)) {
        $header = "=== ログ開始: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ==="
        $header | Out-File -FilePath $logFilePath -Encoding UTF8
        Write-Host "新しいログファイルを作成: $logFilePath"
    }
    
    return $logFilePath
}

# 使用例
$logFile = New-DailyLogFile -LogDirectory "C:\mylogs" -Prefix "application"
"処理開始: $(Get-Date)" | Add-Content -Path $logFile

時間付きログエントリの追加

function Add-LogEntry {
    param(
        [string]$LogFile,
        [string]$Message,
        [string]$Level = "INFO"
    )
    
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logEntry = "[$timestamp] [$Level] $Message"
    
    $logEntry | Add-Content -Path $LogFile
    Write-Host $logEntry
}

# 使用例
$logFile = "C:\logs\application_$(Get-Date -Format 'yyyy-MM-dd').log"
Add-LogEntry -LogFile $logFile -Message "アプリケーション開始" -Level "INFO"
Add-LogEntry -LogFile $logFile -Message "データベース接続エラー" -Level "ERROR"

ファイルバックアップシステム

日付ベースのバックアップ

function Backup-FilesWithTimestamp {
    param(
        [string]$SourcePath,
        [string]$BackupDirectory,
        [string]$FilePattern = "*.*"
    )
    
    # バックアップディレクトリを作成
    $backupTimestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
    $backupFolder = Join-Path $BackupDirectory "Backup_$backupTimestamp"
    
    if (!(Test-Path $backupFolder)) {
        New-Item -Path $backupFolder -ItemType Directory -Force
        Write-Host "バックアップフォルダを作成: $backupFolder"
    }
    
    # ファイルをコピー
    $copiedCount = 0
    Get-ChildItem -Path $SourcePath -Filter $FilePattern | ForEach-Object {
        $destinationPath = Join-Path $backupFolder $_.Name
        Copy-Item -Path $_.FullName -Destination $destinationPath
        
        # コピー先ファイルの日付を元ファイルと同じに設定
        $destFile = Get-Item $destinationPath
        $destFile.CreationTime = $_.CreationTime
        $destFile.LastWriteTime = $_.LastWriteTime
        $destFile.LastAccessTime = $_.LastAccessTime
        
        $copiedCount++
        Write-Host "バックアップ: $($_.Name)"
    }
    
    Write-Host "バックアップ完了: $copiedCount ファイル → $backupFolder"
    return $backupFolder
}

# 使用例
Backup-FilesWithTimestamp -SourcePath "C:\important" -BackupDirectory "C:\backups" -FilePattern "*.docx"

古いファイルの整理

指定日数より古いファイルの検索・削除

function Remove-OldFiles {
    param(
        [string]$Path,
        [int]$DaysOld = 30,
        [switch]$WhatIf
    )
    
    $cutoffDate = (Get-Date).AddDays(-$DaysOld)
    $oldFiles = Get-ChildItem -Path $Path -File | Where-Object {
        $_.LastWriteTime -lt $cutoffDate
    }
    
    Write-Host "=== $DaysOld 日より古いファイルの検索結果 ==="
    Write-Host "対象フォルダ: $Path"
    Write-Host "基準日: $($cutoffDate.ToString('yyyy-MM-dd'))"
    Write-Host "見つかったファイル数: $($oldFiles.Count)"
    Write-Host ""
    
    if ($oldFiles.Count -eq 0) {
        Write-Host "削除対象のファイルはありません。"
        return
    }
    
    foreach ($file in $oldFiles) {
        $ageInDays = [math]::Round((Get-Date - $file.LastWriteTime).TotalDays, 1)
        
        if ($WhatIf) {
            Write-Host "削除予定: $($file.Name) (更新: $($file.LastWriteTime.ToString('yyyy-MM-dd')), $ageInDays 日前)"
        } else {
            Remove-Item -Path $file.FullName -Force
            Write-Host "削除済み: $($file.Name) (更新: $($file.LastWriteTime.ToString('yyyy-MM-dd')), $ageInDays 日前)"
        }
    }
    
    if ($WhatIf) {
        Write-Host ""
        Write-Host "※ 実際に削除するには -WhatIf パラメータを外してください"
    }
}

# 使用例(まずはテスト実行)
Remove-OldFiles -Path "C:\temp" -DaysOld 7 -WhatIf

# 実際に削除
# Remove-OldFiles -Path "C:\temp" -DaysOld 7

ファイル整理の自動化

日付別フォルダへの自動分類

function Organize-FilesByDate {
    param(
        [string]$SourcePath,
        [string]$DestinationPath,
        [string]$DateProperty = "LastWriteTime"  # CreationTime, LastWriteTime, LastAccessTime
    )
    
    Get-ChildItem -Path $SourcePath -File | ForEach-Object {
        # ファイルの日付を取得
        $fileDate = $_.$DateProperty
        $yearMonth = $fileDate.ToString("yyyy-MM")
        
        # 年月フォルダを作成
        $destinationFolder = Join-Path $DestinationPath $yearMonth
        if (!(Test-Path $destinationFolder)) {
            New-Item -Path $destinationFolder -ItemType Directory -Force
            Write-Host "フォルダ作成: $destinationFolder"
        }
        
        # ファイルを移動
        $destinationFile = Join-Path $destinationFolder $_.Name
        Move-Item -Path $_.FullName -Destination $destinationFile
        Write-Host "移動: $($_.Name) → $yearMonth\\"
    }
}

# 使用例
Organize-FilesByDate -SourcePath "C:\downloads" -DestinationPath "C:\organized" -DateProperty "LastWriteTime"

高度な日付操作テクニック

特定の日付パターンでのファイル検索

# 特定の月に作成されたファイルを検索
function Find-FilesByMonth {
    param(
        [string]$Path,
        [int]$Year,
        [int]$Month
    )
    
    $startDate = Get-Date -Year $Year -Month $Month -Day 1 -Hour 0 -Minute 0 -Second 0
    $endDate = $startDate.AddMonths(1).AddDays(-1)
    
    Write-Host "検索期間: $($startDate.ToString('yyyy-MM-dd')) ~ $($endDate.ToString('yyyy-MM-dd'))"
    
    $files = Get-ChildItem -Path $Path -File | Where-Object {
        $_.CreationTime -ge $startDate -and $_.CreationTime -le $endDate
    }
    
    Write-Host "見つかったファイル数: $($files.Count)"
    
    $files | ForEach-Object {
        Write-Host "$($_.Name) - 作成日: $($_.CreationTime.ToString('yyyy-MM-dd HH:mm:ss'))"
    }
    
    return $files
}

# 使用例:2025年6月に作成されたファイルを検索
Find-FilesByMonth -Path "C:\documents" -Year 2025 -Month 6

営業日の計算

function Get-BusinessDays {
    param(
        [DateTime]$StartDate,
        [DateTime]$EndDate,
        [DayOfWeek[]]$Weekends = @([DayOfWeek]::Saturday, [DayOfWeek]::Sunday)
    )
    
    $businessDays = @()
    $currentDate = $StartDate
    
    while ($currentDate -le $EndDate) {
        if ($currentDate.DayOfWeek -notin $Weekends) {
            $businessDays += $currentDate
        }
        $currentDate = $currentDate.AddDays(1)
    }
    
    return $businessDays
}

# 使用例:今月の営業日を取得
$monthStart = Get-Date -Day 1
$monthEnd = $monthStart.AddMonths(1).AddDays(-1)
$businessDays = Get-BusinessDays -StartDate $monthStart -EndDate $monthEnd

Write-Host "今月の営業日数: $($businessDays.Count)"
$businessDays | ForEach-Object { Write-Host $_.ToString("yyyy-MM-dd (ddd)") }

よくあるエラーと対処法

エラーパターン別の対処法

1. 日付フォーマットエラー

エラー例:

Cannot convert value "2025/13/01" to type "System.DateTime"

原因と対処:

# 間違った例
$date = "2025/13/01"  # 13月は存在しない

# 正しい例
$date = "2025/12/01"
$date = Get-Date "2025-12-01"

# 文化圏に依存しない形式を使用
$date = [DateTime]::ParseExact("01/12/2025", "dd/MM/yyyy", $null)

2. ファイルアクセス権限エラー

エラー例:

Access to the path 'C:\protected\file.txt' is denied.

対処法:

# 管理者権限でPowerShellを実行
# または、アクセス可能なファイルかチェック
if (Test-Path "C:\example\file.txt") {
    try {
        (Get-Item "C:\example\file.txt").LastWriteTime = Get-Date
        Write-Host "日付変更成功"
    } catch {
        Write-Host "エラー: $($_.Exception.Message)"
    }
}

3. ファイルが使用中エラー

対処法:

# ファイルが開かれていないかチェック
function Test-FileInUse {
    param([string]$FilePath)
    
    try {
        $file = [System.IO.File]::Open($FilePath, 'Open', 'Write')
        $file.Close()
        return $false
    } catch {
        return $true
    }
}

if (Test-FileInUse "C:\example\file.txt") {
    Write-Host "ファイルが使用中です。閉じてから再実行してください。"
} else {
    (Get-Item "C:\example\file.txt").LastWriteTime = Get-Date
}

まとめ:PowerShellで効率的な日付管理を実現しよう

Windows PowerShellを使えば、面倒なファイル日付の管理や日時処理が驚くほど簡単になります。

今回学んだ重要ポイント

  1. 日付取得: Get-Dateで現在日時を自由にフォーマット
  2. ファイル日付変更: LastWriteTime等のプロパティで直接変更
  3. 一括処理: Get-ChildItemForEach-Objectで複数ファイル対応
  4. 日付計算: AddDays()等のメソッドで柔軟な計算
  5. 実用スクリプト: ログ管理、バックアップ、ファイル整理の自動化

コメント

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