Получить последний элемент конвейера в powershell - PullRequest
10 голосов
/ 28 декабря 2010

Это может быть странно, но оставайся со мной. Я хочу получить только последний элемент конвейерного результата, который будет присвоен переменной. Я знаю, как бы это сделать в «обычном» коде, конечно, но так как это должно быть однострочно.

В частности, мне интересно получить расширение файла при получении результата от запроса 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]}

то есть перебираем все, но вынимаем только то, где элемент, на который я смотрю, является последним из входного массива.

Чего мне не хватает?

Ответы [ 2 ]

20 голосов
/ 28 декабря 2010

Несколько способов сделать это:

$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 голосов
/ 30 декабря 2010

Как правило, получение последнего элемента в конвейере будет выполняться с использованием Select -Last 1, как предлагает Роман выше. Тем не менее, альтернативный и более простой способ сделать это, если входные данные являются простым массивом, состоит в использовании нарезки массива, например ::10000

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

Было ли у вас намерение получить расширение или базовое имя файла? Потому что кажется, что свойство Type уже содержит расширение для имени файла.

...