Windowsに内蔵されているONLYのZIP機能を使ってコマンドプロンプトからファイルをZIPすることはできますか?
テキストファイルを出力するバッチファイルを持っているのですが、これもZIPできたらいいなと思っています。それもZIPできたらいいなと思ったのですが
これは制御されていない環境で使用することになるので、 7-Zip などのサードパーティ製のソフトウェア製品の存在を想定することはできません。これは、Windowsの現在組み込まれているZIPファイルの機能を使用する必要があります。
テキストファイルを出力するバッチファイルを持っているのですが、これもZIPできたらいいなと思っています。それもZIPできたらいいなと思ったのですが
これは制御されていない環境で使用することになるので、 7-Zip などのサードパーティ製のソフトウェア製品の存在を想定することはできません。これは、Windowsの現在組み込まれているZIPファイルの機能を使用する必要があります。
ここでは、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に格納されているフォルダの親に書き込みアクセスが必要です。
TEMPDIRスクリプトが入っているフォルダ(そこにファイルを生成するため)にも書き込みアクセスが必要です。別の拡張子を使用しようとすると、スクリプトエラーが発生する可能性があります。その代わりに、.batファイルを生成して名前を変更してください。
それはis追加のソフトウェアをインストールせずにファイルを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 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機能は、Windowsシェル、explorer.exeから COM インターフェイスを介して公開されています - それは “Shell.Application "部分です。このCOMインターフェースは、 VBScript スクリプトから使用することができます。このスクリプトを完全に自己完結型にするためには、起動時に空のZIPファイルを作成します(空のZIPファイルを作成して、VBScriptスクリプトと一緒にターゲットシステムにコピーすることもできます)。Windows Script Hostは、Windows 98以降のバージョンのWindowsにデフォルトで配布され、インストールされています。また、Internet Explorer 5(またはそれ以降のバージョン)がインストールされている場合もインストールされます。
あなたが* 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)}
圧縮ダイアログウィンドウの存在をポーリングすることで、圧縮中にタイミングアウトするリスクをなくすことができます。この方法は、ユーザが圧縮ウィンドウをキャンセルした場合にも対応しています。
'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 さんの回答 ここ に似ています。
これは200ミリ秒ごとに送信先フォルダにpingされるようになります。
ここでは、圧縮と解凍のための組み込み機能のWindowsを要約するための私の試み - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders-with-batch-f
ほぼすべてのWindowsマシン上で動作するはずのいくつかの与えられたソリューションと。
shell.applicationとWSHに関しては、私は jscript asそれは一時ファイルを必要としないハイブリッドバッチ/jscriptファイル(.bat拡張子を持つ)を可能にします。
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'"
Windows のコマンドラインでは、私の知る限りでは、Windows のネイティブコマンドである compact コマンドが提供されるようになりました。これは、私が何かを見逃していない限り、要求された要件を満たしているはずです。