web-dev-qa-db-ja.com

あなたはZipファイルに唯一のWindowsの内蔵機能を使用してコマンドプロンプトからファイルをZipすることができますか?

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

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

105
Aaron Bush

これが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ファイルを生成して名前を変更してください。

84
Peter Mortensen

は追加のソフトウェアをインストールすることなくZipファイルにすることができます(私はそれをテストしました)。解決策は次のとおりです。

これをコマンドラインウィンドウで実行して、フォルダC:\someArchive.Zip内のすべてのファイルを含むC:\test3という名前の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 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以降は?)は COM のインターフェイスを介して公開されます。 Windowsのシェル、Explorer.exeから - それは "Shell.Application"の部分です。このCOMインターフェイスは、 VBScript スクリプトから使用できます。これは、そのようなスクリプトがCOMコンポーネントにアクセスできるためです。スクリプトを完全に自己完結型にするには、開始するために空のZipファイルを作成します(空のZipファイルを作成し、それをVBScriptスクリプトと共にターゲットシステムにコピーすることもできます)。

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

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

37
Peter Mortensen

あなたがPowerShellを使うことに寛容であるならば、Zip機能は.NET 2.0で利用可能です(PowerShellはそうです)。ネット)。これが例です( source 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

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

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

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.
4
cowgod
'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

これは受け入れられた答えの突然変異です。私は一度に数千ものファイルに対して大量の自動化タスクを実行するので、2秒間スリープすることはできず、それを気にする必要はありません。私は回避策 をここ にまとめました。これもJiříKočaraの答え に似ています .

これにより、保存先フォルダは200msごとに固定されます。これは、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
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
Olc

ここで私は圧縮と解凍のための組み込み機能ウィンドウを要約しようとしています - https://stackoverflow.com/questions/28043589/how-can-i-compres-Zip-and-バッチfの圧縮解除、ファイルおよびフォルダの展開

ほとんどすべてのWindowsマシンで動作するはずのいくつかの解決策があります。

Shell.applicationとWSHに関しては、私は jscript を選択しました。一時ファイルを必要としないjscriptファイル(拡張子.bat)。1つのファイルに解凍機能とZip機能を追加し、さらにいくつかの機能を追加しました。

1
npocmaka

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
Hashbrown

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

tar.exe -xf archive.Zip

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

tar.exe -cf Test.Zip Test
0
venimus