PowerShell外部コマンドを実行するサンプル3「フォルダ内のファイルを一括処理」

powershell コンピュータ
powershell

フォルダ内にあるPNGファイルに対しOptiPNGで最適化を施します。※1

ls -LiteralPath "C:\Users\karet\Pictures" -Filter "*.png" | % { . "C:\Users\karet\tools\optipng.exe" $_.FullName }
lsGet-ChildItemのAliasになります。lsで画像ファイルの一覧を取得しています。
フォルダを指定する場合-LiteralPathオプションを使います。
Powershellで見つけられないファイル名の謎【Conv-ZIPtoPDF.ps1修正】
はじめに ZIPファイルをPDFファイルに変換するスクリプトを実行していると、エクスプローラでは存在するファイルがPowershellで認識しないファイルがありました。 どうやら""を含むファイルが見つけられないようです。 ためしにファイル...

OptiPNGの対象はPNGファイルですので-Filterオプションで拡張子PNGのみをフィルタリングします。
%ForEach-ObjectのAliasになります。|のパイプラインで引き渡されたlsの結果に対し{}内の処理を繰り返します。
PowerShell の foreach (ForEach-Object) の使い方
PowerShell では foreach が 2 種類あります。それぞれ特徴があるので、使い分けと使い方について紹介します。

. "C:\Users\karet\tools\optipng.exe"は実行する外部コマンドoptipng.exeのパスを指定します。
$_.FullNameはlsの結果のFileSystemObjectのプロパティで完全パスがセットされています。こちらをoptipng.exeの引数として処理を実行しています。

optipng.exeのパスを指定する部分を別の外部コマンドへのパスに置き換えることでいろいろな処理に使える書式だと思います。

 

※1今回のサンプルの内容、OptiPNGでファイルを指定する引数がワイルドカードを受け入れ可能であれば(未確認)このような処理は必要ないです。実際このコマンドを利用したのは、Real-CUGANという高画質化AIツールで複数の画像ファイルを一括処理するためでした。pythonで書かれたツールなので、pythonのスクリプトに手を入れれば良いのですが(もしかすると一括処理機能があるかも。未確認)、せっかく正しく動くようセットアップしたツールが壊れることを恐れて、PowerShellから呼び出す今回の記事の方法で解決しました。

コメント