2008-08-27 10 views
53

Windows XP/Vista/2003/2008に組み込まれているZIP圧縮は、まったくスクリプト化できますか?どの実行可能ファイルをBAT/CMDファイルから呼び出す必要がありますか?またはVBScriptでそれを行うことは可能ですか?Windowsの組み込みZIP圧縮をスクリプト化できますか?

これはWinZip,7-Zipなどの外部アプリケーションを使用して可能ですが、私は外部アプリケーションをインストールする必要がないものを探しています。

+0

GoogleにはさまざまなVBScript実装が用意されています。 "Windowsシェル(XP、Vista、2003および2008)およびVBScriptを使用したZipおよびUnZipファイル(http://www.naterice.com/blog/template_permalink.asp?id=64)"を参照してください。私はこれらをテストしていないが、彼らは圧縮するのではなく、単に「ジップ」している可能性が最も高い。 – samjudson

+1

あなたはzipとcompressの間で何を区別していますか? – Cheeso

+1

unixの 'tar'のように、圧縮せずにファイルを一つのファイルに '圧縮'することができます。これにより、パッケージとしてファイルを配布できますが、ディスク容量のサイズは縮小されません。 – samjudson

答えて

28

zipunzipには、圧縮されたウィンドウを使用するVBAメソッドもあります。これは、システムの動作方法についていくつかの洞察を与えるはずです。これらのメソッドを任意のスクリプト言語に組み込むことができます。

基本的な原則は、ウィンドウ内では、zipファイルをディレクトリとして扱い、そこにコピーすることができるということです。したがって、新しいzipファイルを作成するには、空のzipファイルの正しいヘッダーを持つ拡張子が.zipのファイルを作成するだけです。次に、ファイルを閉じて、別のディレクトリであるかのようにファイルにコピーすることをウィンドウに指示します。

解凍は簡単です。単にディレクトリとして扱います。ここでは、Webページが再び失われた場合には

は、関連するコードスニペットのいくつかは次のとおりです。

ZIP

Sub NewZip(sPath) 
'Create empty Zip File 
'Changed by keepITcool Dec-12-2005 
    If Len(Dir(sPath)) > 0 Then Kill sPath 
    Open sPath For Output As #1 
    Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0) 
    Close #1 
End Sub 


Function bIsBookOpen(ByRef szBookName As String) As Boolean 
' Rob Bovey 
    On Error Resume Next 
    bIsBookOpen = Not (Application.Workbooks(szBookName) Is Nothing) 
End Function 


