- Windows標準機能でファイル分割・結合したい
- makecabをバッチで簡単に使いたい
この記事では、そんな方にmakecabの分割・結合をバッチで実行する方法を紹介します。

この記事を読めばファイル分割と結合がすぐにできます。
バッチファイルでファイルを分割
「test.log」を分割してみます。

バッチファイルに分割したいファイルをドラッグ&ドロップします。

もしドラッグ&ドロップではなくダブルクリックしてしまうと?
ドラッグ&ドロップするようメッセージが表示されバッチは終了します。

「ファイル分割を開始しますか?」でyを押します。

※分割サイズの変更は記事の最後で紹介しています。
ファイル分割がはじまると左下の数字が変化していきます。

「ファイル分割が完了しました。」と表示されました。
これで分割は完了です。

新しいフォルダに2種類のファイルが作られました。
- fragment1.cab ・・分割されたファイル ※連番
- ファイル結合.bat ・・結合用のバッチファイル


自動で結合バッチファイルが作られるので簡単です!
バッチファイルでファイルを結合
「ファイル結合.bat」をダブルクリックで実行します。

「CAB展開」ウインドウが出てファイルの展開がはじまります。

CAB展開が終わると「結合が完了しました。」と表示されます。
続けてハッシュ値チェックがはじまります。

分割前と結合後のハッシュ値をチェックして結果を表示します。
「ハッシュ値が一致しました。」と表示されれば結合成功です。

そのファイルが本当にオリジナルのものと同一であるか、ハッシュ値の比較で確認することもできます。
https://n-archives.net/articles/windows/how-to-validate-downloaded-files/
このハッシュ値が一致しないとちゃんと復元できていないという事になります。
このバッチは下記コマンドでハッシュ値を確認しています。
certutil -hashfile <ファイルパス>
分割していた「test.log」が復元されました。

もしファイルが足りない状態で結合すると・・

「ハッシュ値に差異がありました。」と表示されます。

「test.log」が復元されたように見えますが、サイズが少なく元の内容にはなっていません。

ハッシュ値が合わない原因
- ファイルが足りない
- ファイルコピーや転送時に破損した
などが考えられます。
FTPの転送で破損する事が考えられるので、FTP転送をバイナリ形式にするなど試してください。
ファイル分割が終わったらまずファイル結合を試しておきましょう。
そこで問題なければファイルコピーやファイル結合に問題があると切り分けができます。
バッチファイルを使わずに結合する方法
「fragment1.cab」を右クリックして「プログラムから開く – エクスプローラー」を選択
※OSのバージョンによって表示が違うので注意してください。


分割前のファイル名が表示されるので右クリックして「展開」を押す。

展開先を指定して「展開」を押す。

コピー処理がはじまります。

ファイルを結合できました。

