バッチファイルでzip解凍する(PowerShellを使用)


Y子です。
以前、ファイルをzip圧縮するコードを書きましたが、今回は解凍のバッチファイルを作ってみました。
確認環境:Windows 10 Home (Bld. 19042.928)

仕様

  • PowerShellを使って、zipファイルを解凍する。
  • 解凍先として、対象ファイルがあるフォルダにサブフォルダを作成する。
  • 複数の引数に対応する。10個以上にも対応する。
  • 引数にzipファイル以外があるときは、飛ばす。
  • 拡張子は、大文字でも小文字でも対応する。

使い方

  • バッチファイルに、ファイル名やフォルダ名を引数で与えることで動作する。
  • バッチファイルに、ファイルやフォルダをマウスでドロップしてもよい。
  • バッチファイルのショートカットを「sendto」に置き、右クリック「送る」から選択してもよい。
  • 上記を、複数ファイル同時に行ってもよい。

コード

expand_file.bat
@echo off
setlocal

:label_top

  rem 引数がない場合は最後に飛んで終了する
  if "%~1"=="" (
    goto :label_end
  )

  rem zipファイルでない場合は処理しない(大文字小文字区別しない)
  if /i not "%~x1"==".zip" (
    echo "%~1":zipファイルではありません
    goto :label_bottom
  )

  rem ファイルが存在しない
  if not exist "%~1" (
    echo "%~1":ファイルが存在しません
    goto :label_bottom
  )

  rem 日付「20210402」形式
  set str_date=%date:~0,4%%date:~5,2%%date:~8%

  rem 時刻「094617」形式
  set str_time=%time: =0%
  set str_time=%str_time:~0,2%%str_time:~3,2%%str_time:~6,2%

  rem 上位フォルダのフルパス「C:\work dir\」
  set str_dir=%~dp1

  rem 解凍先サブフォルダ名「dirname_yyyymmdd_hhmmss」
  set str_subdir=%~n1_%str_date%_%str_time%

  if not exist "%str_dir%%str_subdir%" (
    mkdir "%str_dir%%str_subdir%"
  )

  rem zip解凍実行
  powershell expand-archive -Path '%~1' -DestinationPath '%str_dir%%str_subdir%'
  echo "%~1":解凍先 %str_dir%%str_subdir%

  :label_bottom
  rem 引数をシフトし、最初に戻る
  shift
  goto :label_top

:label_end

echo 処理を終了しました
endlocal
pause

説明

サブフォルダを作り、その中に解凍するようにしました。
フォルダ無しで解凍すると、ファイルが既存のファイルと混ざって行方不明になったり、既存のファイルを上書きしたりするので、それを防ぐためです。

zipファイルかどうかの判定のために拡張子を確認していますが、その際、if文に/iオプションを付けて、大文字小文字を区別しないようにしました。

実行結果

実行結果
> expand_file.bat "C:\work dir\test01.zip" "C:\work dir\test02.ZIP" "C:\work dir\test03.txt" "C:\work dir\test04.zip"
"C:\work dir\test01.zip":解凍先 C:\work dir\test01_20210504_183151
"C:\work dir\test02.ZIP":解凍先 C:\work dir\test02_20210504_183152
"C:\work dir\test03.txt":zipファイルではありません
"C:\work dir\test04.zip":ファイルが存在しません
処理を終了しました
続行するには何かキーを押してください . . .

おわりに

解凍先フォルダの設計が、どうもオシャレじゃない気がしています。
とは言え、あまりコードの行数も増やしたくないし。
なんてことを考えてたら、圧縮のコードを書いてから1週間以上経ってしまいました。笑
いろいろな正解があると思いますので、これはこれでいいか、と思うことにしました。

では!明日は雨らしいですね!