Windows の組み込み ZIP 圧縮をスクリプト化できますか?
-
09-06-2019 - |
解決
VBAメソッドがあります ジップ そして 解凍する 圧縮に組み込まれたウィンドウも使用すると、システムがどのように動作するかについてある程度の洞察が得られるはずです。これらのメソッドを任意のスクリプト言語に組み込むことができる場合があります。
基本原理は、Windows 内で zip ファイルをディレクトリとして扱い、そのディレクトリ内にコピーしたり、そこからコピーしたりできるということです。したがって、新しい zip ファイルを作成するには、次の拡張子を持つファイルを作成するだけです。 .zip
空の zip ファイルに適切なヘッダーが含まれています。次に、それを閉じて、別のディレクトリであるかのようにそこにファイルをコピーするように Windows に指示します。
解凍は簡単です。ディレクトリとして扱うだけです。
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
大量のログ ファイルに最適です。
明確にするために:Guy Starbuck が 8 月のコメントで示唆したように、GZip は MS 専用のアルゴリズムではありません。System.IO.Compression の GZipStream は、zlib ライブラリや他の多くの zip ツールと同様に、Deflate アルゴリズムを使用します。このクラスは、gzip などの UNIX ユーティリティと完全に相互運用可能です。
GZipStream クラスはコマンドラインや VBScript から ZIP ファイルを生成するスクリプトを実行できないため、これだけでは元の投稿者の要求に答えることはできません。
無料 ドットネットジップ ライブラリは 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
これは、圧縮と圧縮解除のための組み込み機能ウィンドウを要約する私の試みです - 外部ツールを使用せずに、バッチ ファイルを使用してファイルやフォルダーを圧縮 (/ zip ) および解凍 (/ unzip ) するにはどうすればよいですか?
ほぼすべての Windows マシンで動作するいくつかのソリューションが用意されています。
に関しては、 シェル.アプリケーション そしてWSHの方が好きでした jscript一時ファイルを必要としないハイブリッド バッチ/jscript ファイル (拡張子 .bat 付き) が可能になるため、解凍機能と圧縮機能を 1 つのファイルに加え、さらにいくつかの機能を追加しました。
SourceForge (http://sourceforge.net/projects/unxutils)。これらを PATH 内の場所 (「c:\windows」など) にコピーすると、それらをスクリプトに含めることができます。
これは完璧な解決策 (またはあなたが求めた解決策) ではありませんが、適切な回避策です。
圧縮アーカイブを作成するには、MAKECAB.EXE ユーティリティを使用できます。