Select 第二个或第三个对象/元素

Select second or third object / element

我想 select 我的 PowerShell 脚本中 Get-ChildItem 语句的 second/third/forth 对象。这给了我第一个:

$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

我想要第二个,或者第三个,或者第四个。 (不是前两个等等)。

有办法吗?

对于select第n个元素跳过前n-1个元素:

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

或select前n个和最后一个元素:

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

但是请注意,如果输入的元素少于 n 个,这两种方法将产生不同的结果。在这种情况下,第一种方法将 return $null,而第二种方法将 return 最后一个可用元素。根据您的要求,您可能需要选择其中之一。

@AnsgarWiechers 建议的第二种方法可以很容易地变成一个简单的可重用函数,如下所示:

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

第一项

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和p之间的项目

$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 
}

注意:前七行是空行和描述行。

您还可以使用索引 n-1 将元素作为数组项进行访问。这似乎比链接管道更简洁。

$third = (Get-ChildItem -Path $dir | Sort-Object CreationTime -Descending)[2]