【Expand-Archive】PowerShellで圧縮ファイル(ZIP)の解凍する方法

こんにちは。チェシャ男です。(-皿-)

今回は、

【PowerShell で圧縮ファイルを解凍する方法】

についてご紹介します。

今回紹介する ”Expand-Archive” は PowerShell 5.0 で新たに追加された圧縮ファイル解凍用コマンドレットです。

あなたはファイルの圧縮解凍のためにフリーツールを入れていましたか?

v5.0 以降の PowerShell を導入していれば Windows の標準機能として圧縮や解凍が出来るので非常に便利ですよ!

ファイルの圧縮方法についてはこちら↓の記事をご参考ください。

[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/item-file/compress-archive/”]

Expand-Archive で圧縮ファイルを解凍する

ファイル解凍を行うコマンドレットに

Expand-Archive(→コマンドレットの詳細はこちら

というものがあります。

【コマンドレット】

Expand-Archive

【オプション】

パターン1
-Path                      <圧縮ファイルのパス>
-DestinationPath      <解凍先ファイルパス>
-Force
-Confirm
-WhatIf

パターン2
-DestinationPath      <解凍先ファイルパス>
-LiteralPath              <圧縮ファイルの(リテラル)パス>
-Force
-Confirm
-WhatIf

【入力】

System.String

【出力】

System.IO.FileInfo
System.IO.DirectoryInfo
-> (5.1 以降) なし

【エイリアス】

なし

 ファイルを解凍する

さっそく ZIP 圧縮されたファイルを解凍してみましょう。

コマンドレットの使い方は、

Expand-Archive -Path <圧縮ファイルパス> -DestinationPath <ファイル解凍先フォルダ>

というように ”-Path” オプションで圧縮されたファイル名を指定し ”-DestinationPath” オプションで圧縮ファイルの解凍先を指定します。

PS C:\work> #圧縮元のファイル
PS C:\work> Get-ChildItem


    ディレクトリ: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2016/11/16     19:26            116 Test.zip


PS C:\work> #圧縮ファイルの解凍
PS C:\work> Expand-Archive -Path .\Test.zip -DestinationPath .\exp
PS C:\work>
PS C:\work> #圧縮の確認
PS C:\work> Get-ChildItem

    ディレクトリ: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2016/11/16     20:15                exp
-a----       2016/11/16     19:26            116 Test.zip

PS C:\work> Get-ChildItem -Path .\exp

    ディレクトリ: C:\work\exp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2016/11/16     19:26              0 File1.txt

このように解凍したい圧縮ファイルと解凍先のフォルダ名を指定するだけで簡単に解凍することができます。

解凍先フォルダを指定せず解凍したら。。。

最初に実行したときは ”-DestinationPath” オプションで出力先を指定していました。

実際に解凍されたファイルは出力先フォルダに格納されていましたね。

では、”-DestinationPath” オプションを指定しない場合はどうなるのでしょうか。

PS C:\work> #圧縮元のファイル
PS C:\work> Get-ChildItem


    ディレクトリ: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2016/11/16     19:26            116 Test.zip


PS C:\work># 出力先を指定せずに解凍
PS C:\work> Expand-Archive -Path .\Test.zip 
PS C:\work>
PS C:\work> #圧縮の確認
PS C:\work> Get-ChildItem

    ディレクトリ: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2016/11/16     20:31                Test
-a----       2016/11/16     19:26            116 Test.zip

PS C:\work> Get-ChildItem -Path .\Test

    ディレクトリ: C:\work\Test


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2016/11/16     19:26              0 File1.txt

実行結果を見てみると圧縮ファイル名と同名のフォルダが作成され、その中に解凍されたファイルが格納されています。

動き的にはエクスプローラで[右クリック]-[すべて展開(T)…]から展開した時と同じですね。

解凍先の同名ファイルを上書きする

”File1.txt” というテキストファイルが ”Test.zip” として圧縮されていた場合”exp”フォルダに解凍するには以下のコマンドを使うと説明しました。

 Expand-Archive -Path .\Test.zip -DestinationPath .\exp

では、もし ”exp” フォルダに既に”File1.txt”が存在していたらどうなるでしょうか。

実際にやってみると、

PS C:\work> Expand-Archive -Path .\Test.zip -DestinationPath .\exp
PS C:\work>
PS C:\work>
PS C:\work> Get-ChildItem


    ディレクトリ: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2016/11/16     20:01                exp
-a----       2016/11/16     19:26            116 Test.zip


PS C:\work> #もう1度解凍してみる
PS C:\work> Expand-Archive -Path .\Test.zip -DestinationPath .\exp
ExpandArchiveHelper : ファイル 'C:\work\exp\File1.txt' は既に存在するため、アーカイブ ファイル 'C:\work\Test.zip' の展開中にファイル 'C:\work\exp\File1.txt' を作成できませんでした。
アーカイブ ファイルを展開する際に、既存のディレクトリ 'C:\work\exp\File1.txt' の内容を上書きする場合は、-Force パラメーターを使用してください。
At C:\windows\system32\windowspowershell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:394 char:17
+ ...             ExpandArchiveHelper $resolvedSourcePaths $resolvedDestina ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (C:\work\exp\File1.txt:String) [Write-Error], IOException
    + FullyQualifiedErrorId : ExpandArchiveFileExists,ExpandArchiveHelper

という具合にエラーが返ってきます。

”ファイル ’○○’ は既に存在するため、アーカイブ ファイル ‘△△.zip’ の展開中にファイル ‘○○’ を作成できませんでした。”

では、どうすればよいのかというとエラー文の中に対処法が丁寧に説明がしてあります。

アーカイブ ファイルを展開する際に、既存のディレクトリ ‘○○’ の内容を上書きする場合は、-Force パラメーターを使用してください。

強制するという ”-Force” オプションをつけることで解決できるようです。

実際に試してみると、

PS C:\work> Expand-Archive -Path .\Test.zip -DestinationPath .\exp
PS C:\work>
PS C:\work>
PS C:\work> Get-ChildItem


    ディレクトリ: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2016/11/16     20:01                exp
-a----       2016/11/16     19:26            116 Test.zip

PS C:\work> #もう1度解凍してみる(-Forceもつける!)
PS C:\work> Expand-Archive -Path .\Test.zip -DestinationPath .\exp -Force
PS C:\work>
PS C:\work> Get-ChildItem


    ディレクトリ: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2016/11/16     20:01                exp
-a----       2016/11/16     19:26            116 Test.zip

とエラーは発生せず無事実行できました。

デフォルトで「上書きしますか?(Yes/No)」の確認をしてくれればいいのに…とは思いますが 笑
“Confirm” オプションをつけなければ確認はしてくれないそうです。

ファイル名の重複でエラーを出したくない場合は ”-Force” オプションを付けた方がよさそうですね。

”-LiteralPath” オプションでパスを指定する

解凍する圧縮ファイルの指定方法は ”-Path” オプションともう1つ ”-LiteralPath ”があります。

-LiteralPath” オプションを使用する場合には、リテラルパスでファイルパスを指定します。

リテラルパスとは…?

リテラルパスが使えます!と言いつつリテラルパスとは何かよくわかっていないので調べてみました。

-LiteralPath

Specifies the path to an archive file. Unlike the Path parameter, the value of LiteralPath is used exactly as it is typed. Wildcard characters are not supported. If the path includes escape characters, enclose each escape character in single quotation marks, to instruct Windows PowerShell not to interpret any characters as escape sequences.

Expand-Archive-Microsoft Developer Network/© 2017 Microsoft

要点をまとめると

  • Path パラメータとは異なり、LiteralPath の値は入力されたとおりに使用される
  • ワイルドカード文字はサポートされない
  • 各エスケープ文字は一重引用符で囲んでエスケープシーケンスとして解釈しないようにする

ということらしいです。

「リテラル(literal)」には「文字どおり」「ありのまま」といった意味があるので、読んで字のごとく「文字どおり」のパス名を指定するときに使うようですね。

エスケープシーケンスでは一重引用符、つまりシングルクォーテーション(‘)を使うというのはリテラルパスに限った話ではないので特に気にしなくてよいでしょう。

リテラルパスではワイルドカードが使えない

ワイルドカードが使えないということなので試してみましょう。

解凍に使うファイルは以下の通りです。

PS C:\work> Get-ChildItem


    ディレクトリ: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2016/11/16      19:26            116 Test1.zip

では、”-Path” と ”-LiteralPath” を比較してみます。

“-Path” オプションの場合、

PS C:\work> Expand-Archive -Path .\Test*.zip
PS C:\work>
PS C:\work> Get-ChildItem


    Directory: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2016/11/16     20:51                Test1
-a----       2016/11/16     19:26            116 Test1.zip

と問題なく使えました。

”-LiteralPath” の場合、

PS C:\work> Expand-Archive -LiteralPath .\Test*.zip
Expand-Archive : パス '' が存在しないか、または有効なファイル システム パスではありません。
At line:1 char:1
+ Expand-Archive -LiteralPath .\Test*.zip
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:String) [Expand-Archive], IOException
    + FullyQualifiedErrorId : PathNotFound,Expand-Archive

PS C:\work> Get-ChildItem


    Directory: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2016/11/16     19:26            116 Test1.zip

と説明通り”*”(ワイルドカード)部分をうまく読み取れずエラーになりました。

「リテラル(ありのまま)」なパスを指定しなければならないので、ワイルドカードは使わずに正確なファイルパスを指定することが必要です。

PS C:\work> Expand-Archive -LiteralPath  .\Test1.zip
PS C:\work>
PS C:\work> Get-ChildItem


    Directory: C:\work


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2016/11/16     20:51                Test1
-a----       2016/11/16     19:26            116 Test1.zip

(リテラルパスの使い方は分かりましたが、使い所や使い分けはよくわかりません…)

まとめ

圧縮されたファイルを解凍したい場合は

Expand-Archive -Path <圧縮ファイル> -Destination <解凍先>

を使用する。

解凍したファイルで上書きするには、

-Force

リテラルパス (LiteralPath) を使用する場合は、

  • ワイルドカードは使わない
  • 正確なファイルパスを指定する

ことにに注意する。

3 COMMENTS

匿名

当時がどうだったかわかりませんが、最新バージョンだと出力はないようです。

返信する

コメントを残す

メールアドレスが公開されることはありません。