Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 当您不使用';你不能使用分机吗?_Powershell_Split_Powershell 3.0_Powershell V6.0 - Fatal编程技术网

Powershell 当您不使用';你不能使用分机吗?

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

在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()

-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