在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
恰好包含空字符串)。