Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get last element of pipeline in powershell

This might be weird, but stay with me. I want to get only the last element of a piped result to be assigned to a varaiable. I know how I would do this in "regular" code of course, but since this must be a one-liner.

More specifically, I'm interested in getting the file extension when getting the result from an FTP request ListDirectoryDetails.

Since this is done within a string expansion, I can't figure out the proper code.

Currently I'm getting the last 3 hars, but that is real nasty.

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
}

My idea was doing something similar to

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

that is, iterate over all, but only take out where the element I'm looking at is the last one of the input-array.

What am I missing ?

like image 836
dozacinc Avatar asked Dec 28 '10 13:12

dozacinc


People also ask

What does $_ do in PowerShell?

The “$_” is said to be the pipeline variable in PowerShell. The “$_” variable is an alias to PowerShell's automatic variable named “$PSItem“. It has multiple use cases such as filtering an item or referring to any specific object.

What is InputObject in PowerShell?

InputObject is a generic name used for a parameter that takes pipeline input. It's part of internal PowerShell naming convention and there is nothing special about it.

Can you grep in PowerShell?

PowerShell grep – Can I grep in PowerShell? Grep is used in Linux to search for regular expressions in text strings and files. There's no grep cmdlet in PowerShell, but the Select-String cmdlet can be used to achieve the same results. The Windows command line has the findstr command, a grep equivalent for Windows.

What is @() in PowerShell?

What is @() in PowerShell Script? In PowerShell, the array subexpression operator “@()” is used to create an array. To do that, the array sub-expression operator takes the statements within the parentheses and produces the array of objects depending upon the statements specified in it.


2 Answers

A few ways to do this:

$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('.')
like image 150
Roman Kuzmin Avatar answered Sep 25 '22 23:09

Roman Kuzmin


In general, getting the last element in the pipeline would be done using Select -Last 1 as Roman suggests above. However, an alternate and easier way to do this if the input is a simple array is to use array slicing e.g.:

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

Was your intent to get the file's extension or basename? Because it seems that the Type property already contains the extension for the filename.

like image 28
Keith Hill Avatar answered Sep 24 '22 23:09

Keith Hill