PowerShellでファイルを分割&結合する方法

CONTENTS
1.はじめに
誰かとファイルのやり取りをしたい場合、一番簡単な方法が「ファイルをメールに添付して相手へ送信すること」だと明確にわかっているものの、添付ファイルのサイズ制限を超過してしまうため、他の方法を探さざるを得ない、そんな体験をされたことはありませんでしょうか。
Windows標準のPowerShellでスクリプトを組めば、「1つのファイル」を「サイズの小さい複数ファイル」に分割することや、「分割された複数ファイル」を「1つのファイル」に復元できます。
2.ファイル分割と結合の方法
2-1.ファイル分割スクリプト
指定したファイルを特定サイズごとに分割し、複数のファイルとして保存するには以下のスクリプトを実行します。
このスクリプトを実行すると、分割対象ファイルが splitfile.part0, splitfile.part1, splitfile.part2 … のように分割されて保存されます。
$FilePath = "C:\hoge" # 分割対象ファイルのフルパスを指定
$ChunkSize = 1MB # 指定サイズごとにファイルを分割
$OutputFolder = "C:\fuga" # 分割ファイルの出力先フォルダを指定
$FileName = [System.IO.Path]::GetFileName($FilePath) # 分割対象ファイルのファイル名を取得
$MetaFile = "$OutputFolder\splitfile.meta" # ファイル名を保存するメタデータファイルを定義
# メタデータとして分割対象ファイルのファイル名を保存
Set-Content -Path $MetaFile -Value $FileName
$fs = [System.IO.File]::OpenRead($FilePath) # 分割対象ファイルを開く
$buffer = New-Object byte[] $ChunkSize # チャンクサイズのバッファを作成
$chunkIndex = 0
while (($bytesRead = $fs.Read($buffer, 0, $ChunkSize)) -gt 0) {
$ChunkFile = "$OutputFolder\splitfile.part$chunkIndex"
$outFs = [System.IO.File]::Create($ChunkFile) # 分割ファイルを作成
try {
$outFs.Write($buffer, 0, $bytesRead) # ファイルに書き込む
}
finally {
$outFs.Close() # ファイルを閉じる
}
$chunkIndex++
}
$fs.Close() # 分割対象ファイルを閉じる
Write-Output "ファイルを分割しました: $OutputFolder"
}
2-2.ファイル結合スクリプト
分割されたファイルを元の状態に復元するには、以下のスクリプトを実行します。
このスクリプトを実行すると、splitfile.part0, splitfile.part1, … などのファイルが分割前のファイルに復元されます。
$InputFolder = "C:\fuga" # 分割ファイルのあるフォルダを指定
$OutputFolder = "C:\piyo" # 結合ファイルの出力先フォルダを指定
$MetaFile = "$InputFolder\splitfile.meta" # メタデータファイル
# メタデータファイルが存在するか確認
if (-Not (Test-Path $MetaFile)) {
Write-Host "メタデータファイルが見つかりません: $MetaFile"
exit
}
$OriginalFileName = Get-Content -Path $MetaFile # 分割前のファイル名を取得
$OutputFile = "$OutputFolder\$OriginalFileName" # 結合ファイルの出力先フォルダを指定
$ChunkFiles = Get-ChildItem -Path $InputFolder -Filter "splitfile.part*" | Sort-Object Name # 分割ファイルを取得
$fs = [System.IO.File]::Create($OutputFile) # 結合ファイルを作成
foreach ($ChunkFile in $ChunkFiles) {
$buffer = [System.IO.File]::ReadAllBytes($ChunkFile.FullName) # 分割ファイルを読み込む
$fs.Write($buffer, 0, $buffer.Length) # 結合ファイルに追加
}
$fs.Close() # 結合ファイルを閉じる
Write-Output "結合が完了しました: $OutputFile"
3.最後に
PowerShellを使ったファイルの分割と結合は、非常にシンプルで効率的な方法です。
サイズの大きなファイルをメールに添付したい場合、分割しておけば複数回に分けて送信することができ、受信後にファイルを結合すれば元のファイルが正しく復元されます。
覚えておいていただくと、いざというときにお役に立つかもしれません。ぜひご活用ください。