カレントフォルダのファイルの拡張子を小文字に変換するコード。
素直な記述
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() }) }