当您无法访问 -Extension 时,使用 Select-Object 是否合适?



在Powershell v6中,拆分路径具有用于访问文件名扩展名的-Extension参数,例如:

$pathToResume = "R:Workcover.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:Workcover.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()时轻松添加它

当我上面显示的Select-Object不可用时-Extension是可行的解决方案吗?

使用路径字符串作为输入,简洁而高性能 - 虽然有点晦涩 - PowerShell 本机解决方案是使用-replace运算符使用
正则表达式提取扩展:

PS> "R:Workcover.letter_resume_base.odt" -replace '^.+(.[^.]+)$', '$1'
.odt

注意:仅当文件路径具有扩展名时,此解决方案才能可靠地工作。

或者,直接使用 .NET 框架,正如 Theo 建议的那样:

PS> [IO.Path]::GetExtension("R:Workcover.letter_resume_base.odt")
.odt

还可以强制转换为[System.IO.FileInfo]并访问.Extension属性:

PS> ([IO.FileInfo] "R:Workcover.letter_resume_base.odt").Extension
.odt

以上是 LotPingsGet-Item建议的更快、更灵活的替代方案,正如 Theo 指出的那样,它要求文件存在

# Works, but file must exist.
PS> (Get-Item "R:Workcover.letter_resume_base.odt").Extension
.odt

如上所示,Select-Object-Extension不可用时是否可行?

是的,确实如此,但它冗长且缓慢(尽管在这种情况下性能可能无关紧要),因为与使用涉及运算符表达式相比,使用管道cmdlet总是会带来开销。

LotPings指出,简单地将[-1]索引到.Split()调用的结果中以提取最后一个令牌既简洁又快速。

此外,请考虑定期使用 PowerShell 的-split运算符,而不是[string]类型的.Split()方法:

PS> '.' + ("R:Workcover.letter_resume_base.odt" -split '.')[-1]
.odt

至于是否保留初始.作为延期的一部分:

无论哪种方式,只要您在合成文件名时确保.存在,都可以工作,但保留.有两个优点:

  • 查看值可以明显看出您正在处理扩展

  • 您可以直接将值附加到文件的基本名称(例如,例如,$baseName + $ext),这也适用于没有扩展名的情况(如果$ext恰好包含空字符串)。

相关内容

  • 没有找到相关文章

最新更新