自宅のWindows Server 2012 R2 Essentials では、ほとんど[xxxx] xxxxxxの形式にしています。
つい先日まで知らなかった事の一つに、ファイル名に角括弧(bracket)を付けてPowerShell の Rename-Itemを使うとエラーになる事を今頃知りました。
今回は、PowerShell を使って角括弧[] が含まれたファイル名をリネームする方法をメモ。
角括弧[]が含まれたファイル名は要注意
Rename-Item コマンドレットと-reploace 演算子を組み合わせたよくあるリネーム処理ですが、角括弧が含まれた場合は(私的には)予想外のエラーが出力されました。
なぜエラーなんだ?と困惑・・・
なぜエラーなんだ?と困惑・・・
肝は-LiteralPath パラメータ
インターネットで調べてみると同じ問題に直面している方が多い事を知りました。原因は角括弧がワイルドカードの一つだったから、でワイルドカードを展開しないようにすれば解決できる事も分かりました。
- Windows PowerShell Tip of the Week
- Add-Contentコマンドレットの-literalPathパラメータ | PowerShell from Japan!! Blog
- ファイル名に角括弧[]がついてるとRename-Itemで失敗する - programming logbook
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 の特別な文字であるワイルドカードには、
Supporting Wildcard Characters in Cmdlet Parameters- アスタリスク *
- クエスチョン ?
- 角括弧(bracket) []
があり、今回の記事で取り上げた角括弧は正規表現で使う事が分かりました。
例えば、とあるフォルダーに3個のテキスト ファイルがあったとします。
何も考えずに[ad] bc.txtのみ抽出しようとすると予想外のファイルが抽出されました。
これは角括弧の部分が正規表現として処理されたためです。
正規表現として処理させたくない場合は、-literalPath パラメータを使う事で予想どおりの結果となりました。
これ、基本中の基本なんでしょうねー。
精進精進・・・