Windows XP/Vista/2003/2008 に組み込まれている ZIP 圧縮はスクリプト化できますか? BAT/CMD ファイルからどの実行可能ファイルを呼び出す必要がありますか? またはVBScriptでそれを行うことは可能ですか?
WinZip、7-Zip 、およびその他の外部アプリケーションを使用してこれが可能であることは認識していますが、外部アプリケーションをインストールする必要がないものを探しています。
圧縮に組み込まれたウィンドウを使用して圧縮および解凍する VBA メソッドもあります。これにより、システムがどのように動作するかについての洞察が得られるはずです。これらのメソッドを、選択したスクリプト言語に組み込むことができる場合があります。
基本的な原則は、Windows 内で zip ファイルをディレクトリとして扱い、そこにコピーしたり、そこからコピーしたりできるということです。.zip
したがって、新しい zip ファイルを作成するには、空の zip ファイルに適したヘッダーを持つ拡張子を持つファイルを作成するだけです。次に、それを閉じて、別のディレクトリであるかのようにファイルをそこにコピーするようにウィンドウに指示します。
解凍は簡単です。ディレクトリとして扱うだけです。
Web ページが再び失われた場合に備えて、関連するコード スニペットをいくつか示します。
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
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
はい、これはVBScriptでスクリプト化できます。たとえば、次のコードはディレクトリからzipを作成できます。
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
http://www.naterice.com/blog/template_permalink.asp?id=64には、VBScriptでの完全なUnzip / Zip実装が含まれているため、役立つ場合もあります。
アイテム数ではなく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
大量のログファイルに最適です。
わかりやすくするために、GZipは、8月のコメントでGuyStarbuckが提案したMSのみのアルゴリズムではありません。System.IO.CompressionのGZipStreamは、zlibライブラリや他の多くのzipツールとまったく同じDeflateアルゴリズムを使用します。このクラスは、gzipなどのUNIXユーティリティと完全に相互運用できます。
GZipStreamクラスは、コマンドラインまたはVBScriptからスクリプト化してZIPファイルを生成することはできないため、それだけでは元の投稿者の要求に答えることはできません。
無料の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のコードは次のとおりです。
[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");
.batまたは.cmdファイルでは、zipit.exeまたはunzip.exeツールを使用できます。例えば:
zipit NewZip.zip -s "This is string content for an entry" Readme.txt src
SourceForge ( http://sourceforge.net/projects/unxutils )で入手できる UnxUtils パッケージには、zip と unzip の両方の実行可能ファイル (およびその他の便利なアプリケーションのボート ロード) があります。それらを「c:\windows」などの PATH 内の場所にコピーすると、それらをスクリプトに含めることができます。
これは完璧な解決策 (またはあなたが求めた解決策) ではありませんが、まともな回避策です。
圧縮と解凍のための組み込み機能ウィンドウを要約する私の試みは次のとおりです-外部ツールを使用せずにバッチファイルでファイルとフォルダーを圧縮 (/ zip ) および解凍 (/ unzip ) するにはどうすればよいですか?
ほぼすべての Windows マシンで動作するはずのいくつかの特定のソリューションを使用します。
shell.applicationと WSHに関しては、 一時ファイルを必要としないハイブリッド バッチ/jscript ファイル (拡張子 .bat) を使用できるjscriptを好みました。 .
圧縮アーカイブを作成するには、ユーティリティ MAKECAB.EXE を使用できます