テキストファイルを出力するバッチファイルがあります。私もそれをジップアップすることができればそれはいいだろうと思った。
これは管理されていない環境で使用されるので、 7-Zip などのようなサードパーティ製ソフトウェア製品の存在については想定できません。これはZipファイルにWindowsの組み込み機能を使用する必要があります。
これが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
ファイルを生成して名前を変更してください。
は追加のソフトウェアをインストールすることなく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(またはそれ以降のバージョン)がインストールされている場合もインストールされます。
あなたが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)}
圧縮ダイアログウィンドウの存在をポーリングすることで、圧縮中にタイムアウトするリスクを排除できます。このメソッドは、ユーザーが圧縮ウィンドウからキャンセルすることも処理します。
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
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.
'Keep script waiting until compression is done
Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count
WScript.Sleep 200
Loop
これは受け入れられた答えの突然変異です。私は一度に数千ものファイルに対して大量の自動化タスクを実行するので、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
単純化されたコードで複数のファイル/ディレクトリ。
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
ここで私は圧縮と解凍のための組み込み機能ウィンドウを要約しようとしています - https://stackoverflow.com/questions/28043589/how-can-i-compres-Zip-and-バッチfの圧縮解除、ファイルおよびフォルダの展開
ほとんどすべてのWindowsマシンで動作するはずのいくつかの解決策があります。
Shell.applicationとWSHに関しては、私は jscript を選択しました。一時ファイルを必要としないjscriptファイル(拡張子.bat)。1つのファイルに解凍機能とZip機能を追加し、さらにいくつかの機能を追加しました。
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'"
Windows 10ビルド17063以降にはtar.exeがバンドルされており、コマンドラインからZipを操作できます。
tar.exe -xf archive.Zip
またはアーカイブを作成する
tar.exe -cf Test.Zip Test