配列で指定したパスの子フォルダをすべて圧縮する。

<#########################################################################
【子フォルダ圧縮スクリプト】
圧縮ソフトは WinRAR を使用
フォルダの絶対パスを指定する。
指定された絶対パス内のアイテムごとに圧縮する。

圧縮の詳細
 RAR書式
 リカバリーレコード 3%
 サブフォルダは含めない
 圧縮率は "最高圧縮"
#########################################################################>


# WinRARの初期設定
<#
WinRARコマンドラインパラメータ
 a 圧縮を行う。
 -ilog エラーログを$rarexeフォルダに出力する。
 -r- 再帰的なサブフォルダの圧縮を行わないようにする。
 -rr3% リカバリーレコードを3%に設定
 -m5 圧縮率を最高に設定
#>
$rarexe = "C:\Program Files\WinRAR\WinRAR.exe"
$rarparam = 'a -r- -ilog -rr3% -m5 {0}.rar {0}\*'



#外部圧縮プログラムを同期実行
function ArchiveExecute([string] $arcpath, [string] $argument) {
    #各パラメータをダブルクォーテーションで囲む
    #※2つ以上の引数を渡す場合は必ず実行する事
    $argument = $argument.Split(' ') | % { '"{0}"' -f $_ }
    $argument = [string]::Join(" ", $argument)

    #スクリプトの実行環境内のカレントパスを、
    #外部プログラムのカレントディレクトリとして設定する。
    $curdir = [System.Environment]::CurrentDirectory
    [System.Environment]::CurrentDirectory = (Get-Location).Path

    #外部プロセスの実行
    $proc = New-Object System.Diagnostics.Process
    $proc.StartInfo.FileName = $arcpath
    $proc.StartInfo.Arguments = $argument
    $proc.StartInfo.CreateNoWindow = $true
#    $proc.StartInfo.UseShellExecute = $false
    [void]$proc.Start()
    $proc.WaitForExit()
    #終了時のコードを出力する。(現状使い道なし)
#    $proc.ExitCode
    $proc.Close()
    
    #スクリプト実行パスに戻す。
    [System.Environment]::CurrentDirectory = $curdir
}

$target = 'C:\logs','D:\logs','E:\logs'
$target |
    % { dir $_ | % { $_.FullName } } |
    % { `
        // カレントディレクトリを変更(スクリプトの実行環境内のみ)
        cd $_; `
        dir $_ |
            #同期実行で圧縮
            % { ArchiveExecute $rarexe ($rarparam -f $_.Name) } `
            #非同期実行で圧縮
#            % { & $rarexe ($rarparam -f $_.Name).Split(' ') } `
    }