細かいところに手が届くWindowsPowershell。

その例として、「特定のフォルダにあるpngファイルをjpgにコンバートする」をメモします。

  • convert.ps1
# 変換対象のフォルダを指定
$folderPath = "C:\Users\hoge\fuga\photo"

# System.Drawing を使うためにアセンブリを読み込む
Add-Type -AssemblyName System.Drawing

# PNGファイルを取得
$pngFiles = Get-ChildItem -Path $folderPath -Filter *.png

foreach ($file in $pngFiles) {
    # 画像を読み込む
    $image = [System.Drawing.Image]::FromFile($file.FullName)

    # 出力ファイル名(拡張子を .jpg に変更)
    $jpgPath = [System.IO.Path]::ChangeExtension($file.FullName, "jpg")

    # JPEGエンコーダを取得
    $jpgEncoder = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | Where-Object { $_.MimeType -eq "image/jpeg" }

    # エンコードパラメータ(品質指定:90)
    $encoderParams = New-Object System.Drawing.Imaging.EncoderParameters(1)
    $qualityParam = New-Object System.Drawing.Imaging.EncoderParameter([System.Drawing.Imaging.Encoder]::Quality, 90L)
    $encoderParams.Param[0] = $qualityParam

    # JPGとして保存
    $image.Save($jpgPath, $jpgEncoder, $encoderParams)

    # メモリ解放
    $image.Dispose()
}

適当な手段で上記を作成し、このスクリプトをPowershellで走らせます。

  1. フォルダ内にある.pngを読み込みます。
  2. 解像度はそのまま、jpgに圧縮します。
  3. 変数で指定したフォルダに、名前をそのままにして出力します。

これはあくまでも「こういうことができた」という例なので、

  • ドラッグ&ドロップに対応
  • 出力先を別にする
  • 変換後のファイルに別の名前を付与する

など、調整のしがいがあります。