Microsoft Purview 新しい eDiscovery PremiumのエクスポートZIPが同名(pst.001.zip)になる原因と対処法

Microsoft Purview の新しい eDiscovery(Premium)で複数のエクスポートをまとめてダウンロードすると、ZIP が pst.001.zip などの汎用名になり、同名が大量に並んで判別できなくなることがあります。本記事では「ファイル名を変更できるのか?」の結論と、混乱を防ぐための整理・リネーム運用を具体例とPowerShellで解説します。

目次

症状:エクスポートZIPが「pst.001.zip / pst.002.zip…」のような汎用名になり、同名が重複する

新しい eDiscovery(Premium)では、エクスポートをダウンロードすると ZIP が連番の汎用名で生成されるケースがあります。問題になるのは、複数のエクスポートを同時にダウンロードしたときです。

状況起きやすいこと現場の困りごと
エクスポートAをダウンロードpst.001.zip / pst.002.zip… のように生成単体ならまだ追える
エクスポートAとBを同時にダウンロードAもBも「pst.001.zip」から始まるどれがどのエクスポートのZIPか分からない
同じ保存先に保存OS/ブラウザーが pst.001 (1).zip のように自動リネーム見た目だけ変わり、中身のエクスポート情報と結びつかない

この状態で作業を続けると、ZIPの取り違え・誤った保管・提出物の混在など、コンプライアンス運用として致命的になり得ます。特に監査・訴訟対応(eDiscovery)の文脈では「どのケース/どのエクスポートの証跡か」を明確に説明できる状態が重要です。

結論:ZIPのトップレベルファイル名に「ケース名/エクスポート名」を付ける設定は用意されていない

質問として最も多いのが「旧(クラシック)版のように、エクスポート名やケース名をZIPファイル名に含められないか?」ですが、新しい eDiscovery(Premium)では現時点で不可(仕様)です。

  • トップレベルのZIPファイル名に ケース名/エクスポート名を反映する設定がない
  • 一方で、エクスポート名は ZIP内部(フォルダ構成・レポート類)で利用されることがある
  • つまり「外側(ZIP名)は汎用」「内側(中身)は文脈が残る」設計になっている

そのため、現場としては「ZIP名そのものを変える」ではなく、ダウンロード後に取り違えを起こさない運用設計(保存先の分離・リネーム・突合・ログ化)で吸収するのが現実的です。

旧(クラシック)と新しい eDiscovery(Premium)の違いを整理

混乱の根っこは「慣れている挙動(クラシック)」と「新しい挙動(Premium)」の差です。運用設計の前に、違いをチーム内で揃えておくと事故が減ります。

観点旧(クラシック)での感覚新しい eDiscovery(Premium)での実際
ZIPファイル名エクスポート名や案件名が想定以上に識別に効く汎用名(pst.001.zip等)になりやすい
識別の主戦場外側(ファイル名)で判断しがち内側(レポート/メタ情報)で判断する前提
同時ダウンロードやっても見分けがつくことが多い同名が重複しやすく危険
事故ポイント保存先の整理不足保存先の混在+ZIP名が汎用で取り違え

まず押さえたい:ZIPの中で「どのエクスポートか」を特定する方法

ZIP名が役に立たない以上、識別は「中身」で行います。実務で使える確認ポイントを整理します。

確認ポイント場所見える情報おすすめ度
Summary.csv(サマリー系CSV)ZIP内(ルートまたはレポートフォルダ配下)ケース名/エクスポート名/条件/件数などが含まれることが多い高
メタデータ系レポート(各種CSV/ログ)ZIP内エクスポート作成日時、クエリ、結果の統計など高
フォルダ構成ZIP展開後フォルダ名にエクスポート名が含まれることがある中
ファイルの生成日時・サイズ感Windowsのプロパティ作成時間帯で推定はできるが確証になりにくい低

ポイントは、「ZIPを開いて Summary.csv を見る」という動作を標準化することです。慣れると数十秒で特定できますし、後述の自動化にも直結します。

回避策:同名ZIPでも事故らないための運用パターン

保存先をエクスポートごとに分離する(最も簡単で効果が高い)

