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

コメント