С путем string в качестве входных данных, кратким и производительным - хотя и немного неясным - родным решением PowerShell является использование
-replace
оператор для извлечения расширения с использованием regex :
PS> "R:\Work\cover.letter_resume_base.odt" -replace '^.+(\.[^.]+)$', '$1'
.odt
Примечание. Это решение работает надежно, только если путь к файлу имеет расширение.
В качестве альтернативы, используйте .NET Framework напрямую, как Theo предлагает:
PS> [IO.Path]::GetExtension("R:\Work\cover.letter_resume_base.odt")
.odt
Вы также можете привести к [System.IO.FileInfo]
и получить доступ к свойству .Extension
:
PS> ([IO.FileInfo] "R:\Work\cover.letter_resume_base.odt").Extension
.odt
Выше приведена более быстрая и более гибкая альтернатива LotPings 'Get-Item
, которая, как указывает Тео, требует, чтобы файл существовал :
# Works, but file must exist.
PS> (Get-Item "R:\Work\cover.letter_resume_base.odt").Extension
.odt
Является ли Select-Object
, как показано выше, жизнеспособным решением, когда -Extension
недоступен?
Да, это так, но это многословно и медленно (хотя производительность в данном случае может и не иметь значения), поскольку использование конвейера и командлетов неизменно приводит к накладным расходам по сравнению с использованием выражений с участием операторов .
LotPings отмечает, что простое индексирование с помощью [-1]
в результаты вызова .Split()
для извлечения последнего токена является одновременно более кратким и быстрым.
Также рассмотрим регулярно , используя оператор -split
PowerShell вместо .Split()
метода [string]
типа:
PS> '.' + ("R:\Work\cover.letter_resume_base.odt" -split '\.')[-1]
.odt
Что касается того, стоит ли сохранять начальный .
как часть расширения:
В любом случае, работает, если вы уверены, что .
присутствует, когда вы синтезируете имя файла, но сохранение .
имеет два преимущества:
рассмотрение значения делает очевидным, что вы имеете дело с расширением
вы можете напрямую добавить значение к базовому имени файла (например, g, $baseName + $ext
), что также работает в случае, когда расширение отсутствует (если $ext
содержит пустую строку).