ZIP名を変えられないなら、保存先を変えてしまうのが最短ルートです。「1エクスポート=1フォルダ」を徹底するだけで混乱が激減します。

  • 例:案件(Case)単位の親フォルダを作る(例:D:\eDiscovery\Case_ABC\)
  • その中に エクスポートごとの子フォルダを作る(例:Export_2025-12-xx_KeywordA\)
  • ダウンロード前に保存先を切り替える(後述のブラウザー設定が効く)

ブラウザー設定で「保存先を毎回確認」を有効にすると、誤って同じフォルダに落とす事故が減ります(ZIP名自体は変えられませんが、整理しやすくなります)。

ブラウザー設定名(表記は近いもの)狙い
Microsoft Edge「各ファイルの保存場所を確認する」ダウンロードのたびに保存先を分けられる
Google Chrome「ダウンロード前に各ファイルの保存場所を確認する」同上

命名規則を決めて手動リネームする(少量なら現実的)

ダウンロード直後にリネームするだけでも、後工程が格段に楽になります。ここで重要なのは「思いつきで付ける」のではなく、チームで統一した命名規則にすることです。

要素推奨理由例
ケース名必須案件横断で取り違えが致命的CaseABC
エクスポート名必須同一ケース内で複数エクスポートが常態化Export_KeywordA
出力種別任意(PST/Native等)提出形式で探しやすいPST
元の連番必須分割ZIPの順序・欠落確認に使うpst.001.zip
日付任意(推奨)いつ取得したかが追える2025-12-26

命名例:

  • CaseABC_Export_KeywordA_2025-12-26_pst.001.zip
  • CaseABC_Export_KeywordA_2025-12-26_pst.002.zip

