这可能很奇怪,但请留在我身边。 我想只将管道结果的最后一个元素分配给变量。 我知道如何在“常规”代码中执行此操作,但由于这必须是一行代码。
更具体地说,我对从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]}
也就是说,遍历所有,但只取出我正在看的元素是输入数组的最后一个元素。
我错过了什么?
答案 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
属性似乎已包含文件名的扩展名。