命名って難しい

変数、関数、クラスなどなど実装より命名に毎回悩むタイプの人間による技術や趣味についてのメモ。

Powershellで古い形式のExcel(xls)を新しい形式(xlsx)に変換する。

概要

下記の記事で作ったものと似たものを簡潔に書いてみました。

notshown.hatenablog.jp

実装

ソースコード

$ErrorActionPreference = "Stop" # 例外が出たらその時点で即終了
$srcDir = (Resolve-Path $args[0]).Path
$dstDir = (Resolve-Path $args[1]).Path
try{
    
    # Excelオブジェクト作成
    $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $false
    $excel.DisplayAlerts = $false
    Get-ChildItem -Path $srcDir -Filter "*.xls" | % {
        $dstPath = Join-Path $dstDir $($_.BaseName + ".xlsx")
        if(-not (Test-Path -Path $dstPath)) {
            $book = $excel.Workbooks.Open($_.FullName)
            $book.SaveAs($dstPath, 51)
            $book.Close()
        }
        else {
        }
    }
} finally {
    $excel.Quit()
}

呼び出し方(Xls2Xlsx.ps1)

# 相対パス、絶対パス両方OKですが存在しないパスはできません。
Xls2Xlsx.ps1 .\dst .\src

今回試したこと

  • Try-Catch-Finally
  • Resolve-Pathによる相対パスの解決
  • Join-Pathによるパスの結合 (今まで[System.IO.Path]::Combineを呼んでいた…)
  • $ErrorActionPreference

感想

  • Resolve-Pathが存在しないパスだと例外出るので便利
  • PowerShellだとXlFileFormatに名前でアクセスできるから実装が楽で可読性も上がる
  • コマンド形式で書き直してみたい(そこらへん無知)

以上