Подходит ли использование Select-Object, когда у вас нет доступа к -Extension? - PullRequest
1 голос
/ 30 марта 2019

В Powershell v6 разделенный путь имеет параметр -Extension для доступа к расширению имени файла, например:

$pathToResume = "R:\Work\cover.letter_resume_base.odt"
$extension = Split-Path -Extension $pathtoResume
Write-Output $extension # Will print .odt

Однако Powershell 3 не предоставляет -Extensionпараметр, но я придумал это решение:

# Notice the period between cover and letter
$pathToResume = "R:\Work\cover.letter_resume_base.odt"
$pathToResumeLeaf = Split-Path -Leaf $pathToResume
$pathToResumeLeafArray = $pathToResumeLeaf.Split(".")

$fileExtension = $pathToResumeLeafArray | Select-Object -Last 1
Write-Output $fileExtension # Will print odt

Я все еще получаю расширение файла, но без точки.Независимо от того, сколько периодов содержится в имени файла или длине массива, я получу один и тот же вывод.

Я не могу вспомнить ни одной ситуации, когда требуется период.Если я хочу напечатать период с расширением, я могу легко добавить его, когда использую Write-Output или [string]::format()

Is Select-Object, как я показал выше жизнеспособное решение, когда -Extensionнедоступен?

1 Ответ

0 голосов
/ 31 марта 2019

С путем 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 содержит пустую строку).

...