Windows に内蔵されている ZIP 機能のみを使用して、コマンドプロンプトからファイルを ZIP することはできますか?

batch command-line windows zip

テキストファイルを出力するバッチファイルを持っています。それもzipにできたらいいなと思いました

これは制御されていない環境で使用されるので、7-Zipなどのサードパーティ製のソフトウェア製品の存在を仮定することはできません。これは、ファイルをZIPするためのWindowsの現在組み込まれている機能を使用する必要があります

  118  Aaron Bush  2010-02-19


ベストアンサー

ここに、c:\ue_english.txtという名前のファイルをzip圧縮してC:\someArchive.zipに入れるオールバッチファイルソリューション(私の他の回答のバリエーション)があります

set FILETOZIP=c:\ue_english.txt

set TEMPDIR=C:\temp738
rmdir %TEMPDIR%
mkdir %TEMPDIR%
xcopy /s %FILETOZIP% %TEMPDIR%

echo Set objArgs = WScript.Arguments > _zipIt.vbs
echo InputFolder = objArgs(0) >> _zipIt.vbs
echo ZipFile = objArgs(1) >> _zipIt.vbs
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
echo wScript.Sleep 2000 >> _zipIt.vbs

CScript  _zipIt.vbs  %TEMPDIR%  C:\someArchive.zip

pause

TEMPDIRに格納されているフォルダの親への書き込みアクセスが必要です。これはCドライブのルートには当てはまらないことが多いので、TEMPDIRを変更する必要があるかもしれません

書き込みアクセスは、.batスクリプトがあるフォルダにも必要です(そこにファイルを生成するので)

また、圧縮ファイルの拡張子は.zipでなければならないことに注意してください。別の拡張子を使おうとすると、スクリプトエラーになることがあります。代わりに、.zipファイルを生成して名前を変更してください

88  Peter Mortensen  2010-02-22


追加ソフトをインストールしなくてもファイルをZIP化することは可能です(試してみました)。解決方法は

コマンドラインウィンドウでこれを実行して、フォルダC:\test3内のすべてのファイルを含むC:\someArchive.zipという名前のZIPファイルを作成します

CScript  zip.vbs  C:\test3  C:\someArchive.zip

ファイル zip.vbs が含まれている場所

' Get command-line arguments.
Set objArgs = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
InputFolder = FS.GetAbsolutePathName(objArgs(0))
ZipFile = FS.GetAbsolutePathName(objArgs(1))

' Create an empty ZIP file.
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)

Set objShell = CreateObject("Shell.Application")

Set source = objShell.NameSpace(InputFolder).Items

objShell.NameSpace(ZipFile).CopyHere(source)

' Required to let the ZIP command execute
' If this script randomly fails or the ZIP file is not complete,
' just increase to more than 2 seconds
wScript.Sleep 2000

スペースを含むパスやファイル名についてはテストしていません。コマンドラインのパラメータの周りに引用符を付ければ動くかもしれません


どのように動作するのか: Windows (Windows XP 以降?) に内蔵されている zip 機能は、COM Windows シェル、explorer.exe – つまり “Shell.Application” の部分 – を介して公開されています。この COM インタフェースは、VBScript スクリプトから使用することができます。スクリプトを完全に自己完結型にするためには、開始するための空の ZIP ファイルを作成します (空の ZIP ファイルを作成して、VBScript スクリプトと一緒にターゲットシステムにコピーすることもできます)

VBScript は Windows 98 以降の Microsoft Windows のすべてのデスクトップ版にデフォルトでインストールされています

CScript.exeWindows Script Host の一部です。Windows Script Host は Windows 98 以降のバージョンの Windows にデフォルトで配布され、インストールされています。また、Internet Explorer 5 (またはそれ以降のバージョン) がインストールされている場合もインストールされます

40  Peter Mortensen  2010-02-20


PowerShellを使用することにオープンであれば、zip機能は.NET 2.0で利用可能です(PowerShellは.NETです)。以下に例を示します (ソース) credit to Mike Hodnick

########################################################
# out-zip.ps1
#
# Usage:
#    To zip up some files:
#       ls c:\source\*.txt | out-zip c:\target\archive.zip $_
#
#    To zip up a folder:
#       gi c:\source | out-zip c:\target\archive.zip $_
########################################################

$path = $args[0]
$files = $input

if (-not $path.EndsWith('.zip')) {$path += '.zip'}

if (-not (test-path $path)) {
set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
}

$ZipFile = (new-object -com shell.application).NameSpace($path)
$files | foreach {$zipfile.CopyHere($_.fullname)}

12  Beaner  2010-02-19


圧縮ダイアログウィンドウの存在をポーリングすることで、圧縮中にタイミングアウトするリスクをなくすことができます。この方法は、ユーザが圧縮ウィンドウをキャンセルする際にも対応しています

objShell.NameSpace(ZipFile).CopyHere(source)

' Wait for compression window to open
set scriptShell = CreateObject("Wscript.Shell")
Do While scriptShell.AppActivate("Compressing...") = FALSE
WScript.Sleep 500 ' Arbitrary polling delay
Loop

