7-Zipをコマンドラインから実行して圧縮処理をする際に、「System ERROR:ファンクションが間違っています。」とメッセージが表示されて処理が異常終了するケースに遭遇しました。
具体的には、以下のようなメッセージがコマンドプロンプトで表示されました。
7-Zip (a) 22.01 (x64) : Copyright (c) 1999-2022 Igor Pavlov : 2022-07-15
Open archive: C:\test\test.7z
ERROR: C:\test\test.7z
C:\test\test.7z
Open ERROR: Cannot open the file as [7z] archive
ERRORS:
Is not archive
System ERROR:
ファンクションが間違っています。
調べて原因はわかりましたが、調査に多少手間取ったため、レアな現象だと思いますが備忘録として残しておきます。
尚、当記事では先に原因を解説します。
その後、今回の現象が発生した経緯などを参考として紹介していきます。
原因は処理予定のファイルと同名のファイルに異なる圧縮形式が使われているから
原因はこの見出しのままです。
7-Zipを利用してコマンドラインから圧縮する場合は、以下の構文でコマンドを実行します。
# 実行ファイル a [圧縮後ファイル名] [圧縮前ファイル名]
例 7za.exe a c:\test\test.7z c:\test\test.txt
当項の見出しで記載した「処理予定のファイル」とは、上記のコマンド例で言えば、圧縮後ファイル名である「c:\test\test.7z」を指します。
ここで記載した「圧縮形式」とは、7z形式やzip形式、gzip形式などの圧縮ファイル方式を違いを指します。
例えば、上記の「c:\test\test.7z」が拡張子は「.7z」となっているが、「-tzip」などのオプションを指定して作成した圧縮ファイルであれば、ファイル自体の圧縮形式は「zip」といったファイルを作ることも可能です。
この状態で上記のコマンドを実行すると、今回の記事の主題である「ファンクションが間違っています。」とエラーメッセージが表示されて処理が異常終了します。
本来はファイルの圧縮形式に合う拡張子をファイル名に指定するべきであり、通常はこのような状態は発生しないはずですが、もし発生した場合は今回のエラーになります。
当エラーの対応方法
圧縮後ファイル名に指定している場所に同じ名前の異なる圧縮形式のファイルが存在しているからエラーになるわけで、そのファイルを予め消しておけばエラーは発生しません。
いったんその同じファイル名で異なる圧縮形式のファイルを削除してから圧縮処理を実行してあげれば、以降は同じファイル名を指定して圧縮処理を実行する際にもエラーは発生しなくなります。
【余談】今回の現象の発生と解明までの流れ
当記事の本題はもう終わりですが、これだけだと味気ないので、当項では余談として、今回の現象が発生した経緯や、原因の判明までの流れを紹介しておきます。
今回の現象は、SQL Serverのバックアップデータをバッチ処理で圧縮させている際に発生しました。
以下の記事で紹介しているように、SQL Serverのバックアップを毎日実行し、そのデータをいったん7-Zipで圧縮したうえで、VPNを介して別のネットワークにあるサーバーまで転送し、そのサーバー内で解凍をしたうえで、そのサーバーのSQL Serverのインスタンスでリストアをしていました。
ただ、その仕組みを構築してから時間も経ち、バックアップデータも大きくなって圧縮処理に時間が掛かるようになってきたため、7-Zipの圧縮処理で指定しているオプションなどの設定値を調整して、処理の高速化を試みることにしました。
7-Zipのオプションを色々を試しながら圧縮のテストをしているなかで、設定した覚えのないオプションが設定されているのに気付きました。
-tzip
この「-t」オプションは、圧縮時に圧縮形式を明示的に指定する場合に使用します。
「-tzip」と指定した場合、zip形式で圧縮します。
そういえば、このバッチ処理を作成していた際に、元々一般的なzip形式で圧縮しようとしていたのを思い出しました・・・。
恐らく何らかの理由で、zip形式での圧縮をやめて7zip形式の圧縮処理に変えたつもりが、明示的にzip形式で指定していたオプションが消されずに残ったまま稼働していたということのようです。
ただ、圧縮後のファイル名の拡張子に「.7z」を指定していたので、7zip形式で圧縮できていると思い込んでいたというオチです。
「だから圧縮処理が遅かったのか・・・」
よって、本来不要な「-tzip」を外し、いったん検証環境で圧縮処理を試みたところ、それまで4時間近く掛かっていた圧縮処理が十数分で終わることが確認できました。
この検証結果を踏まえて、本番環境で稼働させている圧縮用のバッチ処理を書き換えて実行したのですが、実行直後に異常終了しました。
検証環境では正常に完了するのに、なぜ本番環境だと異常終了するのだろうか?
その際に発生していたエラーが「ファンクションが間違っています。」でした。
「ふぁんくしょん??」
その後、色々試した結果、前回バックアップファイルを圧縮した際の.7zファイルが残っていると、このエラーが発生することに気付き、更に、残っているファイルの圧縮形式と実行する圧縮処理で指定した圧縮形式がzip形式と7zip形式で異なっている場合に発生することを突き止めました。
本来は、仮に圧縮先として指定したファイル名と同じ名前のファイルがあっても、そのファイルの圧縮形式に関わらずファイルを上書きして圧縮してくれれば良いのですが、7zipではそのような実装にはなっていないようです。
最後に
今回の記事では、7-Zipでコマンドラインから圧縮を実行した場合に、「ファンクションが間違っています。」とエラーが出て異常終了する場合の原因と対応方法を紹介しました。
尚、このエラーメッセージ自体は、他の要因でも発生する可能性はあり、今回紹介した原因とは限りません。
ただ、このエラーメッセージでインターネットから情報を探そうとしても、少なくても日本語で作成された情報は殆ど見当たらなかったため、万が一同じような現象に遭遇した人がいればとい思い、記事にしました。
この記事がどなたかの助けになれば幸いです。
今回も読んでいただきましてありがとうございました。
それでは皆さまごきげんよう!