質問

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

を使用するとこれが可能であることがわかりました ウィンジップ, 7-ジップ などの外部アプリケーションがありますが、外部アプリケーションをインストールする必要がないものを探しています。

役に立ちましたか?

解決

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 ユーティリティを使用できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top