今回も前回の続きでファイルをZIP圧縮しますが対象はPowerShellです。UNIX系でのZIP圧縮・解凍は前回を参照してください。
PowerShellはWindows版以外にもインストールする事ができますので、今回はWindows版以外のPowerShellも対象です。

PowerShellでZIP圧縮する場合はCompress-Archiveコマンドレットを使います。人によっては、この時点でコマンド名が長くて心が折れそうな人もいるかもしれません。私もその1人。zip圧縮するだけなのに、なぜこんなにコマンド名が長いのか、急いで処理しないといけない場合に困るだろうと思うのですが、PowerShellは急がない用途向けなのかもしれません。と納得する理由をつけてコマンドを入力・・・するのはイマイチです。そんな場合はエイリアス機能を使えば多少なりとも回避できます。エイリアス機能はUNIX系のシェルでも使えるので、これについては最後に説明します。

・Compress-Archiveリファレンス
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/compress-archive

Compress-ArchiveでZIP圧縮する

 とりあえず前回と同じようにデスクトップのrainbowディレクトリ内にある画像ファイルを圧縮していきます。

PowerShellでZIP圧縮するにはCompress-Archiveの後にPathオプションを指定し、圧縮したいファイルやディレクトリ(フォルダ)を指定します。ファイル名やパス名を指定します。ZIP圧縮したファイルの保存先はDestinationPathオプションで指定します。
 以下のように入力するとデスクトップ上にあるrainbowディレクトリ一式が圧縮されます。圧縮されたZIPファイルはデスクトップにniji.zipという名前で生成されます。

Compress-Archive -Path ~/Desktop/rainbow -DestinationPath ~/Desktop/niji.zip

期待通りに圧縮されているかどうか確認してみます。解凍するとディレクトリ内にあるすべての画像ファイルが表示されます。ここらへん少しWindows 10とmacOSでは結果が異なりますが、いずれにせよ画像ファイルが解凍されています。

ZIP圧縮したファイルの保存先はDestinationPathオプションで指定しますが、指定がない場合はコマンドプロンプトで保存先のパス・ZIPファイル名を入力する状態になります。

Compress-Archive -Path ~/Desktop/rainbow

次に前回同様にすべてのファイルではなく特定の形式だけ圧縮してみます。まずはPNG形式の画像だけ圧縮します。以下のようにワイルドカードの*を使って*.pngと指定します。

