Bar

PowerShell 角括弧[] が含まれたファイル名をリネームする場合は-LiteralPath パラメータが必要

ファイル サーバー上のフォルダー名やファイル名に決める際、命名規則はありますか?
自宅のWindows Server 2012 R2 Essentials では、ほとんど[xxxx] xxxxxxの形式にしています。
つい先日まで知らなかった事の一つに、ファイル名に角括弧(bracket)を付けてPowerShell の Rename-Itemを使うとエラーになる事を今頃知りました。
今回は、PowerShell を使って角括弧[] が含まれたファイル名をリネームする方法をメモ。

角括弧[]が含まれたファイル名は要注意

Rename-Item コマンドレットと-reploace 演算子を組み合わせたよくあるリネーム処理ですが、角括弧が含まれた場合は(私的には)予想外のエラーが出力されました。
なぜエラーなんだ?と困惑・・・

肝は-LiteralPath パラメータ

インターネットで調べてみると同じ問題に直面している方が多い事を知りました。
原因は角括弧がワイルドカードの一つだったから、でワイルドカードを展開しないようにすれば解決できる事も分かりました。
PowerShell v2の場合
Windows 7などPowerShell v2の環境ではRename-Item コマンドレットに-LiteralPath パラメーターがないため、-LiteralPath パラメーターがあるMove-Item コマンドレットを使います。
gci * -Include "*aaa*" | %{
    Move-Item -LiteralPath $_ -Destination ($_.Name -replace 'aaa', 'bbb')
}
PowerShell v3以降の場合
Windows 8.1/10などPowerShell v3以上の環境ではRename-Item コマンドレットに -LiteralPath パラメータがあります。こっちの方が自然ですよね。
gci * -Include "*aaa*" | %{
    Rename-Item -LiteralPath $_ -NewName ($_.Name -replace 'aaa', 'bbb')
}

ワイルドカードを展開しない -LiteralPath パラメーターとは?

PowerShell の特別な文字であるワイルドカードには、
  • アスタリスク *
  • クエスチョン ?
  • 角括弧(bracket) []
があり、今回の記事で取り上げた角括弧は正規表現で使う事が分かりました。
Supporting Wildcard Characters in Cmdlet Parameters

例えば、とあるフォルダーに3個のテキスト ファイルがあったとします。

何も考えずに[ad] bc.txtのみ抽出しようとすると予想外のファイルが抽出されました。
これは角括弧の部分が正規表現として処理されたためです。

正規表現として処理させたくない場合は、-literalPath パラメータを使う事で予想どおりの結果となりました。

これ、基本中の基本なんでしょうねー。
精進精進・・・