PowerShellを使用してZipアーカイブを作成することは可能ですか?
CodePlexに進んで PowerShell Community Extensions を入手する場合は、それらのwrite-Zip
コマンドレットを使用できます。
以来
CodePlexはシャットダウンに備えて読み取り専用モードになっています
PowerShell Gallery に行くことができます。
PowerShell 3および.NET 4.5と連携する純粋なPowerShellの代替手段(使用可能な場合):
function ZipFiles( $zipfilename, $sourcedir )
{
Add-Type -Assembly System.IO.Compression.FileSystem
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir,
$zipfilename, $compressionLevel, $false)
}
作成したいZipアーカイブへのフルパスと、Zipしたいファイルを含むディレクトリへのフルパスを渡すだけです。
PowerShell v5.0では、 Compress-Archive
および Expand-Archive
コマンドレットが追加されました。リンク先のページには完全な例がありますが、その要旨は次のとおりです。
# Create a Zip file with the contents of C:\Stuff\
Compress-Archive -Path C:\Stuff -DestinationPath archive.Zip
# Add more files to the Zip file
# (Existing files in the Zip file with the same name are replaced)
Compress-Archive -Path C:\OtherStuff\*.txt -Update -DestinationPath archive.Zip
# Extract the Zip file to C:\Destination\
Expand-Archive -Path archive.Zip -DestinationPath C:\Destination
最新の.NET 4.5フレームワークを使用したネイティブな方法ですが、完全に機能はありません。
作成:
Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::CreateFromDirectory("c:\your\directory\to\compress", "yourfile.Zip") ;
抽出:
Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::ExtractToDirectory("yourfile.Zip", "c:\your\destination") ;
すでに述べたように、まったく機能がないので、上書きフラグは使用しないでください。
更新:何年にもわたってこれを拡張してきた他の開発者については下記を参照してください.
7Zipをインストール(または代わりにコマンドラインバージョンをダウンロード)して、このPowerShellメソッドを使用します。
function create-7Zip([String] $aDirectory, [String] $aZipfile){
[string]$pathToZipExe = "$($Env:ProgramFiles)\7-Zip\7z.exe";
[Array]$arguments = "a", "-tzip", "$aZipfile", "$aDirectory", "-r";
& $pathToZipExe $arguments;
}
あなたはそれをこのように呼ぶことができます:
create-7Zip "c:\temp\myFolder" "c:\temp\myFolder.Zip"
2つ編集 - このコードは、古くからの醜い、醜い群れです。君はそれを欲しがっていない。
この例では、System.IO.Packaging.ZipPackageを使用して.\in
の内容を.\out.Zip
に圧縮しています ここ
$zipArchive = $pwd.path + "\out.Zip"
[System.Reflection.Assembly]::Load("WindowsBase,Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
$ZipPackage=[System.IO.Packaging.ZipPackage]::Open($zipArchive,
[System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite")
$in = gci .\in | select -expand fullName
[array]$files = $in -replace "C:","" -replace "\\","/"
ForEach ($file In $files)
{
$partName=New-Object System.Uri($file, [System.UriKind]"Relative")
$part=$ZipPackage.CreatePart($partName, "application/Zip",
[System.IO.Packaging.CompressionOption]"Maximum")
$bytes=[System.IO.File]::ReadAllBytes($file)
$stream=$part.GetStream()
$stream.Write($bytes, 0, $bytes.Length)
$stream.Close()
}
$ZipPackage.Close()
編集:信頼できない 大きなファイルの場合、=> 10mb、YMMV。 何かやること appdomainの証拠と隔離された記憶域。もっと親切な.NET 4.5 approach はPS v3からうまく動作しましたが、私の場合はより多くのメモリを必要としました。 PS v2から.NET 4を使用するには、設定ファイルに サポートされていない微調整 が必要です。
別の選択肢の下に与える。これはフルフォルダをZip圧縮し、指定された名前で指定されたパスにアーカイブを書き込みます。
.NET 3以上が必要です
Add-Type -Assembly "system.io.compression.filesystem"
$source = 'Source path here'
$destination = "c:\output\dummy.Zip"
If(Test-path $destination) {Remove-item $destination}
[io.compression.zipfile]::CreateFromDirectory($Source, $destination)
圧縮には、ライブラリを使います(7-Zipは Michalが提案しているように )。
7-Zip をインストールすると、インストールされたディレクトリにコンソールアプリケーションである7z.exe
が含まれます。
直接起動して、必要な圧縮オプションを使用できます。
DLLに参加したいのなら、それも可能でしょう。
7-Zipはフリーウェアでオープンソースです。
System.IO.Packaging.ZipPackage
はどうですか?
.NET 3.0以上が必要です。
#Load some assemblys. (No line break!)
[System.Reflection.Assembly]::Load("WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
#Create a Zip file named "MyZipFile.Zip". (No line break!)
$ZipPackage=[System.IO.Packaging.ZipPackage]::Open("C:\MyZipFile.Zip",
[System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite")
#The files I want to add to my archive:
$files = @("/Penguins.jpg", "/Lighthouse.jpg")
#For each file you want to add, we must extract the bytes
#and add them to a part of the Zip file.
ForEach ($file In $files)
{
$partName=New-Object System.Uri($file, [System.UriKind]"Relative")
#Create each part. (No line break!)
$part=$ZipPackage.CreatePart($partName, "",
[System.IO.Packaging.CompressionOption]"Maximum")
$bytes=[System.IO.File]::ReadAllBytes($file)
$stream=$part.GetStream()
$stream.Write($bytes, 0, $bytes.Length)
$stream.Close()
}
#Close the package when we're done.
$ZipPackage.Close()
これは、コマンドレットCompress-Archive
PowerShellを使用したZipファイルの作成 を使用した、PowerShell v5のネイティブソリューションです。
Microsoftドキュメントの Compress-Archive も参照してください。
例1
Compress-Archive `
-LiteralPath C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd `
-CompressionLevel Optimal `
-DestinationPath C:\Archives\Draft.Zip
例2
Compress-Archive `
-Path C:\Reference\* `
-CompressionLevel Fastest `
-DestinationPath C:\Archives\Draft
例3
Write-Output $files | Compress-Archive -DestinationPath $outzipfile
なぜドキュメントを見ていないのですか?空のZipファイルを作成し、そこに個々のファイルを追加して、全員が参照しているのと同じ.NET 4.5ライブラリに構築するsupported methodがあります。
コード例については以下を参照してください。
# Load the .NET Assembly
Add-Type -Assembly 'System.IO.Compression.FileSystem'
# Must be used for relative file locations with .NET functions instead of Set-Location:
[System.IO.Directory]::SetCurrentDirectory('.\Desktop')
# Create the Zip file and open it:
$z = [System.IO.Compression.ZipFile]::Open('z.Zip', [System.IO.Compression.ZipArchiveMode]::Create)
# Add a compressed file to the Zip file:
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($z, 't.txt', 't.txt')
# Close the file
$z.Dispose()
ドキュメントを閲覧する あなたがanyの質問を抱えているならば。
これは本当にあいまいですが機能します。 7za.exeは7Zipのスタンドアロンバージョンで、インストールパッケージで利用可能です。
# get files to be send
$logFiles = Get-ChildItem C:\Logging\*.* -Include *.log | where {$_.Name -match $yesterday}
foreach ($logFile in $logFiles)
{
Write-Host ("Processing " + $logFile.FullName)
# compress file
& ./7za.exe a -mmt=off ($logFile.FullName + ".7z") $logFile.FullName
}
function Zip-File
{
param (
[string]$ZipName,
[string]$SourceDirectory
)
Add-Type -Assembly System.IO.Compression.FileSystem
$Compress = [System.IO.Compression.CompressionLevel]::Optimal
[System.IO.Compression.ZipFile]::CreateFromDirectory($SourceDirectory,
$ZipName, $Compress, $false)
}
注意:
ZipName:作成したいZipファイルのフルパス。
SourceDirectory:Zipしたいファイルを含むディレクトリへのフルパス。
誰かが(フォルダではなく)単一のファイルを圧縮する必要がある場合: http://blogs.msdn.com/b/jerrydixon/archive/2014/08/08/zipping-a-single-file-with -powershell.aspx
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True)]
[ValidateScript({Test-Path -Path $_ -PathType Leaf})]
[string]$sourceFile,
[Parameter(Mandatory=$True)]
[ValidateScript({-not(Test-Path -Path $_ -PathType Leaf)})]
[string]$destinationFile
)
<#
.SYNOPSIS
Creates a Zip file that contains the specified innput file.
.EXAMPLE
FileZipper -sourceFile c:\test\inputfile.txt
-destinationFile c:\test\outputFile.Zip
#>
function New-Zip
{
param([string]$zipfilename)
set-content $zipfilename
("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
(dir $zipfilename).IsReadOnly = $false
}
function Add-Zip
{
param([string]$zipfilename)
if(-not (test-path($zipfilename)))
{
set-content $zipfilename
("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
(dir $zipfilename).IsReadOnly = $false
}
$shellApplication = new-object -com Shell.application
$zipPackage = $shellApplication.NameSpace($zipfilename)
foreach($file in $input)
{
$zipPackage.CopyHere($file.FullName)
Start-sleep -milliseconds 500
}
}
dir $sourceFile | Add-Zip $destinationFile
これがsonjzの答えを少し改良したもので、上書きオプションが追加されています。
function Zip-Files(
[Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$false)]
[string] $zipfilename,
[Parameter(Position=1, Mandatory=$true, ValueFromPipeline=$false)]
[string] $sourcedir,
[Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$false)]
[bool] $overwrite)
{
Add-Type -Assembly System.IO.Compression.FileSystem
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
if ($overwrite -eq $true )
{
if (Test-Path $zipfilename)
{
Remove-Item $zipfilename
}
}
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir, $zipfilename, $compressionLevel, $false)
}
これは、ソースフォルダからすべてのファイルを圧縮し、コピー先フォルダにZipファイルを作成する作業コードです。
$DestZip="C:\Destination\"
$Source = "C:\Source\"
$folder = Get-Item -Path $Source
$ZipTimestamp = Get-Date -format yyyyMMdd-HHmmss;
$ZipFileName = $DestZip + "Backup_" + $folder.name + "_" + $ZipTimestamp + ".Zip"
$Source
set-content $ZipFileName ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
# Wait for the Zip file to be created.
while (!(Test-Path -PathType leaf -Path $ZipFileName))
{
Start-Sleep -Milliseconds 20
}
$ZipFile = (new-object -com Shell.application).NameSpace($ZipFileName)
Write-Output (">> Waiting Compression : " + $ZipFileName)
#BACKUP - COPY
$ZipFile.CopyHere($Source)
$ZipFileName
# ARCHIVE
Read-Host "Please Enter.."
このStackOverflowからのC#から変換された、一時フォルダーを使用せずにネイティブの.Net 4.5を使用せずに単一のファイルを圧縮する場合にも、これは機能するはずです answer 。それは ここ から取られた構文を使用してより良い使用しています。
使用法:
ZipFiles -zipFilename output.Zip -sourceFile input.sql -filename name.inside.Zip.sql
コード:
function ZipFiles([string] $zipFilename, [string] $sourceFile, [string] $filename)
{
$fullSourceFile = (Get-Item -Path "$sourceFile" -Verbose).FullName
$fullZipFile = (Get-Item -Path "$zipFilename" -Verbose).FullName
Add-Type -AssemblyName System.IO
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.FileSystem
Using-Object ($fs = New-Object System.IO.FileStream($fullZipFile, [System.IO.FileMode]::Create)) {
Using-Object ($Arch = New-Object System.IO.Compression.ZipArchive($fs, [System.IO.Compression.ZipArchiveMode]::Create)) {
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($Arch, $fullSourceFile, $filename)
}
}
}
使用方法
function Using-Object
{
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[AllowEmptyString()]
[AllowEmptyCollection()]
[AllowNull()]
[Object]
$InputObject,
[Parameter(Mandatory = $true)]
[scriptblock]
$ScriptBlock
)
try
{
. $ScriptBlock
}
finally
{
if ($null -ne $InputObject -and $InputObject -is [System.IDisposable])
{
$InputObject.Dispose()
}
}
}
ディレクトリの圧縮と抽出のためのWindowsでの完全なコマンドラインコマンドは次のとおりです。
圧縮の場合
powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::CreateFromDirectory('C:\Indus','C:\Indus.Zip'); }"
抽出する場合
powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem';[IO.Compression.ZipFile]::ExtractToDirectory('C:\Indus.Zip','C:\Indus'); }"
このスニペットを使用して、データベースのバックアップフォルダでまだ圧縮されていないバックアップファイルを確認し、7-Zipを使用して圧縮し、最後に*.bak
ファイルを削除してディスク領域を節約します。一部のファイルが圧縮されないように、ファイルは圧縮前に長さ順(最小から最大)に並べられています。
$bkdir = "E:\BackupsPWS"
$7Zip = 'C:\"Program Files"\7-Zip\7z.exe'
get-childitem -path $bkdir | Sort-Object length |
where
{
$_.extension -match ".(bak)" -and
-not (test-path ($_.fullname -replace "(bak)", "7z"))
} |
foreach
{
$zipfilename = ($_.fullname -replace "bak", "7z")
Invoke-Expression "$7Zip a $zipfilename $($_.FullName)"
}
get-childitem -path $bkdir |
where {
$_.extension -match ".(bak)" -and
(test-path ($_.fullname -replace "(bak)", "7z"))
} |
foreach { del $_.fullname }
ここで、あなたは これらのファイルをFTPでバックアップ、圧縮、転送するためのPowerShellスクリプト をチェックすることができます。
ここでcmd.exeから、あるいはsshから起動するための完全なコマンドラインの例、またはあなたが望むもの!
powershell.exe -nologo -noprofile -command "&{ Add-Type -A 'System.IO.Compression.FileSystem' [System.IO.Compression.ZipFile]::CreateFromDirectory('c:/path/to/source/folder/', 'c:/path/to/output/file.Zip');}"
よろしく
[System.IO.IOException]
クラスをロードし、そのメソッドを使用することは、それがPowerShellにネイティブではないクラスであるという事実のため、不要なエラーを抑制するための重要なステップです。
私は自分のスクリプトをTにエラーコントロールしましたが、[System.IO.Compression.ZipFile]
クラスを使用している間にたくさんの余分な赤い「ファイルが存在する」出力を得ました
function zipFiles(
[Parameter(Position=0, Mandatory=$true]
[string] $sourceFolder,
[Parameter(Position=1, Mandatory=$true]
[string]$zipFileName,
[Parameter(Position=2, Mandatory=$false]
[bool]$overwrite)
{
Add-Type -Assembly System.IO
Add-Type -Assembly System.IO.Compression.FileSystem
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
$directoryTest = (Test-Path $dailyBackupDestFolder)
$fileTest = (Test-Path $zipFileName)
if ( $directoryTest -eq $false)
{
New-Item -ItemType Directory -Force -Path $dailyBackupDestFolder
}
if ( $fileTest -eq $true)
{
if ($overwrite -eq $true ){Remove-Item $zipFileName}
}
try
{
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourceFolder,$zipFileName,$compressionLevel)
}
catch [System.IO.IOException]
{
Write-Output ($dateTime + ' | ' + $_.Exception.Message ) | Out-File $logFile -append -force
}
}
ここでやっていることは、これらのIOエラーを捉えることです。例えば、既に存在するファイルにアクセスすること、そのエラーを捉えること、そして私がより大きなプログラムで維持しているログファイルに送ることです。
WinRARがインストールされている場合
function ZipUsingRar([String] $directory, [String] $zipFileName)
{
Write-Output "Performing operation ""Zip File"" on Target ""Item: $directory Destination:"
Write-Output ($zipFileName + """")
$pathToWinRar = "c:\Program Files\WinRAR\WinRar.exe";
[Array]$arguments = "a", "-afzip", "-df", "-ep1", "$zipFileName", "$directory";
& $pathToWinRar $arguments;
}
引数の意味:afzipはZipアーカイブを作成し、dfはファイルを削除し、ep1はアーカイブ内に完全なディレクトリパスを作成しません
最初の回答が投稿されてからロットが変更されました。これはCompress-Archiveコマンドを使った最新の例です。
Path
パラメーターで指定された2つのファイルDraft.Zip
およびDraftdoc.docx
を圧縮して、新しいアーカイブファイルdiagram2.vsd
を作成するコマンド。この操作に指定された圧縮レベルは最適です。
Compress-Archive -Path C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip
LiteralPath
パラメーターで指定された2つのファイルDraft.Zip
およびDraft doc.docx
を圧縮して、新しいアーカイブファイルDiagram [2].vsd
を作成するコマンド。この操作に指定された圧縮レベルは最適です。
Compress-Archive -LiteralPath 'C:\Reference\Draft Doc.docx', 'C:\Reference\Images\Diagram [2].vsd' -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip
Draft.Zip
フォルダーに新しいアーカイブファイルC:\Archives
を作成するためのコマンド。 Pathパラメータで特定のファイル名の代わりにワイルドカード文字が使用されているため、新しいアーカイブファイルにはC:\ Referenceフォルダ内のすべてのファイルが含まれます。
Compress-Archive -Path C:\Reference\* -CompressionLevel Fastest -DestinationPath C:\Archives\Draft
コマンドはフォルダ全体からアーカイブを作成します。C:\Reference
Compress-Archive -Path C:\Reference -DestinationPath C:\Archives\Draft
PowerShellはファイル名に.Zip
拡張子を自動的に追加します。