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週間以上経ってしまいました。笑
いろいろな正解があると思いますので、これはこれでいいか、と思うことにしました。
では!明日は雨らしいですね!