' Wait for compression to complete before exiting script
Do While scriptShell.AppActivate("Compressing...") = TRUE
WScript.Sleep 500 ' Arbitrary polling delay
Loop

7  George Yockey  2011-11-23


Windows 10 ビルド 17063 以降には、コマンドラインから ZIP ファイルを操作できる tar.exe がバンドルされています

tar.exe -xf archive.zip

あるいはアーカイブを作成すること

tar.exe -cf Test.zip Test

6  venimus  2019-08-20


リソースキットツールをインストールすることができれば、zipのような圧縮アーカイブファイルを作成できるCOMPRESSというコマンドラインツールがあります

Microsoft (R) File Compression Utility  Version 5.00.2134.1
Copyright (C) Microsoft Corp. 1990-1999.  All rights reserved.

Compresses one or more files.

COMPRESS [-r] [-d] [-z] Source Destination
COMPRESS -r [-d] [-z] Source [Destination]

-r            Rename compressed files.
-d            Update compressed files only if out of date.
-zx           LZX compression.
-z            MS-ZIP compression.
-zq[n]        Quantum compression and optional level
(in range 1-7, default is 4).
Source        Source file specification.  Wildcards may be used.
Destination   Destination file | path specification.
Destination may be a directory.
If Source is multiple files and -r is not specified,
Destination must be a directory.

5  cowgod  2010-02-19


'Keep script waiting until compression is done
Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count
WScript.Sleep 200
Loop

3  Jiří Kočara  2012-08-07


簡略化されたコードで複数のファイル/ディレクトリ

cscript zip.vbs target.zip sourceFile1 sourceDir2 ... sourceObjN

zip.vbs file

Set objArgs = WScript.Arguments
ZipFile = objArgs(0)

' Create empty ZIP file and open for adding
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set zip = CreateObject("Shell.Application").NameSpace(ZipFile)

' Add all files/directories to the .zip file
For i = 1 To objArgs.count-1
zip.CopyHere(objArgs(i))
WScript.Sleep 10000 'REQUIRED!! (Depending on file/dir size)
Next

2  Olc  2012-11-05


これは、受け入れられた答えの突然変異です。私は一度に何千ものファイルの自動化タスクのトンを行うので、2秒間だけスリープしてそれを気にしないことはできません。私はこちらから回避策を得ましたが、これはJiří Kočaraさんの回答こちらにも似ています

これにより、保存先のフォルダが200msごとにpingされるようになりますが、これはMicrosoftがファイルシステムの更新をチェックすると言っているのとほぼ同じ速さです

Set parameters = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
SourceDir = FS.GetAbsolutePathName(parameters(0))
ZipFile = FS.GetAbsolutePathName(parameters(1))
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set shell = CreateObject("Shell.Application")
Set source_objects = shell.NameSpace(SourceDir).Items
Set ZipDest = shell.NameSpace(ZipFile)
Count=ZipDest.Items().Count
shell.NameSpace(ZipFile).CopyHere(source_objects)
Do While Count = ZipDest.Items().Count
wScript.Sleep 200
Loop

2  kayleeFrye_onDeck  2017-06-07


Windows 8 または Windows Server 2012 の場合、PowerShell.NET 4.5があれば、このようなことができます

zip.ps1 (使用法: -directory <directory to zip up> -name <zip name>)

param (
[string]$directory,
[string]$name
)

Add-Type -Assembly System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory($directory, $name, [System.IO.Compression.CompressionLevel]::Optimal, $false)

zip.bat (PowerShellを呼び出すヘルパーが必要な場合は、ディレクトリが第一引数、ZIP名が第二引数となります)

@Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"

1  Hashbrown  2016-08-02


ここでは、圧縮と圧縮解除のための Windows の組み込み機能を要約する私の試みです – How can I compress (/ zip ) and uncompress (/ unzip ) files and folders with batch file without using any external tools? – ほぼすべての Windows マシン上で動作するはずのいくつかの与えられたソリューションを使用して、バッチファイルで圧縮 (/ zip ) と解凍 (/ unzip ) することができます

shell.application と WSHに関して、私は JScript の方を好みました それは、一時ファイルを必要としないハイブリッドなバッチ/JScript ファイル (拡張子は .bat) を使用できるからです。私は一つのファイルに unzip と zip の機能に加えて、いくつかの機能を追加しました

1  npocmaka  2015-01-22


そのためのシンプルなcmd.exeコマンドが1つあります(PowerShell v5.0+を介して)

To zip:

powershell Compress-Archive -LiteralPath 'C:\mypath\testfile.txt' -DestinationPath "C:\mypath\Test.zip"

To unzip:

powershell Expand-Archive -LiteralPath "C:\mypath\Test.Zip" -DestinationPath "C:\mypath" -Force

Sources:

特別に @Ramhound に感謝します

0  cowlinator  2020-04-21


Windows のコマンドラインには COMPACT コマンドがあります。これは、私が何かを見逃していない限り、要求された要件を満たしているはずです

-5  user228211  2013-05-31


タイトルとURLをコピーしました