2010-12-28 9 views
8

Questo potrebbe essere strano, ma stai con me. Voglio ottenere solo l'ultimo elemento di un risultato in pipe da assegnare a un valore varaiable. So come farei questo nel codice "normale", naturalmente, ma poiché questo deve essere un unico elemento.Ottieni l'ultimo elemento della pipeline in PowerShell

In particolare, sono interessato a ottenere l'estensione del file quando si ottiene il risultato da una richiesta FTP ListDirectoryDetails.

Poiché ciò avviene all'interno di un'espansione di stringa, non riesco a capire il codice corretto.

Attualmente sto ricevendo gli ultimi 3 hars, ma questo è davvero brutto.

 
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
}

La mia idea stava facendo qualcosa di simile a

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

cioè iterare su tutti, ma solo prendere dove l'elemento che sto guardando è l'ultimo dei input-array.

Cosa mi manca?

risposta

16

A pochi modi per farlo:

$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

In generale, ottenendo l'ultimo elemento in cantiere sarebbe stato fatto utilizzando Select -Last 1 come suggerisce sopra romana. Tuttavia, un supplente e il modo più semplice per fare questo se l'ingresso è un array semplice è quello di utilizzare array di affettare es .:

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

è stata la sua intenzione di ottenere l'estensione o nome base del file? Perché sembra che la proprietà Type contenga già l'estensione per il nome file.

Problemi correlati