■ JPEG更新日時一括変更ツールを作る #2

JPEGファイルのファイル名先頭に "日時" を付加し、その日時でJPEGファイルの更新日時を変更させるツールを作成したい。
#1 からの続き

※本文中の "$" は半角で読み替えること。


引数の取得

引数で指定したJPEGファイル格納先パスを取得するには?
型は文字型、必須指定とし、格納先変数名は $inputDir とする。
これをPowerShellで書くと以下の記述になる。
Param([Parameter(mandatory=$true)][String]$inputDir)
引数を指定せずにスクリプトを実行すると、$inputDir の入力待ちとなる。
PS E:\EDU\PowerShell> ./changejpegdate.ps1

コマンド パイプライン位置 1 のコマンドレット ChangeJpegDate.ps1
次のパラメーターに値を指定してください:
inputDir:

引数で指定したディレクトリ内のファイル一覧を取得

ファイル一覧の取得は "Get-ChildItem" コマンドレットで行う。
対象のパスを指定するには "-Path" パラメータで指定する。パスは $inputDir に格納されているので "-Path $inputDir" で良いと思う。
サブディレクトリ配下も対象とするのであれば "-Recurse" パラメータを指定すれば良いが、今回は指定しない。

ということで、ここまでのスクリプトは以下の通り。
Param([Parameter(mandatory=$true)][String]$inputDir)

Get-ChildItem -Path $inputDir
無効なパスを指定した場合の対応は?
→ エラーとなるので、これで良しとする。
例:
PS E:\EDU\PowerShell> ./changejpegdate.ps1 D:\TEMP\SCA 
Get-ChildItem : パス 'D:\TEMP\SCA' が存在しないため検出できません。
発生場所 E:\EDU\PowerShell\ChangeJpegDate.ps1:3 文字:1
+ Get-ChildItem -Path $inputDir
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (D:\TEMP\SCA:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

対象ファイルのみ抽出する

(2020.09.17改版) 拡張子は "jpeg" または "jpg" どちらでも可能とするように修正
今回対象とするのは、ファイル名が "YYYYMMDD_HHMM_xxx.jpeg (または .jpg)" の形式となったファイルである。
この形式に沿ったファイルのみGet-ChildItemで抽出するように対応する。
まず、今回のファイル形式を正規表現で表すと "^\d{8}_\d{4}_[^.]*\.jpeg" "^\d{8}_\d{4}_[^.]*\.(jpeg|jpg)" である。
※ 参考:正規表現学習 #3:数字フォーマットで検索したい

Get-ChildItemの結果を元に Where-Object コマンドレットを使い 上記正規表現で絞り込みを行う。
Get-ChildItem -Path $inputDir | Where-Object {$_.Name -Match "^\d{8}_\d{4}_[^.]*\.(jpeg|jpg)"}
"$_" はパイプラインで渡されたオブジェクトを表す。

#3 へ続く。


自作プログラム, PowerShell
2020.09.17改版

0 件のコメント:

その他の記事