時々誤ってファイルにファイル拡張子を二重に追加してしまうユーザーがおり、PowerShell でこれをスクリプト化する方法を見つけようとしています。
たとえば、ユーザーがファイルに「document123.docx.docx」という名前を付けたが、マシン上でファイル拡張子の表示が無効になっているため、ファイル名は「document123.docx」であると想定します。これを簡単に識別できるように、二重に追加されたファイル拡張子を検索するにはどうすればよいでしょうか?
これは、正確なファイル名が「document123.docx」であると想定しているプログラム コードにのみ影響し、そのファイル名が存在しないため、続行できません。
答え1
同じ拡張子が重複したファイルを検索するには、次を試してください。
Get-ChildItem -Path .\* -Recurse -File |
Where-Object{$_.Extension -and $_.BaseName -like "*$($_.Extension)"}
二重の拡張機能を自動的に削除するには:
Get-ChildItem -Path .\* -Recurse -File |
Where-Object{$_.Extension -and $_.BaseName -like "*$($_.Extension)"}|
Rename-Item -NewName {$_.BaseName} -WhatIf
出力が問題なければ、末尾の-WhatIf
答え2
スクリプトは、チェックしたいフォルダー内にいる場合は正常に動作しますが、C:\ からチェックすると、C:\Windows 内のネストされたフォルダーにアクセスしたときに管理者として実行しても権限が足りないためエラーが発生して終了します。そのため、そのフォルダーを除外し、終了しないエラーを抑制するために、以下のようにサイレントに続行するオプションを追加しました。
Get-ChildItem -Path .\* -Recurse -File -Exclude "C:\Windows\" -EA SilentlyContinue|
Where-Object{$_.Extension -and $_.BaseName -like "*$($_.Extension)"}