2015-08-05 3 views
3

Я хочу выбрать второй/третий/четвертый объект оператора Get-ChildItem в моем сценарии PowerShell. Это дает мне первый:выберите второй или третий объект/элемент

$first = Get-ChildItem -Path $dir | 
     Sort-Object CreationTime -Descending | 
     Select-Object -First 1 

Это дает мне первые три:

$latest = Get-ChildItem -Path $dir | 
      Sort-Object CreationTime -Descending | 
      Select-Object -First 3 

Я хотел бы получить второй, или третий, или четвертый. (НЕ первые два и т. Д.).

Есть ли способ?

ответ

6

Для выбора п-й элемент пропустить первые N-1 элементов:

$third = Get-ChildItem -Path $dir | 
     Sort-Object CreationTime -Descending | 
     Select-Object -Skip 2 | 
     Select-Object -First 1

или выбрать первый п, а затем из них последний элемент:

$third = Get-ChildItem -Path $dir | 
     Sort-Object CreationTime -Descending | 
     Select-Object -First 3 | Select-Object -Last 1

Осторожно, хотя , что два подхода приведут к разным результатам, если на входе меньше n элементов. Первый подход привел бы $null в этом сценарии, тогда как второй подход вернул бы последний доступный элемент. В зависимости от ваших требований вам может потребоваться выбрать тот или иной.

1

Второй подход, предложенный @AnsgarWiechers легко может быть превращен в простой многоразовый Funtion, например, так:

function Select-Nth { 
    param([int]$N) 

    $Input | Select-Object -First $N | Select-Object -Last 1 
} 

А потом

PS C:\> 1,2,3,4,5 |Select-Nth 3 
3 
0

Первый пункт

gci > out.txt 
Get-Content out.txt | Select -Index 7 | Format-list 

Второй пункт

gci > out.txt 
Get-Content out.txt | Select -Index 8 | Format-list 

Пункт между п и р

$n=3 
$p=7 
$count = 0 
$index = $n+7 
$p=7+7 
while($true){ 
    $index = $index + $count 
    Get-Content out.txt | Select -Index $index | Format-list 
    if($index -eq $p) 
    {  
     break; 
    } 
    $count = $count + 1 
} 

Примечание: Первые семь строк пустые и строки описания.