Powershellでファイルをzip / unzipする方法は?


回答:


21

DotNetZipでは、PowerShellからこれを行うことができます。ワンライナーではありませんが、ライブラリを使用すると、必要なPowerShellスクリプトを記述できます。

COMインターフェイスを使用することもできます。WindowsPowerShellでファイルを圧縮し、Windows Vistaサイドバーガジェットをパッケージ化するをご覧ください。

「zip powershell」または「unzip powershell」をグーグルで検索しても、有用な結果が得られる場合があります。


1リンク先の記事では、最もupvoted答えとは違って有用なタスクがある
ルーベンBartelink

5
Google検索を提案する場合は-1。これは、「解凍のPowerShell」のGoogle検索でトップStackExchange結果である
憧れのマシン

154

これは、外部ツールなしで純粋にPowershellからそれを行う方法です。これにより、test.zipというファイルが現在の作業ディレクトリに解凍されます。

$shell_app=new-object -com shell.application
$filename = "test.zip"
$zip_file = $shell_app.namespace((Get-Location).Path + "\$filename")
$destination = $shell_app.namespace((Get-Location).Path)
$destination.Copyhere($zip_file.items())

26
既存のファイルを上書きするには、$ destination.Copyhere($ zip_file.items()、0x10)を使用します。0x4はダイアログボックスを非表示にし、0x14はこれらを組み合わせてダイアログを上書きおよび非表示にします。
ピーター

3
この行$destination.Copyhere($zip_file.items())は実際の解凍を行います。
ジョナサンアレン

2
あなたが望んでいた場合は、関数に上記パーセルことができます: function unzip($filename) { if (!(test-path $filename)) { throw "$filename does not exist" } $shell = new-object -com shell.application $shell.namespace($pwd.path).copyhere($shell.namespace((join-path $pwd $filename)).items()) }
ジェームズHolwell

6
これは受け入れられた答えでなければなりません。
tugberk

2
zipファイルがちょうどフォルダが含まれている場合、これは私のために失敗した(項目は空である)
ジェームズWoolfenden

56

.NET Framework 4.5には、次のように使用できるZipFileクラスがあります

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)

1
ExtractToDirectoryへの簡単な方法と、既存のすべてのファイルを上書きするオプションがある場合、これ素晴らしいことです。
ジェームズダン

1
これは.NET 4.5で機能します。ただし、Powershell V3も必要です。
DalSoft

3
Add-Typeを使用してアセンブリを読み込みます。例:Add-Type -AssemblyName System.IO.Compression.FileSystem
Mike

2
@JamesDunne-保存する必要がある他のファイルがない場合は、「Remove-Item -Recurse $ TargetFolder」を使用できます。それ以外の場合は、必要なことを実行できますが、それは重要なことです。読み取り用にzipを開いてから、zipを歩いて、以前のターゲットオブジェクトを削除し、新しいオブジェクトを解凍する必要があります。幸運なことに、簡単な解決策が機能します。;)
マイク

3
相対ファイルの場所で、PowerShellのディレクトリではなく.NETの現在のディレクトリが使用されることに注意してください。こちらをご覧ください。たぶん議論のほうがいいでしょう。(Resolve-Path $someDir).Path
jpmc26

18

あなたは、チェックアウトしたいと思うかもしれPowerShellのコミュニティの拡張機能(PSCX)このために特別のコマンドレットがあります。


1
+1 PSCXはアドオンコマンドレットの優れたセットです。必要なものとそうでないものを選択して選択できるようにしたいだけです。それは....私のPowerShellのインスタンスに全体の多くを変更しているようだ
marc_s

私がこれに出くわしたのは、同僚のためにできればPSCXのインストールを実際に自動化したいからです。今すぐ試して、どのような問題に
遭遇した

16

これは非常に古い質問であることは知っていますが、現在の回答を投稿すると考えて、Twitterでリンクされているのを見ました。

現在Windows 10またはWindows Management Framework 5 Production Preview経由で利用可能なPowerShell 5には、「zip」および「unzip」用の2つの組み込みコマンドレットが付属しています。


3
古い質問に新しい情報を提供することは良いことです。;)+1
jpmc26

5

私が長年使用し、UNIX環境で使用しているinfozipバイナリを使用する最も簡単なソリューションを見つけました。

PS> zip -9r ../test.zip * 
PS> cd .. 
PS> unzip -t test.zip Archive:  test.zip
    testing: LinqRepository/          OK
    testing: LinqRepository/ApplicationService.cs   OK
    testing: LinqRepository/bin/      OK 
... 
No errors detected in compressed data of test.zip.

テキスト出力の周りにpowershellラッパーを配置することは簡単ですが、実際にはそれを必要としないので、気にしませんでした。

http://www.info-zip.org/


5

また、Info-ZIP(他のほとんどのZipユーティリティにあるZipエンジン)と7-Zipも好きです。これは、GUIとコマンドラインの両方のZipユーティリティを備えたもう1つのお気に入りです。要点は、ほとんどのPowerShellタスクで機能する優れたコマンドラインユーティリティがあることです。

PowerShellを念頭に置いて構築されていないコマンドラインユーティリティを実行するには、いくつかのトリックがあります。

  • 名前の番号で始まる実行可能ファイルを実行し、アンパサンド(&)を先頭に付けます。

    &7zip.exe

  • 各トークンをラップします。ユーティリティは、コマンドラインから引用符で囲むことを期待しています。

    & "c:\ path with space \ SomeCommand.exe" "/ parameter2" "/ parameter2" "parameter2の値" "Value2` "引用符付き"

これを試して:

zip filename.zip (Get-ChildItem somepath\*)

あるいは:

zip filename.zip (Get-Content ListOfFiles.txt)

2

ジェームズ・ホルウェルあなたの答えは好きですが、少し拡大しました

# Example
#unzip "myZip.zip" "C:\Users\me\Desktop" "c:\mylocation"
function unzip($fileName, $sourcePath, $destinationPath)
{
    $shell = new-object -com shell.application
    if (!(Test-Path "$sourcePath\$fileName"))
    {
        throw "$sourcePath\$fileName does not exist" 
    }
    New-Item -ItemType Directory -Force -Path $destinationPath -WarningAction SilentlyContinue
    $shell.namespace($destinationPath).copyhere($shell.namespace("$sourcePath\$fileName").items()) 
}



0

ネイティブのWindows OSコマンドを使用して、同期方式でファイルを圧縮および圧縮解除するPowerShell 2.0互換モジュールを作成しました。これは、Windows XPなどの古いOSで動作し、.Net 4.5またはその他の外部ツールを必要としません。また、ファイルがすべて圧縮/解凍されるまで、関数はスクリプトの実行をブロックします。こちらのブログで詳細とモジュールを見つけることができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.