バッチファイルのコード
コードをコピーしたらメモ帳に貼り付けて保存してください。
【ファイル名】ファイル分割.bat
【文字コード】ANSI ※ANSIにしないと文字化けします。
以下全てコピーしてください。
@echo off
rem ****基本設定****
rem 分割後ファイル名
set fragmentfilename=fragment*.cab
set fragmentfilename2=fragment1.cab
rem 分割ファイルの最大サイズ 512の倍数で指定。102400000=100MB
set fragmentsize=102400000
set fragmentsize2=約100MB
rem ****************
rem ■■■引数があるか確認■■■
if "%1"=="" (
goto noarg
) else (
goto main
)
rem 引数無しの場合
:noarg
echo 分割したいファイルを「ファイル分割.bat」へドラッグ&ドロップしてください。
echo 処理を終了します。何かキーを押して下さい。
pause
goto end
rem 引数有の場合
rem ■■■メイン処理■■■
:main
rem バッチファイルのパスへ移動
cd %~dp0
rem フォルダ作成用の日付を準備
set time_tmp=%time: =0%
set dirname=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%
rem 引数ファイル名取得
set filename=%~nx1
rem ハッシュ値確認
rem certutil -hashfile %~f1
for /f "usebackq skip=1 delims=" %%A in (`certutil -hashfile %~f1`) do (
set hash_before=%%A
goto exitfor
)
:exitfor
echo %hash_before%
rem 実行確認
echo 分割前ファイル名:%filename%
echo 分割後ファイル名:%fragmentfilename%
echo 出力先 :%~dp0%dirname%
echo 分割サイズ :%fragmentsize2%
echo ハッシュ値 :%hash_before%
set /p yn_check="ファイル分割を開始しますか?(y/n)"
if %yn_check:Y=Y%==Y (
goto yes
) else (
goto end
)
:yes
echo -------------------------------------
echo;
rem makecab実行時の指令ファイル名を準備
set directivefilename=directive.ddf
rem makecab実行時の指令ファイルを作成
echo .Set CabinetNameTemplate=%fragmentfilename% >%directivefilename%
echo .Set DiskDirectoryTemplate="%~dp0%dirname%" >>%directivefilename% >>%directivefilename%
echo .Set Cabinet=on >>%directivefilename%
echo .Set MaxDiskSize=%fragmentsize% >>%directivefilename%
echo %~f1 >>%directivefilename%
rem 分割コマンド実行
makecab /f %directivefilename% /L %dirname%
rem 一時作成ファイル削除
del %directivefilename%
rem 自動生成ファイル削除
del setup.inf
del setup.rpt
set %~dp0=
set output=%~dp0%dirname%\ファイル結合.bat
rem 結合用バッチファイル作成
echo @echo off > %output%
echo echo %filename%の復元を開始します。 >> %output%
echo set hash_before=%hash_before% >> %output%
echo %WINDIR%\system32\extrac32.exe /e /a /y %fragmentfilename2% >> %output%
echo echo 結合が完了しました。 >> %output%
echo echo ハッシュ値チェックを開始します。 >> %output%
echo echo; >> %output%
echo cd %%~dp0 >> %output%
echo for /f "usebackq skip=1 delims=" %%%%A in (`certutil -hashfile %filename%`) do ( >> %output%
echo set hash_after=%%%%A >> %output%
echo goto exitfor2 >> %output%
echo ) >> %output%
echo :exitfor2 >> %output%
echo echo ------------------------------------- >> %output%
echo echo 分割前ハッシュ値:%hash_before% >> %output%
echo echo 結合後ハッシュ値:%%hash_after%% >> %output%
echo echo ------------------------------------- >> %output%
echo if %hash_before%==%%hash_after%% ( >> %output%
echo echo ハッシュ値が一致しました。終了します。 >> %output%
echo ) else ( >> %output%
echo echo ハッシュ値に差異がありました。ファイル分割・結合どちらかが正しく行えていません。 >> %output%
echo ) >> %output%
echo pause >> %output%
rem 分割フォルダを表示
start %~dp0%dirname%
echo;
echo -------------------------------------
echo ファイル分割が完了しました。終了します。
pause
goto end
:end
このコードはそのまま使えますが、分割するファイルの最大サイズは自由に変更して使ってください。
分割するファイルの最大サイズを指定する
1GBを超えるファイルを分割するケースを想定して作っています。
デフォルトの分割ファイルの最大サイズは100MBです。
変更する部分はここです。
rem 分割ファイルの最大サイズ 512の倍数で指定。102400000=100MB
set fragmentsize=102400000
set fragmentsize2=約100MB
おすすめの最大サイズ
- 10KB=10240
- 100KB=102400
- 1MB=1024000
- 10MB=10240000
- 100MB=102400000
- 500MB=204800000
- 1GB=1024000000
まとめ
makecabの分割・結合をバッチで実行する方法を紹介しました。
今回はWindows標準機能のみで分割と結合を行いました。分割の仕組みを理解していなくても操作できるバッチなので説明いらずです。使ってみてください。