Windowsに組み込まれているファイル圧縮機能のみを使用して、コマンドプロンプトからファイルを圧縮できますか?


111

テキストファイルを出力するバッチファイルがあります。私もそれをジップアップできるといいと思いました。

これは管理されていない環境で使用されるため、7-Zipなどのサードパーティソフトウェア製品の存在について推測することはできません。これには、Windowsの組み込み機能を使用してファイルを圧縮する必要があります。


1
PowershellまたはWSHスクリプトを利用できますか?これが、コマンドラインからWindowsの組み込みzip処理を使用する唯一の方法です。それ以外の場合、Mollyが指摘しているように、サードパーティのツールが必要です。
いんちきキホーテ

1
だからあなたは誰かにバッチファイルを送信し、静的にリンクされた小さなgzip.exeを彼に送信することはできませんか?
アキラ

OPの質問は素晴らしいものです(@quackquixoteの奇妙な告発にもかかわらず)。WindowsはこれをSendToの下のシングルクリックとして提供するので、BATファイルで使用可能なコマンドがあるはずです。したがって、答えが「いいえ」であり、(とんでもないことに)同等または同等でないサードパーティ製ツールを使用する必要がある場合でも、それは良い質問です。
ジョンクームズ14

これは、Tomasによるリンクで、フォルダのコンテンツをzipするためのスクリプトがよく書かれています。動作させるには、スクリプトをバッチファイルにコピーし、zip圧縮するフォルダー(ソース)を指定して実行します。スクリプトでデフォルトにデスクトップに設定されているため、宛先ディレクトリを指定する必要はありません( "%USERPROFILE%\ Desktop")
Abhijeet

3
最も単純に、cmdプロンプトで、次のようになります。powershell.exe Compress-Archive file-to-zip.txt zippedfile.zip(それはあまりにもフォルダで動作します)
ThomasGuenet

回答:


85

ここで指定したファイルを圧縮するすべてのバッチファイルソリューション(私の他の回答の変化)であるc:\ue_english.txtと、それを置くには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ファイルを生成して名前を変更します。


3
@quack私は知らないいくつかのあいまいなコマンドを期待して頑張っていました。困難な要件が存在しない場合、だれかを除外することを意味するものではないことをどのように確認できるかがわかります。
アーロンブッシュ

@PeterMortensen:これがPowershellでどれだけ単純化されるかを見るのは面白いかもしれませんし、そうでないかもしれません。ここでは5行の例であるが、また、存在write-zipからダウンロードすることができレットPscxを
タマラWijsman

ZIPを満たすためにzip.exeとcywin1.dll(3mb)を使用しましたが、使用方法は1行です... zip自体からバッチコードを使用します。私は、argvでbancompile'dされたphpを使用し、それにファイルを渡すことができることを知っています。かっこいいね。「Windowsコマンドラインからのzip」は、古いSF映画ですよね?
erm3nda

なぜ一時フォルダーを使用する必要があるのTEMPDIRですか?あなたの意図は、ファイルFILETOZIPをフォルダでラップすることだと思いますか?
ナムG VU 14年

@Peter Mortensen、これは古いスレッドであり、これは私が探しているもののほとんどです。1つの大きなファイルを小さなチャンクに圧縮するオプションはありますか?
-JohnG

38

追加のソフトウェアをインストールせずにファイルを圧縮すること可能です(テスト済みです)。解決策は次のとおりです。

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

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の組み込みzip機能(Windows XP以降?)は、Windowsシェルのexplorer.exeのCOMインターフェース(「Shell.Application」部分)を通じて公開されます。VBScriptスクリプトはCOMコンポーネントにアクセスできるため、このCOMインターフェイスはVBScriptスクリプトから使用できます。スクリプトを完全に自己完結させるために、空のZIPファイルを作成して開始します(空のZIPファイルを作成し、VBScriptスクリプトと共にターゲットシステムにコピーすることもできます)。

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

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