Compress-Archive -Path ~/Desktop/rainbow/*.png -DestinationPath ~/Desktop/niji.zip

期待通りに指定したPNG形式の画像だけ圧縮されているかどうか確認してみます。解凍するとディレクトリ内にあるPNG形式の画像ファイルが表示されます。

次にPNG形式の画像とJPEG形式の画像をZIP圧縮してみます。UNIXのシェルのbashなら*.{png,jpg}と表記すればよいのですが、PowerShellのCompress-Archiveの場合は,で区切って列記してもうまくいかないようです。なるべく手軽に処理したいので、リストアップしたファイルをCompress-Archiveにパイプを使って渡すようにします。ここでUNIX系の人ならlsと入力してしまうところですが、ここはPowerShell。Get-Itemのエイリアスとして定義されているlsではうまくいきません(macOSでは日本語ファイル名があるとエラーがでたりする事があります)。ということで、ここは素直にGet-Itemを使って,を利用して複数の拡張子を持つファイルを指定します。つまり以下のように指定します。この場合、カレントディレクトリ(フォルダ)内にあるpngとjpgの拡張子を持つファイルが表示されます。

Get-Item *.png,*.jpg

あとはファイルをパイプを使ってCompress-Archiveに渡せば目的は達成されます。なお、以下のコマンドを実行する前にcd ~/Desktop/rainbowとしてカレントディレクトリをrainbowディレクトリにしておいてください。

Get-Item *.png,*.jpg | Compress-Archive -DestinationPath ~/Desktop/niji.zip

ZIP圧縮されたファイルを解凍すると、確かにPNG形式とJPEG形式のファイルが格納されています。

複数の形式のファイルをZIP圧縮する場合、別の方法もあります。それは、すでに存在しているZIPファイルに新たにファイルを追加していくというものです。新たにファイルを追加する場合、Compress-ArchiveのUpdateオプションを指定します。このオプションを指定すると、同じファイルがあり更新されていれば更新し、ファイルがなければ追加します。
まず、PNG形式の画像をZIP圧縮しておきます。圧縮後に解凍するとPNG形式だけしかないのがわかります。

Compress-Archive -Path ~/Desktop/rainbow/*.png -DestinationPath ~/Desktop/niji.zip

 次にJPEG形式のファイルを追加します。Updateオプションを忘れないようにしてください。

Compress-Archive -Path ~/Desktop/rainbow/*.jpg -Update -DestinationPath ~/Desktop/niji.zip

圧縮率を指定する

 zipコマンドでは圧縮率を指定できましたが、Compress-Archiveでも指定できます。ただし、細かい数値ではなく以下の3種類になります。

Fastest 高速圧縮
NoCompression   非圧縮
Optimal 最適な圧縮(デフォルト値)

圧縮率を指定するオプションはCompressionLevelです。CompressionLevelの後に上記の3つの文字列のうちいずれかを指定します。以下のように指定すると非圧縮のZIPファイルができあがります。

Compress-Archive -CompressionLevel NoCompression -Path ~/Desktop/rainbow -DestinationPath ~/Desktop/niji.zip

せっかくなのでrainbowディレクトリにある画像をすべて圧縮した場合のファイルサイズを以下に示します。FastestでもOptimalでも、あまり変わらないようですが、これは圧縮するファイルの形式にもよるかもしれません。

圧縮率指定 Windows10 macOS BigSur
Fastest 7943531 7943531
NoCompression 8497460 8496135
Optimal 7939106 7939106

ちなみに前回のmacOS (Big Sur)でのzipコマンドの圧縮結果は以下のようになってました。Compress-Archiveよりzipの方が小さいファイルサイズになっています。どちらを使うかは環境と好みということで。

非圧縮 8496567
標準圧縮 7931851
最高圧縮 7931612

ZIPファイルを解凍する

 今度はZIPファイルを解凍してみます。これはExpand-Archiveコマンドレットを使います。ここでは解凍先のディレクトリを作成しておき、そこに解凍したファイルを解凍することにします。解凍先のディレクトリはデスクトップにimagesとして用意します。

解凍するZIPファイルですが、先ほど圧縮したniji.zipの場合、以下のように指定します。PathオプションがZIPファイルの場所、DestinationPathが解凍先のディレクトリです。

Expand-Archive -Path ~/Desktop/niji.zip -DestinationPath ~/Desktop/images

解凍先のimagesフォルダの内容を確認すると図のようにrainbowディレクトリが作成され、その中に画像ファイルがあります。

ちなみに圧縮したディレクトリ名のままデスクトップに解凍するなら以下のようにします。

Expand-Archive -Path ~/Desktop/niji.zip -DestinationPath ~/Desktop/

ただ、すでに同じディレクトリがある場合に実行すると以下のようなエラーになってしまいます。

強制的に上書きして解凍する場合は以下のようにForceオプションを指定します。

Expand-Archive -Force -Path ~/Desktop/niji.zip -DestinationPath ~/Desktop/

エイリアスを定義する(PowerShell)

 入力補完機能があるにせよCompress-Archiveという長い文字を入力するのは面倒です。そんな時に便利なのがエイリアス。UNIX系のシェルにもありますが、PowerShellにも用意されています。この連載でもlsやcatなど多数のエイリアスを使ってきました。PowerShellでどのようなエイリアスが定義されているかはGet-Aliasと入力すれば表示されます。

パイプとmoreを使えばページ単位で確認していくこともできます。でもまあ、ターミナルのスクロールバーを操作して確認した方が楽でしょう。

 それでは長いCompress-Archiveを短いzipという名前でも使えるようにエイリアスを定義します。エイリアスを定義にするにはSet-Aliasコマンドレットを使います。これのエイリアスがsalとして定義されているのでsalと入力しても構いません。PowerShell作った人も、やっぱりコマンド名長いなと思ったのでしょう。
 Set-Aliasの後にnameオプションを指定します。その後にエイリアス名、今回はzipですが、これを指定します。その後にvalueオプションを指定し、Compress-Archiveを指定します。
 つまり以下のようにすればzipという名前でエイリアスが定義されます。

Set-Alias -name zip -value Compress-Archive

 本当に定義されたか確認するにはGet-Aliasの後に調べたいエイリアス名を指定します。以下のようにすればzipという名前のエイリアスが定義されているか確認できます。

Get-Alias zip

 指定したエイリアスが定義されていない場合はエラーが表示されます。gzipという名前のエイリアスは定義されていなかったのでエラーになります。

Get-Alias gzip

 zipが定義できたので早速使ってみましょう。Compress-Archiveの代わりにzipとするだけです。パラメーターは今回は定義していないので、そのまま指定するしかありません。

zip -Path ~/Desktop/rainbow -DestinationPath ~/Desktop/niji.zip

エイリアスを定義する(UNIX系)

 UNIX系のシェルでも同様にエイリアスを定義できます。定義されているエイリアスを調べるにはaliasとだけ入力します。

 エイリアスを定義する場合もaliasを使います。aliasの後に定義するエイリアス名を指定し=で区切ります。その後に定義するコマンドやパラメーターを指定します。デスクトップ上にあるrainbowディレクトリを圧縮するエイリアスの場合、以下のように定義できます。

alias niji='zip ~/Desktop/niji.zip *'

 aliasと入力すれば定義されたエイリアスを確認できます。

 定義してしまえばnijiと入力するだけでデスクトップ上にあるrainbowディレクトリが圧縮されます。

 よく使うコマンドは、どんどんエイリアスとして定義してしまえば仕事も早く終わるでしょう。まあ、エイリアスを定義したくらいで早く終わる仕事があればですが・・・

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。