テキストファイルを出力するバッチファイルを持っています。それも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.exe
は Windows 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