2010-12-28 33 views
8

Esto podría ser extraño, pero quédate conmigo. Quiero obtener solo el último elemento de un resultado canalizado para ser asignado a un variable. Sé cómo haría esto en el código "normal", por supuesto, pero ya que esto debe ser de una sola línea.Obtener el último elemento de la tubería en powershell

Más específicamente, estoy interesado en obtener la extensión de archivo al obtener el resultado de una solicitud FTP ListDirectoryDetails.

Dado que esto se hace dentro de una extensión de cadena, no puedo encontrar el código correcto.

Actualmente recibo las últimas 3 hars, pero eso es muy desagradable.

 
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
}

Mi idea estaba haciendo algo similar a

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

que es, iterar sobre todo, pero sólo llevará a cabo en el elemento que estoy viendo es el último de la input-array.

¿Qué me estoy perdiendo?

Respuesta

16

Algunas maneras de hacer esto:

$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

En general, obteniendo el último elemento en la tubería se realizaron utilizando como Select -Last 1 romana sugiere arriba. Sin embargo, un suplente y más fácil de hacer esto si la entrada es una matriz simple es usar una matriz de rebanado ej .:

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

Fue su intención de obtener la extensión del archivo o nombre base? Porque parece que la propiedad Type ya contiene la extensión para el nombre de archivo.

Cuestiones relacionadas