在PowerShell中获取管道的最后一个元素

时间:2010-12-28 13:55:33

标签: powershell pipeline

这可能很奇怪,但请留在我身边。 我想只将管道结果的最后一个元素分配给变量。 我知道如何在“常规”代码中执行此操作,但由于这必须是一行代码。

更具体地说,我对从FTP请求ListDirectoryDetails获取结果时获取文件扩展名感兴趣。

由于这是在字符串扩展中完成的,我无法弄清楚正确的代码。

目前我已经获得了最后3个,但这真是令人讨厌。

New-Object PSObject -Property @{
LastWriteTime = [DateTime]::ParseExact($tempDate, "MMM dd HH:mm",[System.Globalization.CultureInfo]::InvariantCulture)
Type = $(if([int]$tempSize -eq 0) { "Directory" } else { $tempName.SubString($tempName.length-3,3) })
Name = $tempName
Size = [int]$tempSize
}

我的想法是做类似的事情

    $tempName.Split(".") | ? {$_ -eq $input[$input.Length-1]}

也就是说,遍历所有,但只取出我正在看的元素是输入数组的最后一个元素。

我错过了什么?

2 个答案:

答案 0 :(得分:20)

有几种方法可以做到这一点:

$name = 'c:\temp\aaa.bbb.ccc'

# way 1
$name.Split('.') | Select-Object -Last 1

# way 2
[System.IO.Path]::GetExtension($name)

# or if the dot is not needed
[System.IO.Path]::GetExtension($name).TrimStart('.')

答案 1 :(得分:9)

一般情况下,获取管道中的最后一个元素将使用Select -Last 1完成,如上面罗马建议的那样。但是,如果输入是一个简单的数组,另一种更简单的方法是使用数组切片,例如:

PS> $name = "c:\temp\aaa.bbb.txt"
PS> $name.Split('.')[-1]
txt

您打算获取文件的扩展名或基本名称吗?因为Type属性似乎已包含文件名的扩展名。