読者です 読者をやめる 読者になる 読者になる

tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShell v5 の新機能紹介 - Zipファイルの操作が可能に

PowerShell

今回も前回に続き PowerShell v5 をコアとする Windows Management Framework 5.0 Preview September 2014 (v5.0) の機能詳細を触りつつ、何が変わるのかお伝えできればと思います。

  • Manage .ZIP files with new cmdlets

つまり、 Zip ファイルが標準で扱えるようになります。Windows ようやくここまで来たか感ですね。

  • 過去の記事はこちら。

目次

Cmdlet

対象のCmdlet は2つです。

CommandType Name             Version Source                      
----------- ----             ------- ------                      
Function    Compress-Archive 1.0.0.0 Microsoft.PowerShell.Archive
Function    Expand-Archive   1.0.0.0 Microsoft.PowerShell.Archive

Compress-Archive

圧縮を行います。

NAME
    Compress-Archive
    
SYNOPSIS
    The Compress-Archive cmdlet can be used to zip/compress one or more files/directories.
    
SYNTAX
    Compress-Archive [-Path] <String[]> [-DestinationPath] <String> [-CompressionLevel <String>] [-Update] [-WhatIf] [-
    Confirm] [<CommonParameters>]
    
    Compress-Archive -LiteralPath <String[]> [-DestinationPath] <String> [-CompressionLevel <String>] [-Update] [-WhatI
    f] [-Confirm] [<CommonParameters>]
    
    
DESCRIPTION
    

PARAMETERS
    -Path <String[]>
        
        Required?                    true
        Position?                    1
        Default value                
        Accept pipeline input?       true (ByValue, ByPropertyName)
        Accept wildcard characters?  false
        
    -LiteralPath <String[]>
        
        Required?                    true
        Position?                    named
        Default value                
        Accept pipeline input?       true (ByPropertyName)
        Accept wildcard characters?  false
        
    -DestinationPath <String>
        
        Required?                    true
        Position?                    2
        Default value                
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -CompressionLevel <String>
        
        Required?                    false
        Position?                    named
        Default value                Optimal
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -Update [<SwitchParameter>]
        
        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -WhatIf [<SwitchParameter>]
        
        Required?                    false
        Position?                    named
        Default value                
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -Confirm [<SwitchParameter>]
        
        Required?                    false
        Position?                    named
        Default value                
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    <CommonParameters>
        This cmdlet supports the common parameters: Verbose, Debug,
        ErrorAction, ErrorVariable, WarningAction, WarningVariable,
        OutBuffer, PipelineVariable, and OutVariable. For more information, see 
        about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216). 
    
INPUTS
    
OUTPUTS
    
    
RELATED LINKS
ファイル圧縮

例えば、 D:\hoge.log を d:\hoge.zip に圧縮したいなら?

Compress-Archive -Path D:\hoge.log -DestinationPath d:\hoge.zip

生成されました。

    Directory: D:\


Mode          LastWriteTime Length Name    
----          ------------- ------ ----    
-a---- 2014/09/08      5:10 213260 hoge.zip

中身を見てみましょう。

f:id:guitarrapc_tech:20140908051332p:plain

フォルダ圧縮

フォルダの圧縮を行ってみましょう。

例えば、 D:\Github\valentia\Valentai を d:\valentia.zip に圧縮してみましょう。

こんな構造です。

f:id:guitarrapc_tech:20140908051616p:plain

実行してみましょう。ファイルと変わりません。判定は自動的に行ってくれます。

Compress-Archive -Path D&#58;\GitHub\valentia\valentia -DestinationPath D&#58;\valentia.zip

サイズがそれなりだったので、実行するとプログレスバーが出ました。

f:id:guitarrapc_tech:20140908051739p:plain

生成されたzip を見てみると、指定したパスの構造そのままにできている?

f:id:guitarrapc_tech:20140908051811p:plain

と思いきや、Lhaz など 3rdパーティソフトで見ると、フォルダがファイルになっていたりして構造が壊れています。

f:id:guitarrapc_tech:20140908052015p:plain

一方で、Windows 標準のExplorer なら平気です。

f:id:guitarrapc_tech:20140908061922p:plain

んー、微妙なので Connect にはあげませんでしたが、どうしたものか。

条件は容易で、「ファイルを含まないフォルダが存在していると、ルートのフォルダがファイルに変わります。」

再現コードです。

# Reproduce
mkdir d:\hoge\hoge\1\2\3\4
mkdir d:\hoge\hoge\1\2\3\5
New-Item d:\hoge\hoge\log.log
New-Item d:\hoge\hoge\1\2\3\3.log
New-Item d:\hoge\hoge\1\2\3\4\4.log
Compress-Archive d:\hoge\hoge -DestinationPath d:\hoge.zip

基本的に、 Windows 標準のExplorer は逆に他で利用できない Zip を生成するので、 Lhaz や WinRAR などはその辺安定しているので微妙ですね。

解凍

解凍も簡単です。Expand-Archive使います。

Compress-Archive に対して、Expland-Archive はうまく解凍してくれるのですばらです。

例えば、c:\に解凍するならこうです。

Expand-Archive -Path d&#58;\valentia.zip -DestinationPath c&#58;\

f:id:guitarrapc_tech:20140908061847p:plain

Zipへのアイテム追加

Compress-Archive には、 Update スイッチがあります。

これを使うことで、既存の zipにアイテムを追加可能です。

例えば、 d:\valentia.zip に、 d:\Github\DayBreakJP フォルダを追加するならこうです。

Compress-Archive -Path D&#58;\GitHub\DayBreakJP -DestinationPath D&#58;\valentia.zip -Update

うまく追加されていますね!

f:id:guitarrapc_tech:20140908062204p:plain

まとめ

Zipの処理には、 DSC の Archive リソースという手段もありましたが、Cmdletでできるのはうれしいですね!