1
+1「すぐに実行」される適切なソリューションですが、リストにない他のいくつかの理由でBATを選択します。だから私はBATソリューションを好むだろう。
アーロンブッシュ

4
@Aaron Bush:このスクリプトとBeanerの両方は、要求に応じてWindows組み込み関数を使用して、コマンドラインでファイルを圧縮するコマンドを提供します。 そのコマンドを他のバッチファイルに追加できます。
いんちきのキホーテ

渡されるパスは、相対パスではなく絶対パスにする必要があることに注意してください。私もここでの答えで技術を使用していた:stackoverflow.com/q/1645843/99640
チャック・ウィルバー

パスは絶対でなければならず、ランダムに失敗するようです:(
kixorz 14

これを答えとして選択する必要があります。
マーシャル公爵שלום14年

12

PowerShellを使用する場合は、.NET 2.0でzip機能を使用できます(PowerShellは.NETです)。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)}

これは基本的に、他の回答のCScriptコードと同じです。.NET機能は使用されません(.NETにはZIPサポートがありません)。これもタイミングの問題の影響を受けやすいと思われます。
ロバートシュミット

2
.NET System.IO.Compression.ZipFileクラスはバージョン4.5で追加されました。
コンクリートガネット14年

7

圧縮ダイアログウィンドウの存在をポーリングすることにより、圧縮中にタイムアウトするリスクを排除できます。このメソッドは、ユーザーが圧縮ウィンドウからキャンセルすることも処理します。

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

1
+1。これらのコードモンキースタイル " .Sleep(whatever)"は気分を害します。
ivan_pozdeev

1
私は待っているため上記のロジックでvbsファイルを実行している場合は、どのようにこれがスケジュールされたタスクから起動された場合に処理されます(ユーザーが物理的に記録されません。)
ウェス・

5

Resource Kit Toolsをインストールできる場合、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.

3
+1本当に問題を解決するわけではありませんが、知っておくと良いでしょう。
アーロンブッシュ

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

まさに私が探していたもの..しかし、「空のZipファイルが見つかりません」というエラーが表示される
ソニックソウル14

何らかの理由で、これは私が印刷する場合、インクリメント決してについてはobjShell.NameSpace( ZipFile ).Items.Count...ループ内で、それがZIPファイルが作成され、それが内部に期待される内容を持っているにもかかわらず、常に0です
トム・ニコルズ

2

コードを簡素化した複数のファイル/ディレクトリ。

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

zip.vbsファイル

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

これは、受け入れられた答えの突然変異です。一度に最大数千のファイルに対して大量の自動化タスクを実行するため、2秒間だけスリープすることはできません。私はここで回避策を集めましたが、これはここでジジー・コチャラの答えに似ています

これにより、200ミリ秒ごとに宛先フォルダーにpingが実行されます。これは、MicrosoftがFSの更新を確認するように指示した速度とほぼ同じです。

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

1

圧縮と解凍のための組み込み機能ウィンドウを要約するHere'a私の試み- https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders -with-batch-f

ほとんどすべてのWindowsマシンで動作するはずのいくつかのソリューションがあります。

shell.applicationとWSH に関しては、一時 ファイルを必要としないハイブリッドバッチ/ jscriptファイル(拡張子.bat)を許可するため、jscriptを好みました。1つのファイルにunzipおよびzip機能を追加し、さらにいくつかの機能を追加しました。


0

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名は2番目です):

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

0

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

tar.exe -xf archive.zip

またはアーカイブを作成する

tar.exe -cf Test.zip Test

-5

Windowsコマンドラインは、コンパクトコマンドを提供するようになりました。これは、私の知る限り、Windowsにネイティブです。私は何かを見逃さない限り、要求された要件を満たしているはずです。


9
compactXPから存在し、NTFS圧縮を管理するためのツールです
デアHochstapler
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.