カレントフォルダのファイルの拡張子を小文字に変換するコード。
素直な記述
Get-ChildItem -File |
% { Rename-Item $_.Name ([regex]"\.\w+`$").Replace($_.Name, { $args[0].Value.ToLower() }) }
簡略化を試みた記述
ls -File | ren -n { ([regex]"\.\w+$").Replace($_, { $args[0].Value.ToLower() }) }
-
renはRename-Itemコマンドレットの別名、-nは-NewNameパラメータの簡略表現。 - 素直な記述だと
$_.Nameが二箇所に記述されてしまう。冗長な記述を避けるためにスクリプトブロックパラメータを使用。 - スクリプトブロックの戻り値がリネーム後のファイル名になる。
- キャプチャした文字列は
$args[0].Groups[n].Valueで取得する。今回は未使用。 -
ls -fと書きたかったけど、パラメータ名fは曖昧だという指摘を受ける。やむをえずフルネームで記述。 - 簡略化を試みた記述で一番不安なのが、
Regex.Replaceメソッドの第一引数にFileInfoオブジェクトを渡しているところ。FileInfoオブジェクトをString型に変換するとファイル名になるけど、はたして別の環境でも同じように変換してくれるか。
[2016/06/01追記]
- パラメータにもエイリアスが存在している。PowerShellで
help ls -fullを実行することにより、lsコマンドのパラメータのエイリアスを知ることができる。-Fileパラメータのエイリアスは-afなので、簡略化を試みた記述は更に短くできる。
ls -af | ren -n { ([regex]"\.\w+$").Replace($_, { $args[0].Value.ToLower() }) }