Powershell 当您不使用';你不能使用分机吗?
在Powershell v6中,拆分路径具有Powershell 当您不使用';你不能使用分机吗?,powershell,split,powershell-3.0,powershell-v6.0,Powershell,Split,Powershell 3.0,Powershell V6.0,在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
-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()
当-Extension
不可用时,如上所示的选择对象是否是一个可行的解决方案?使用路径字符串作为输入,一个简洁高效的PowerShell本机解决方案是使用
要使用以下命令提取扩展名:
注意:只有当文件路径具有扩展名时,此解决方案才能可靠地工作
或者,直接使用.NET framework,如下所示:
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
以上是“Get Item
suggestion”的一个更快、更灵活的替代方案,正如Theo所指出的,它要求文件存在:
如上所示,选择对象
,当-扩展
不可用时,是可行的解决方案吗
是的,确实如此,但它冗长而缓慢(尽管在这种情况下性能可能并不重要),因为与使用包含运算符的表达式相比,使用管道和cmdlet总是会带来开销
LotPings指出,简单地用[-1]
索引到.Split()
调用的结果中以提取最后一个标记,不仅更加简洁,而且速度更快
也可以考虑使用PuthS壳的<代码> -SPLIG/<代码>运算符,而不是<代码> [String ] < /Cord>类型<代码> .SPLIT()/Case>方法:
PS> '.' + ("R:\Work\cover.letter_resume_base.odt" -split '\.')[-1]
.odt
至于是否将首字母
保留为扩展的一部分:
无论哪种方式,只要在合成文件名时确保
存在,都可以工作,但保留
有两个优点:
- 查看该值可以明显看出您正在处理一个扩展
- 您可以直接将该值附加到文件的基本名称(例如,
$baseName+$ext
),这也适用于没有扩展名的情况(如果$ext
恰好包含空字符串)
使用路径字符串作为输入,一个简洁而高效的PowerShell本机解决方案是使用
要使用以下命令提取扩展名:
注意:只有当文件路径具有扩展名时,此解决方案才能可靠地工作
或者,直接使用.NET framework,如下所示:
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
以上是“Get Item
suggestion”的一个更快、更灵活的替代方案,正如Theo所指出的,它要求文件存在:
如上所示,选择对象
,当-扩展
不可用时,是可行的解决方案吗
是的,确实如此,但它冗长而缓慢(尽管在这种情况下性能可能并不重要),因为与使用包含运算符的表达式相比,使用管道和cmdlet总是会带来开销
LotPings指出,简单地用[-1]
索引到.Split()
调用的结果中以提取最后一个标记,不仅更加简洁,而且速度更快
也可以考虑使用PuthS壳的<代码> -SPLIG/<代码>运算符,而不是<代码> [String ] < /Cord>类型<代码> .SPLIT()/Case>方法:
PS> '.' + ("R:\Work\cover.letter_resume_base.odt" -split '\.')[-1]
.odt
至于是否将首字母
保留为扩展的一部分:
无论哪种方式,只要在合成文件名时确保
存在,都可以工作,但保留
有两个优点:
- 查看该值可以明显看出您正在处理一个扩展
- 您可以直接将该值附加到文件的基本名称(例如,
$baseName+$ext
),这也适用于没有扩展名的情况(如果$ext
恰好包含空字符串)
如果您只需要数组中的最后一项,则更快更干净的方法是$array[-1]
来访问数组中的最后一项。//如果您只需要fileinfo对象的扩展名,请使用$FileInfoItem.extension.Trim('.')
///如果您只需要文件名字符串的扩展名部分,请使用$FullFileNameString.Split('.)[-1]
///以上所有操作都会产生Ext
。应该更简单:$fileExtension=(Get Item$pathToResume)。Extension
不,只是一个额外的管道,为了获取数组的最后一个元素,这也更简单:$fileExtension=“R:\Work\cover.letter\u resume\u base.odt”。Split('..)[-1]
@nsonline-在本例中,Select对象的问题是双重的。[1] 它需要通过管道发送东西。。。这是不必要的缓慢。对这样的人来说不算太多,但它增加了。。。而且效率很低。[2] 该cmdlet功能强大且非常通用。。。这意味着它所做的工作比显而易见的要多得多。我展示的解决方案更简单、键入时间更短、速度更快。或者使用.Net$extension=[System.IO.Path]::GetExtension($pathToResume)
。还保留点,但与Get Item
不同,路径不需要存在。如果只需要数组中的最后一项,则更快更干净的方法是$array[-1]
来访问数组中的最后一项。//如果您只需要fileinfo对象的扩展,请使用$FileInfoI