powershell - 为什么 select-object -first 1 不返回数组以保持一致性?
问题描述
当我将一些对象通过管道传递给select-object -first n
它时,它会返回一个数组,除非n
是 1:
PS C:\> (get-process | select-object -first 1).GetType().FullName
System.Diagnostics.Process
PS C:\> (get-process | select-object -first 2).GetType().FullName
System.Object[]
出于一致性原因,我希望两个管道都返回一个数组。
显然,PowerShell 选择将一个对象作为对象而不是作为数组中的元素返回。
这是为什么?
解决方案
为什么在这种情况下问题通常是不确定的,但它主要归结为:
- 由于我们要求“-first 1”,因此我们期望单个项目。
- 如果我们收到一个数组/列表,我们仍然需要索引第一个来获取那个,这几乎就是“Select-Object -First 1”的设计目的(在这种情况下)。
- 结果总是可以包装在@() 中以强制一个数组——也许在我们已经计算了“-First $N”并且实际上并不知道(在代码中的那一刻)我们可能只收到的情况下1.
- 设计师/开发人员认为应该是这样。
#3使它不会成为问题:
$PSProcess = @(Get-Process PowerShell | Select -First 1)
...这将保证 $PSProcces 是一个数组,无论计数是多少。
它甚至适用于:
$n = Get-Random 3
@(Get-Process -first $n) # $n => 0, 1, or 2 but always returns an array.
推荐阅读
- firebase - Firebase 安全问题
- android - Google Drive 403 '已超过未经验证使用的每日限制。继续使用需要注册'(已解决)
- google-cloud-storage - GoogleCloudStorage 重定向到另一个域
- javascript - 如何处理内部服务器错误?巢穴
- graphql - graphql 中的 Dataloader 有时会返回 null 而不是空列表
- c# - 在循环中使用协程
- typescript - 仅覆盖一些通用变量
- php - Laravel 多重查询 (PHP/MySQL)
- c++ - 在 VS2019 中使用 boost 库的问题
- python - 用新格式替换现有日期