Function Split97(sStr As Variant, sdelim As String) As Variant 
'Tom Ogilvy 
    Split97 = Evaluate("{""" & _ 
         Application.Substitute(sStr, sdelim, """,""") & """}") 
End Function 

Sub Zip_File_Or_Files() 
    Dim strDate As String, DefPath As String, sFName As String 
    Dim oApp As Object, iCtr As Long, I As Integer 
    Dim FName, vArr, FileNameZip 

    DefPath = Application.DefaultFilePath 
    If Right(DefPath, 1) <> "\" Then 
     DefPath = DefPath & "\" 
    End If 

    strDate = Format(Now, " dd-mmm-yy h-mm-ss") 
    FileNameZip = DefPath & "MyFilesZip " & strDate & ".zip" 

    'Browse to the file(s), use the Ctrl key to select more files 
    FName = Application.GetOpenFilename(filefilter:="Excel Files (*.xl*), *.xl*", _ 
        MultiSelect:=True, Title:="Select the files you want to zip") 
    If IsArray(FName) = False Then 
     'do nothing 
    Else 
     'Create empty Zip File 
     NewZip (FileNameZip) 
     Set oApp = CreateObject("Shell.Application") 
     I = 0 
     For iCtr = LBound(FName) To UBound(FName) 
      vArr = Split97(FName(iCtr), "\") 
      sFName = vArr(UBound(vArr)) 
      If bIsBookOpen(sFName) Then 
       MsgBox "You can't zip a file that is open!" & vbLf & _ 
         "Please close it and try again: " & FName(iCtr) 
      Else 
       'Copy the file to the compressed folder 
       I = I + 1 
       oApp.Namespace(FileNameZip).CopyHere FName(iCtr) 

       'Keep script waiting until Compressing is done 
       On Error Resume Next 
       Do Until oApp.Namespace(FileNameZip).items.Count = I 
        Application.Wait (Now + TimeValue("0:00:01")) 
       Loop 
       On Error GoTo 0 
      End If 
     Next iCtr 

     MsgBox "You find the zipfile here: " & FileNameZip 
    End If 
End Sub 

UNZIP

Sub Unzip1() 
    Dim FSO As Object 
    Dim oApp As Object 
    Dim Fname As Variant 
    Dim FileNameFolder As Variant 
    Dim DefPath As String 
    Dim strDate As String 

    Fname = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", _ 
             MultiSelect:=False) 
    If Fname = False Then 
     'Do nothing 
    Else 
     'Root folder for the new folder. 
     'You can also use DefPath = "C:\Users\Ron\test\" 
     DefPath = Application.DefaultFilePath 
     If Right(DefPath, 1) <> "\" Then 
      DefPath = DefPath & "\" 
     End If 

     'Create the folder name 
     strDate = Format(Now, " dd-mm-yy h-mm-ss") 
     FileNameFolder = DefPath & "MyUnzipFolder " & strDate & "\" 

     'Make the normal folder in DefPath 
     MkDir FileNameFolder 

     'Extract the files into the newly created folder 
     Set oApp = CreateObject("Shell.Application") 

     oApp.Namespace(FileNameFolder).CopyHere oApp.Namespace(Fname).items 

     'If you want to extract only one file you can use this: 
     'oApp.Namespace(FileNameFolder).CopyHere _ 
     'oApp.Namespace(Fname).items.Item("test.txt") 

     MsgBox "You find the files here: " & FileNameFolder 

     On Error Resume Next 
     Set FSO = CreateObject("scripting.filesystemobject") 
     FSO.deletefolder Environ("Temp") & "\Temporary Directory*", True 
    End If 
End Sub 
+7

警告:投稿されたスクリプトは、Windowsシェルの実装依存の動作に依存します。たとえば、サードパーティの圧縮ソフトウェアがZIPアーカイブのデフォルトのOLE動詞を変更すると、簡単に破損することがあります。また、zipfldr.dll COMオブジェクトは、MSによるこの使用のために文書化されておらず、サポートもされていません。 –

+0

ZauファイルのFaux、OLE動詞は、上記のスクリプトを妨害しません。サポートしていない(または文書化していない)と、自動的にMSがそれを壊そうとしているわけではありません。彼らはそうかもしれませんが、それを文書化するかもしれません。 – wqw

+0

リンクが無効です – beerwin

1

SourceForge(http://sourceforge.net/projects/unxutils)で利用可能なUnxUtilsパッケージには、zipとunzipの両方の実行可能ファイル(および他の有用なアプリケーションのボートロード)があります。それらを 'c:\ windows'のようなあなたのPATHの場所にコピーすると、あなたのスクリプトにそれらを含めることができます。

これは完璧な解決策ではありません。

+2

UnxUtilsプロジェクトはもはやメンテナンスされていないようです(2007年以降は何も新しくありません)。 [GNUWin32プロジェクト](http://gnuwin32.sourceforge.net/)には、Windows上のGNUツールの最新リリースがあります。それには、[InfoZip](http://www.info-zip.org/)のzip/unzipのビルドが含まれています。しかし、InfoZipビルド[自分のソースから](http://sourceforge.net/projects/infozip/files/)を直接作る方がより安全で安全です。 – dolmen

24

はい、これはとスクリプト化することができますVBScript。たとえば、次のコードは、ディレクトリからzipファイルを作成することができます:それはVBScriptでいっぱい解凍/ジップ実装が含まれてます。またhttp://www.naterice.com/blog/template_permalink.asp?id=64役に立つを見つけることが

Dim fso, winShell, MyTarget, MySource, file 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set winShell = createObject("shell.application") 


MyTarget = Wscript.Arguments.Item(0) 
MySource = Wscript.Arguments.Item(1) 

Wscript.Echo "Adding " & MySource & " to " & MyTarget 

'create a new clean zip archive 
Set file = fso.CreateTextFile(MyTarget, True) 
file.write("PK" & chr(5) & chr(6) & string(18,chr(0))) 
file.close 

winShell.NameSpace(MyTarget).CopyHere winShell.NameSpace(MySource).Items 

do until winShell.namespace(MyTarget).items.count = winShell.namespace(MySource).items.count 
    wscript.sleep 1000 
loop 

Set winShell = Nothing 
Set fso = Nothing 

アイテム数ではなく500ミリ秒ごとにサイズチェックを行うと、大容量ファイルの方が効果的です。 Win 7は、圧縮が完了していなくても即座にファイルを書き込みます。

set fso=createobject("scripting.filesystemobject") 
Set h=fso.getFile(DestZip) 
do 
    wscript.sleep 500 
    max = h.size 
loop while h.size > max 

大量のログファイルには最適です。

+0

これはVista上で動作しますか?私はいくつかの問題に遭遇しており、Vistaが原因だと主張する準備は整っています。 – Icode4food

5

わかりやすくするために、GzipはGuy Starbuckが8月のコメントで提案したMS専用のアルゴリズムではありません。 System.IO.CompressionのGZipStreamは、zlibライブラリや他の多くのzipツールと同じDeflateアルゴリズムを使用します。そのクラスは、gzipのようなunixユーティリティと完全に相互運用可能です。

GZipStreamクラスは、ZIPファイルを生成するためにコマンドラインやVBScriptからスクリプト化できないため、元のポスターの要求には答えられません。

無料のDotNetZipライブラリは、zipファイルを読み込んで生成し、VBScriptまたはPowershellからスクリプトを作成することができます。また、zipファイルの作成と読み取り/抽出を行うコマンドラインツールも含まれています。ここで

は、VBScriptのためにいくつかのコードです:

dim filename 
filename = "C:\temp\ZipFile-created-from-VBScript.zip" 

WScript.echo("Instantiating a ZipFile object...") 
dim zip 
set zip = CreateObject("Ionic.Zip.ZipFile") 

WScript.echo("using AES256 encryption...") 
zip.Encryption = 3 

WScript.echo("setting the password...") 
zip.Password = "Very.Secret.Password!" 

WScript.echo("adding a selection of files...") 
zip.AddSelectedFiles("*.js") 
zip.AddSelectedFiles("*.vbs") 

WScript.echo("setting the save name...") 
zip.Name = filename 

WScript.echo("Saving...") 
zip.Save() 

WScript.echo("Disposing...") 
zip.Dispose() 

WScript.echo("Done.") 

はここにPowerShellのためのいくつかのコードです:.BATまたは.CMDファイルで

[System.Reflection.Assembly]::LoadFrom("c:\\dinoch\\bin\\Ionic.Zip.dll"); 

$directoryToZip = "c:\\temp"; 
$zipfile = new-object Ionic.Zip.ZipFile; 
$e= $zipfile.AddEntry("Readme.txt", "This is a zipfile created from within powershell.") 
$e= $zipfile.AddDirectory($directoryToZip, "home") 
$zipfile.Save("ZipFiles.ps1.out.zip"); 

、あなたがzipit.exeやunzip.exeを追加を使用することができますツール。例:あなたは、ユーティリティを使用することができます圧縮アーカイブを作成する

zipit NewZip.zip -s "This is string content for an entry" Readme.txt src 
1

MAKECAB.EXE

+0

ZIPファイルではありませんが、それでも便利なのですが、ありがとう! – travis

+1

-1 - CABはZIPではありません – user66001

2

Here'a圧縮と解凍のためのビルトイン機能の窓要約する私の試み - How can I compress (/ zip) and uncompress (/ unzip) files and folders with batch file without using any external tools?

でほぼすべてのWindowsマシンで動作する必要のあるソリューションはほとんどありません。で解凍し、ジップ機能を入れfiles.I've温度を必要としないことは、それが(.BAT拡張子を持つ)ハイブリッドバッチ/ JScriptのファイルを可能にするように、私はjscript 好ましいshell.applicationとWSHに関してとして

1つのファイルに加えていくつかの機能が追加されました。

関連する問題