2010-12-28 10 views
8

Dies könnte seltsam sein, aber bleib bei mir. Ich möchte nur das letzte Element eines Pipe-Ergebnisses erhalten, das einer Variable zugewiesen werden soll. Ich weiß natürlich, wie ich das im "normalen" Code machen würde, aber da muss das ein Einzeiler sein.Holen Sie das letzte Element der Pipeline in Powershell

Genauer gesagt, ich bin daran interessiert, die Dateierweiterung zu bekommen, wenn Sie das Ergebnis von einer FTP-Anfrage erhalten ListDirectoryDetails.

Da dies innerhalb einer String-Erweiterung erfolgt, kann ich den richtigen Code nicht herausfinden.

Momentan bekomme ich die letzten 3 hars, aber das ist echt eklig.

 
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
}

Meine Idee etwas tat, ähnlich wie

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

das heißt, laufen, sondern nur herausnehmen, wo das Element an suche ich die letzte der ist Eingabe-Array.

Was fehlt mir?

Antwort

16

ein paar Möglichkeiten, dies zu tun:

$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('.') 
9

Im Allgemeinen das letzte Element in der Pipeline bekommen würde durchgeführt unter Verwendung Select -Last 1 wie Roman oben vermuten lässt. Jedoch eine alternative und einfacher Weg, dies zu tun, wenn die Eingabe ein einfaches Array ist Array Slicing verwenden z.B .:

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

War Ihre Absicht die Dateierweiterung oder Basisnamen zu bekommen? Es scheint, dass die Eigenschaft Type bereits die Erweiterung für den Dateinamen enthält.

Verwandte Themen