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...
問題点
スクリプト
<#
# 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
使い方
-Recurse…ディレクトリを再帰的に検索します
コメント