パスワード付きのZIPを一覧から検索して削除するよい方法はないでしょうか。

バッチファイルで何とか出来ないかと思ったのですが、私の頭では無理そうです…。

例 d:\zip\ に hoge01.zipとか適当な名前のZIPが数百有り、そのうちいくつかはパスワードがかかっている。
パスワードがかかっている物を楽に一括削除したい。 当方Windowsを使っております。

何か良い方法がありましたら、教えてください。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/04/17 21:56:22
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:bmax No.2

回答回数67ベストアンサー獲得回数16

ポイント350pt

1.下記のバッチファイルを適当な名前で保存してください。(ここでは PassZipDel.batとします)

2.Zipファイルの格納フォルダに1.のbatを入れてください。(d:\zipとします)

3.作業用フォルダと出力先フォルダ(パス無しのZipのみを格納する)を作成してください。

  (ここでは d:\zipwork と d:\zipoutput とします)

4.コマンドプロンプトにて以下を実行してください。

  D:\zip>PassZipDel.bat d:\zipwork d:\zipoutput


@echo off

for %%i in (*.zip) do (
 rem Zipファイルの解凍
 unzip -P "" "%%i" -d "%1" > "%1\result.txt"
 rem 解凍に成功したら出力先フォルダへコピー
 find "inflating" < "%1\result.txt"
 if not errorlevel 1 copy /Y "%%i" "%2"
)

rem ワークフォルダのクリア
del /Q %1

※UNZIPのバージョンなどによりうまく動作しない可能性があります。

 (解凍の成功を出力されるメッセージにて判断しているため


下記のUNZIP32.DLLを使用しています。

 http://www.madobe.net/archiver/lib/unzip32.html

id:x2pop

ありがとうございます!

しかし、、バージョンが違うのかうまくいきません…。私のスキル不足で申し訳ない。

私の知識(なので全く見当違いのことを言っているかもしれません)で原因を調べてみましたが、どうもresult.txtに結果が出力されていない事が原因のようです。unzipのバージョンの問題でしょうか。

パスワード付きの test.zip を用意して

unzip -P "" test.zip -d c:\zipout >t.txt

と実行すると、

t.txtの内容

Archive: test.zip

コマンド プロンプトの表示に

skipping: test.txt incorrect password

となります。このコマンドプロンプトの表示が、t.txtに入らないと、ダメではないでしょうか。

> hoge.txt としているのに表示されてしまうのはなぜ…?

http://www.ring.gr.jp/pub/text/CTAN/tools/zip/info-zip/WIN32/unz...

これを使っているのですが、x64だからダメなのかと思い、

http://www.ring.gr.jp/pub/text/CTAN/tools/zip/info-zip/WIN32/unz...

こちらにしてみましたが、やはりダメでした。

しかし、unzipがパスワードが違って解凍できない場合は普段と違うerrorlevelを返すはずですよね…。

それで何とかなるかもしれません。が、今日は時間切れなので、、

本当に参考になりました。なにか基本的なところを間違えていたらごめんなさい(汗)

2008/04/16 23:32:02

その他の回答1件)

id:un0 No.1

回答回数651ベストアンサー獲得回数32

ポイント1pt

以下の考え方でいかがでしょうか。

1.全てのzipファイルを一度unzipする

2.全てのzipファイルのみを削除する(展開されたファイルは削除しない)

3.2で展開されたファイルを改めてzipする

id:x2pop

それをしたいのですが、手間が掛かるので何かいい方法を探しております。

ZIPを解凍して、解凍できなかった場合(パスワード付きなら出来ないでしょうから)それを削除するようなバッチを考えてみたのですが、うまくいきませんでした。

2008/04/15 21:27:23
id:bmax No.2

回答回数67ベストアンサー獲得回数16ここでベストアンサー

ポイント350pt

1.下記のバッチファイルを適当な名前で保存してください。(ここでは PassZipDel.batとします)

2.Zipファイルの格納フォルダに1.のbatを入れてください。(d:\zipとします)

3.作業用フォルダと出力先フォルダ(パス無しのZipのみを格納する)を作成してください。

  (ここでは d:\zipwork と d:\zipoutput とします)

4.コマンドプロンプトにて以下を実行してください。

  D:\zip>PassZipDel.bat d:\zipwork d:\zipoutput


@echo off

for %%i in (*.zip) do (
 rem Zipファイルの解凍
 unzip -P "" "%%i" -d "%1" > "%1\result.txt"
 rem 解凍に成功したら出力先フォルダへコピー
 find "inflating" < "%1\result.txt"
 if not errorlevel 1 copy /Y "%%i" "%2"
)

rem ワークフォルダのクリア
del /Q %1