注意点として、Windowsのファイル名に使えない文字(例:\ / : * ? " < > |)がケース名やエクスポート名に含まれる場合があります。命名に使う文字は 英数・ハイフン・アンダースコア中心にしておくと安全です。

ZIPを開いてSummary.csvで突合し、正しいものだけ残す(中身で判断する標準手順)

「どのZIPがどのエクスポートか分からない」状態になったときの復旧手順です。事故が起きても戻れるように、チームの手順書として用意しておく価値があります。

  • 同名ZIPが並んでいるフォルダをバックアップ(作業前コピー)
  • ZIPを1つずつ開く
  • Summary.csv(またはサマリー/レポート系CSV)を探す
  • ケース名/エクスポート名/条件/作成日時など、識別に使える項目を確認
  • 正しい命名規則でリネームし、エクスポート別フォルダへ移動

ここまでが「人力の復旧手順」です。次のセクションでは、この作業をPowerShellで自動化して、同名問題を実務レベルで解消する方法を紹介します。

PowerShellで「ZIP内のSummary.csvを読み、ケース名+エクスポート名を付けてリネーム」する

手動リネームは確実ですが、エクスポート数が増えるほど現実的ではありません。そこで、ZIP内部のサマリー情報(例:Summary.csv)を読み取り、ケース名/エクスポート名をファイル名へ付与して自動でリネームする運用が有効です。

以下は「Summary.csv がZIP内に存在し、そこにケース名/エクスポート名が含まれる」ことを前提にしたサンプルです。実際のパッケージ構成やCSVの項目名は環境・更新で差が出るため、まずはテストフォルダで動作確認してから本番に適用してください。

自動リネーム用サンプル(ZIPからSummary.csvを探して解析)

param(
  [Parameter(Mandatory = $false)]
  [string]$DownloadFolder = (Get-Location).Path
)

# ZIPを読むためのアセンブリ

Add-Type -AssemblyName System.IO.Compression.FileSystem

function Get-SafeFileToken {
param([string]$Text)

if ([string]::IsNullOrWhiteSpace($Text)) { return "Unknown" }

# Windowsで使えない文字を "_" に置換

$invalid = [System.IO.Path]::GetInvalidFileNameChars()
foreach ($c in $invalid) {
$Text = $Text.Replace($c, '_')
}

# 連続空白は "*" に、前後の "*" は除去

$Text = ($Text -replace '\s+', '*').Trim('*')

# 長すぎると扱いづらいので適度に短縮

if ($Text.Length -gt 60) {
$Text = $Text.Substring(0, 60)
}

return $Text
}

function Get-ExportInfoFromZip {
param([string]$ZipPath)

try {
$zip = [System.IO.Compression.ZipFile]::OpenRead($ZipPath)
try {
# Summary.csv を探す(大文字小文字は無視)
$entry = $zip.Entries | Where-Object { $_.FullName -match '(?i)summary.csv$' } | Select-Object -First 1
if (-not $entry) { return $null }


  $stream = $entry.Open()
  $reader = New-Object System.IO.StreamReader($stream)
  $text = $reader.ReadToEnd()
  $reader.Close()
  $stream.Close()

  $caseName = $null
  $exportName = $null

  # 1) "Case name,XXXX" のようなキー・バリュー形式を想定した簡易パターン
  if ($text -match '(?im)^\s*case\s*name\s*,\s*(.+)\s*$')   { $caseName   = $Matches[1].Trim(' ', '"') }
  if ($text -match '(?im)^\s*export\s*name\s*,\s*(.+)\s*$') { $exportName = $Matches[1].Trim(' ', '"') }

  # 2) "CaseName,ExportName,..." のようなヘッダ形式(2行目に値が入る)を想定
  if ((-not $caseName) -or (-not $exportName)) {
    $lines = $text -split "`r?`n"
    if ($lines.Count -ge 2) {
      $header = $lines[0]
      $row    = $lines[1]

      if ($header -match 'CaseName' -and $header -match 'ExportName') {
        $h = $header.Split(',')
        $r = $row.Split(',')

        $map = @{}
        for ($i = 0; $i -lt $h.Count -and $i -lt $r.Count; $i++) {
          $map[$h[$i].Trim(' ', '"')] = $r[$i].Trim(' ', '"')
        }

        if (-not $caseName)   { $caseName   = $map['CaseName'] }
        if (-not $exportName) { $exportName = $map['ExportName'] }
      }
    }
  }

  if ($caseName -or $exportName) {
    return [pscustomobject]@{
      CaseName   = $caseName
      ExportName = $exportName
      SummaryCsv = $entry.FullName
    }
  }

  return $null
}
finally {
  $zip.Dispose()
}


}
catch {
return $null
}
}

# 対象:pst.001.zip のようなファイル名(必要に応じて拡張してください)

$targets = Get-ChildItem -Path $DownloadFolder -File -Filter "*.zip" |
Where-Object { $_.Name -match '^pst.\d{3}.zip$' }

$log = New-Object System.Collections.Generic.List[object]

foreach ($f in $targets) {
$info = Get-ExportInfoFromZip -ZipPath $f.FullName

if (-not $info) {
$log.Add([pscustomobject]@{
OriginalName = $f.Name
NewName      = ""
Status       = "Skipped (Summary.csv not found or not parsed)"
SummaryCsv   = ""
})
continue
}

$caseToken   = Get-SafeFileToken $info.CaseName
$exportToken = Get-SafeFileToken $info.ExportName

# 元の連番(pst.001.zip)を残して前に情報を付与

$newName = "{0}*{1}*{2}" -f $caseToken, $exportToken, $f.Name
$newPath = Join-Path $DownloadFolder $newName

# 既に存在する場合は末尾に連番を付ける

$i = 2
while (Test-Path $newPath) {
$newName = "{0}*{1}*{2}_({3}).zip" -f $caseToken, $exportToken, ($f.BaseName), $i
$newPath = Join-Path $DownloadFolder $newName
$i++
}

Rename-Item -Path $f.FullName -NewName $newName

$log.Add([pscustomobject]@{
OriginalName = $f.Name
NewName      = $newName
Status       = "Renamed"
SummaryCsv   = $info.SummaryCsv
})
}

# 実行結果をCSVで保存(証跡にもなる)

$logPath = Join-Path $DownloadFolder ("rename_log_{0}.csv" -f (Get-Date -Format "yyyyMMdd_HHmmss"))
$log | Export-Csv -Path $logPath -NoTypeInformation -Encoding UTF8

Write-Output ("Done. Log: {0}" -f $logPath)

このスクリプト運用で得られるメリット

  • ZIP名が汎用でも、ケース名+エクスポート名+元の連番がファイル名に残る
  • リネームログ(CSV)を残せるため、後で「何をどう変えたか」を説明しやすい
  • 同名ZIPが大量にあっても、機械的に整理できる

うまく動かないときのチェックポイント

症状原因の可能性対処
Skippedが多いSummary.csv が存在しない/別名で格納されているZIP内のレポート名を確認し、検索対象の正規表現を調整
ケース名やエクスポート名がUnknownになるCSVの形式が想定と違うSummary.csvの先頭数行を見て、抽出ロジック(正規表現や列名)を修正
文字化けするCSVのエンコーディングがUTF-8以外StreamReaderのエンコーディング指定を追加して調整
ZIPがpst.*以外の名前出力種別や仕様差対象ファイルのフィルタ条件を広げる(例:*.zip全体)

コンプライアンス運用の注意点:リネームは「証跡」とセットで

eDiscoveryは「正しいものを出す」だけでなく、「正しいと説明できる」ことが重要です。ファイル名を変える運用を採るなら、次の3点をセットにすると安心です。

  • 元ファイル名 → 新ファイル名 の対応表を残す(スクリプトのログCSVでOK)
  • 保存先をケース/エクスポートごとに分離し、アクセス権も整理する
  • 提出・保全用途なら ハッシュ(SHA-256等) を記録する

ハッシュ記録の例(対象フォルダ内のZIPのSHA-256を一覧化):

param([string]$Folder = (Get-Location).Path)

$hashLog = Join-Path $Folder ("hash_log_{0}.csv" -f (Get-Date -Format "yyyyMMdd_HHmmss"))

Get-ChildItem -Path $Folder -File -Filter "*.zip" |
ForEach-Object {
$h = Get-FileHash -Algorithm SHA256 -Path $*.FullName
[pscustomobject]@{
FileName = $*.Name
SHA256   = $h.Hash
Length   = $*.Length
LastWriteTime = $*.LastWriteTime
}
} |
Export-Csv -Path $hashLog -NoTypeInformation -Encoding UTF8

Write-Output ("Hash log: {0}" -f $hashLog)

「ZIP名が汎用である」という仕様のもとでは、フォルダ構造+ログ+ハッシュが、取り違え防止と説明責任の両方に効きます。

よくある質問

同名ZIPが出た時点で、エクスポートを作り直した方がいい?

必ずしも作り直しは不要です。多くの場合、ZIP内部のSummary.csvやレポートで識別でき、正しくリネームして整理すれば復旧できます。ただし、提出期限が迫っていたり、混在のリスクが高い状況(複数担当者が同じ共有フォルダに落とした等)では、再エクスポートして最初からフォルダ分離でやり直す方が安全な場合もあります。

ZIPを開かずに「どのエクスポートか」見分ける方法はある?

ファイル名が汎用である以上、外側だけでの判定は難しいです。例外的に、ダウンロード直後の時間帯やサイズ差で推測できることはありますが、監査・訴訟対応では推測は危険です。基本はZIP内のサマリー確認を標準手順にするのがおすすめです。

エクスポート名がZIP内部に入るなら、なぜZIP名に反映されないの?

設計思想として「複数分割ZIPの連番を統一したい」「ダウンロード処理を単純化したい」といった事情が推測されますが、利用者側としては困るポイントです。現状は設定で変えられないため、保存先分離+(必要なら)自動リネームで運用吸収するのが現実解になります。

まとめ:ZIP名は変えられない前提で、保存先分離とリネームを仕組みにする

Microsoft Purview の新しい eDiscovery(Premium)で発生する「pst.001.zip が大量に出る/同名が重複する」問題は、現時点ではトップレベルZIP名にケース名/エクスポート名を付ける設定がないために起きます。対策としては次の順番が効果的です。

  • 保存先をエクスポートごとに分離(最優先・事故が激減)
  • 命名規則を決めて即リネーム(少量ならこれで十分)
  • 量が増えるなら PowerShellで自動リネーム+ログ化(運用が安定)
  • 提出・保全用途は ハッシュ記録まで含めて証跡を固める

ZIP名を変えられない仕様は不便ですが、手順を一度整備してしまえば、むしろ取り違えのない強い運用にできます。まずは「保存先分離」と「命名規則」から着手し、必要に応じて自動化を足していくのがおすすめです。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次