LZHファイルを展開しZIPファイルに圧縮しなおすスクリプト

コンピュータ
今となっては懐かしさを感じるLZHですが、Windows10のエクスプローラでは開くことができなので、ZIPファイルに圧縮しなおすスクリプトを作ってみました。
LZHファイルを展開する為7zip.exeが必要になります。以下のサイトなどからダウンロードしてインストールしてください。
7-Zip Portable (file archiver) | PortableApps.com
7-Zip is a file archiver (compression) utility for Windows with a great array of features including: high compression ra...

問題点

Windows7で実行するとzipファイル内のファイル名が文字化けが発生します。

スクリプト

<#
# lzhファイルをzipファイルに変換する。
# 
# ファイル名:Conv-LZHtoZIP.ps1
# 
# 引数:
# SourcePath...変換元のLZHファイルまたはLZHファイルを含むディレクトリのパスを指定
# Recurse...-Recurseを選択すると$SourcePathディレクトリを再帰的に検索します
#
# 注意事項:
# 要7z.exe $sevenzip_exeを7z.exeのインストールディレクトリに変更してください。
#
# 変更:
# 20190523 初出
#>


param(
    [string]
    $SourcePath,
    [switch]
    $Recurse

)

$ErrorActionPreference = "stop"

# 7z.exeのインストールパス(要変更)
$sevenzip_exe = ((pwd).Drive.Name + ":\tools\7-ZipPortable\App\7-Zip64\7z.exe")


<#
# 重複しないファイル名を生成
#>
function Create-UniquePath
{
    param(
        [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
        [string]$BasePath
    )
    begin{}
    process
    {
        if (!(Test-Path -Path $BasePath)) {
            return $BasePath;
        }
        $f = Get-Item -Path $BasePath;
        $Result = $BasePath;
        for($i=1; (Test-Path -Path $Result); $i++) {
            $Result = $f.Directory.FullName + "\" + $f.BaseName + "(" + $i + ")" + $f.Extension;
        }
        return $Result;
    }
    end{}
}

<#
# LZHをZIPファイルに変換
#>
function Conv-LZHtoZIP
{
    param(
        [string]
        $lzh_path,
        [string]
        $zip_path
    )
    begin
    {
        #テンポラリフォルダを作成
        $tmp = New-TemporaryFile | %{ rm $_; mkdir $_ }
    }
    process
    {
        # ログパス
        $log_path = Get-Item $PSCommandPath | foreach { Join-Path $_.DirectoryName  ($_.BaseName + '.log')  }

        # 7z.exe実行
        & $sevenzip_exe x -o"$tmp" "$lzh_path"

        if ($? -eq $false) {
            "${lzh_path}を展開中にエラーが発生しました。" | Out-File $log_path -Append
        } else {
            try {
                Compress-Archive -Path ($tmp.FullName + "\*.*") -DestinationPath $zip_path
                rm $lzh_path
            } catch {
                "${zip_path}を出力中にエラーが発生しました。" + $_.Exception | Out-File $log_path -Append
            }
        }

    }
    end
    {
        #テンポラリフォルダの削除
        Remove-Item -Path $tmp -Recurse -Force;
    }
}

# 7zインストール確認
if (Test-Path -LiteralPath $sevenzip_exe) {
    # 
} else {
    echo "7z.exeが見つかりません。"
    exit
}
if (!($SourcePath) -Or !(Test-Path -LiteralPath $SourcePath)) {
    echo ($SourcePath+"ファイルが存在しない。");
    exit;
}
$s = Get-Item $SourcePath

if ($s.Attributes -match "Directory") {
    # ディレクトリモード
    if ($Recurse) {

        Get-ChildItem -LiteralPath $SourcePath -Filter "*.lzh" -Recurse | foreach {
            $ss = $_.FullName
            $dd = Create-UniquePath (Join-Path $_.DirectoryName ($_.BaseName + '.zip'))
            Conv-LZHtoZIP $ss $dd
        }
    } else {

        Get-ChildItem -LiteralPath $SourcePath -Filter "*.lzh" | foreach {
            $ss = $_.FullName
            $dd = Create-UniquePath (Join-Path $_.DirectoryName ($_.BaseName + '.zip'))
            Conv-LZHtoZIP $ss $dd
        }
    }
}else{
    # ファイルモード
    $d = Create-UniquePath (Join-Path $s.DirectoryName ($s.BaseName + '.zip'))
    Conv-LZHtoZIP $s $d
}



exit

使い方

-SourcePath…変換元のLZHファイルまたはLZHファイルを含むディレクトリのパスを指定
-Recurse…ディレクトリを再帰的に検索します

コメント