※UNZIPのバージョンなどによりうまく動作しない可能性があります。

 (解凍の成功を出力されるメッセージにて判断しているため


下記のUNZIP32.DLLを使用しています。

 http://www.madobe.net/archiver/lib/unzip32.html

id:x2pop

ありがとうございます!

しかし、、バージョンが違うのかうまくいきません…。私のスキル不足で申し訳ない。

私の知識(なので全く見当違いのことを言っているかもしれません)で原因を調べてみましたが、どうもresult.txtに結果が出力されていない事が原因のようです。unzipのバージョンの問題でしょうか。

パスワード付きの test.zip を用意して

unzip -P "" test.zip -d c:\zipout >t.txt

と実行すると、

t.txtの内容

Archive: test.zip

コマンド プロンプトの表示に

skipping: test.txt incorrect password

となります。このコマンドプロンプトの表示が、t.txtに入らないと、ダメではないでしょうか。

> hoge.txt としているのに表示されてしまうのはなぜ…?

http://www.ring.gr.jp/pub/text/CTAN/tools/zip/info-zip/WIN32/unz...

これを使っているのですが、x64だからダメなのかと思い、

http://www.ring.gr.jp/pub/text/CTAN/tools/zip/info-zip/WIN32/unz...

こちらにしてみましたが、やはりダメでした。

しかし、unzipがパスワードが違って解凍できない場合は普段と違うerrorlevelを返すはずですよね…。

それで何とかなるかもしれません。が、今日は時間切れなので、、

本当に参考になりました。なにか基本的なところを間違えていたらごめんなさい(汗)

2008/04/16 23:32:02
  • id:bmax
    パスワード有りの場合のresult.txtに出力される内容はそれで合っています。
    パスワードなしのZipを処理した際は、Archive:~~.zipの次の行に、inflating:~~.dat(Zipファイルの中身です)が編集されます。


    いろいろ試しましたが失敗した場合のメッセージはtxtに出力されずに画面に出てしまうみたいです。
    逆に成功した場合のメッセージ(inflating)はtxtに出力できるのでそれで解凍に成功したかを判定しています。


    ちなみにerrorlevelに関してですが、解凍に成功しようが失敗しようが、Unzipの処理としては正常終了なので
    どちらも0が返ってきます。そのため結果ファイルを出力して判定しています。
    (findコマンドは検索に失敗した場合errorlevel=1を返すのでそれを利用)


    ちなみに上記のバッチファイルですが、元のフォルダの内容は全く変更しません。(もしミスがあって大事なZipを消してしまうとまずいので)
    出力先フォルダに指定したフォルダに、パスなしのZipだけがコピーされる仕様になっています。
    もし、そこを確認してうまくいっていないようでしたら状況をまた教えていただけますか?
  • id:x2pop
    3.zip (パスワードのないZIP)

    unzip -P "" 3.zip -d E:\temp > test.txt

    *test.txtの内容
    Archive: 3.zip
    extracting: E:/temp/file.txt

    ということは、
    extracting
    という文字列を検索すればいいのでしょうか。

    試しに
    unzip -P "" -o "%%i" -d "%1"
    if errorlevel 1 del "%%i"

    こうすると、パスワードがかかっているZIPだけが削除されたような、ちゃんと検証できていませんが、
    消してしまうのは確かに危険ですね(汗) もちろんテスト用のフォルダでやっていますが。

    やはり続きは明日に。

    色々ありがとうございます。感謝。
  • id:bmax
    お使いのUnzipだとextractingになるのですね!
    "extracting"を検索するように変更していただければOKです。


    Unzipが違うということで、ひょっとするとお使いのUnzipではパスワード不一致時はerrorlevelに1を返す仕様なのかもしれません。
    もし返ってくるのであれば、ご指摘のとおり、txtに出力して結果のメッセージを検索せずとも処理できると思います。
  • id:x2pop
    成功しました。ありがとうございました。

    @echo off

    for %%i in (*.zip) do (
    rem Zipファイルの解凍
    unzip -P "" "%%i" -d "%1" > "%1\result.txt"
    rem 解凍に成功したら出力先フォルダへコピー
    find "extracting" < "%1\result.txt"
    if not errorlevel 1 copy /Y "%%i" "%2"
    rem ワークフォルダのクリア
    del /Q %1

    )

    最終的にこんな感じになりました。ワークフォルダを毎回削除しないと、同じフォルダやファイルが解凍されたときに、unzipが上書きする?と聞いてくるので毎回削除を。

    パスワードが違って解凍できないとエラーレベルを返してくることが確認できたので、直接削除するものができました。危険ですが、
    あと、破損しているZIPなどエラーはすべて消えます。(今回はそれでちょうどいいのですが)

    @echo off

    for %%i in (*.zip) do (
    unzip -P "" -o "%%i" -d "%1"
    if errorlevel 1 del "%%i"
    del /Q "%1"
    )

    実行結果(p付きのがパスワード付きzip)

    Archive: 1n.zip
    extracting: d:/temp/test.txt
    Archive: 2n.zip
    extracting: d:/temp/test.txt
    Archive: 3p.zip
    skipping: test.txt incorrect password
    Archive: 4n.zip
    extracting: d:/temp/test.txt
    Archive: 5n.zip
    extracting: d:/temp/test.txt

    本当に助かります。あと何度かテストして、うまく動作することが確認できたら、混ざっているパスワード付きZIPが削除できます。
    あと、x64のunzipを使っても動作しましたので、これは関係ないようです。(x64 Vistaなので)
  • id:bmax
    うまくいったようで良かったです(^-^

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません